Что лучше, вложенные потоковые сборщики или комбинация потоковых сборщиков и initState? сложность в кодировании флаттера - PullRequest
0 голосов
/ 20 марта 2020

Я сделал приложение специально для Android телевизора, чтобы показать состояние производства 4 машин. Выглядит это так: enter image description here

О приложении : Функции моего приложения: отображает данные 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.

Требуется: Хороший способ реализовать мои функции, не затрагивая много памяти.

...