Есть ли проблемы с памятью при использовании таймера и вложенного потока в приложении флаттера - PullRequest
0 голосов
/ 14 марта 2020

Я использую вложенный поток и метод таймера для моего приложения. Что похоже на табло изменения значений (или экрана) каждые 10 секунд и повторите. Я понятия не имею о проблемах в моем коде (он, кажется, работает хорошо), также думаю добавить часы на моем экране, которые пока не уверены, как их реализовать (снова используя stream или с initstate) , Пожалуйста, проверьте мой основной код и дайте мне несколько советов, чтобы устранить любые проблемы, если таковые имеются. Мое приложение использует FireBase для получения последних данных.


class OmApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'OM Fortune Branch',
      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;

//Stream for screen changing in every 10 seconds
  Stream<int> _stream() {
    Duration interval = Duration(seconds: 10);
    Stream<int> stream = Stream<int>.periodic(interval, tiktok);
    return stream;
  }

  int tiktok(int value) {
    return value;
  }

  @override
  Widget build(BuildContext context) {
    SystemChrome.setEnabledSystemUIOverlays([]);
    var screenSize = MediaQuery.of(context).size;
    return Scaffold(
      body: Container(
//
          child: Stack(
        children: <Widget>[
          //Settings button: Navigate to DataFeeds page
          Align(
            alignment: Alignment.bottomRight,
            child: IconButton(
                icon: Icon(
                  Icons.settings,
                  color: Colors.white70,
                  size: 25.0,
                ),
                onPressed: () {
                  if (docs != null) {
                    navigateToList();
                  }
                  print("I can't find your data in firestore");
                }),
          ),
          StreamBuilder(
              stream:
                  Firestore.instance.collection('productionrpt').snapshots(),
              //stream: strm,
              builder: (context, snapshot) {
                if (!snapshot.hasData ||
                    snapshot.connectionState == ConnectionState.waiting)
                  return const Center(child: Text('Loading...'));
                //docs = snapshot.data;
                return StreamBuilder(
                  stream: _stream(),
                  initialData: 0,
                  builder:
                      (BuildContext buildcontext, AsyncSnapshot<int> snapss) {
                    if (snapss.connectionState == ConnectionState.waiting) {
                      screen = 0;
                    }
                    if (screen > 2)
                      screen = 0;
                    else
                      screen++;
                    docs = snapshot.data.documents[screen];
                    return prodDisplay(context, docs, screenSize.width);
                  },
                );
              })
        ],
      )),
    );
  }

  void navigateToList() {
    Navigator.push(context, MaterialPageRoute(builder: (context) {
      return DataFeeds();
    }));
  }
}


...