Я сделал приложение специально для Android телевизора, чтобы показать состояние производства 4 машин. Выглядит это так:
О приложении : Функции моего приложения: отображает данные 4 машин за каждые 10 секунд и есть запущенные цифровые часы в виджете. Я взял 10-секундный таймер, чтобы обновить значения виджетов (только разные значения для каждой машины, использующие один и тот же виджет), а также часы в моем initState
. Подробнее об этом у меня есть поток firebase в streambuilder, все вышеперечисленные данные находятся ниже этого виджета. Этот поток обновляет snapshot.data при изменении значения базы данных firebase.
Мой код :
class OmApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'kala is learning',
debugShowCheckedModeBanner: false,
theme: ThemeData.dark(),
home: MyApp(),
);
}
}
class MyApp extends StatefulWidget {
@override
State<StatefulWidget> createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
int screen = 0;
DocumentSnapshot docs;
DateTime _dateTime = DateTime.now();
Timer _timer;
String formattedDate;
@override
void initState() {
super.initState();
_updateTime();
}
@override
void dispose() {
_timer?.cancel();
super.dispose();
}
//Update time
void _updateTime() {
setState(() {
_dateTime = DateTime.now();
_timer = Timer(
Duration(seconds: 10) ,
_updateTime,
);
});
}
//Stream for screen changing in every 10 seconds : Also tried with a nested stream earlier, thought using nested stream is not a good way
//Stream<int> _stream() { //This stream was under firebase streambuilder
// Duration interval = Duration(seconds: 10);
// Stream<int> stream = Stream<int>.periodic(interval, (v) => v);
// return stream;
// }
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIOverlays([]);
var screenSize = MediaQuery.of(context).size;
return Scaffold(
body: Container(
child: Stack(
children: <Widget>[
StreamBuilder(
stream:
Firestore.instance.collection('productionrpt').snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData ||
snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: Text('Loading...'));
}
screen > 2 ? screen = 0 : ++screen;
docs = snapshot.data.documents[screen];
return prodDisplay(context, docs, screenSize.width, _dateTime);
})
],
)),
);
}
То, что я пробовал, кроме этого : Я использовал другой streambuilder
для таймера вместо initState
под потоковым построителем Firebase в качестве вложенного потока. Есть ли проблемы с памятью при использовании таймера и вложенного потока в приложении флаттера
Проблема, которую я вижу : Из-за некоторой сложности здесь, похоже, я перестраиваю целое мое приложение каждые 10 секунд. Я полагаю, что он также начинается с восстановления потока Firebase из-за таймера initState.
Требуется: Хороший способ реализовать мои функции, не затрагивая много памяти.