Flutter Streambuilders перестраивает без необходимости - PullRequest
1 голос
/ 01 августа 2020

В моем приложении есть два экрана, на которых я показываю данные из firestore, используя streambuilders, а также Navigator.push() для перемещения между экранами. Когда streambuilders извлекает данные, он перестраивает своих потомков и показывает данные. Все работает нормально до этого момента, но когда я перехожу на второй экран, streambuilder на первом экране снова строится.

Поправьте меня, если я ошибаюсь (если streambuilder снова перестраивается, это означает, что он создает новый поток и снова извлекает данные из firestore каждый раз, когда я перемещаюсь между экранами).

Если при восстановлении данные не загружаются снова из firestore, тогда нет проблем, но если это произойдет, то как решить эту проблему?

код для FirstScreen

class FirstScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    print('FirstScreen');

    return Scaffold( 
      body: Center(
        child: InkWell(
          onTap: () => Navigator.push(context, MaterialPageRoute(builder: (_) => SecondScreen())),

          child: Container(
            child: StreamBuilder(
              stream: Firestore.instance.collection('items').snapshots(),
              builder: (context,snap){

                print('FirstScreen : ${snap.connectionState}');

                if(snap.hasData)
                return Text(snap.data.documents[0]['name']);

                else return CircularProgressIndicator();
              },
            ),
          ),
        ),
      ),
    );
  }
}

код для второго экрана

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    print('SecondScreen');
    
    return Scaffold( 
      body: Center(
        child: Container(
          child: StreamBuilder(
            stream: Firestore.instance.collection('products').snapshots(),
            builder: (context,snap){

              print('SecondScreen : ${snap.connectionState}');

              if(snap.hasData)
              return Text(snap.data.documents[0]['name']);

              else return CircularProgressIndicator();
            },
          ),
        ),
      ),
    );
  }

при загрузке FirstScreen

I/flutter ( 6416): FirstScreen build
I/flutter ( 6416): FirstScreen : ConnectionState.waiting
I/flutter ( 6416): FirstScreen : ConnectionState.active

при перемещении на SecondScreen

I/flutter ( 6416): FirstScreen build
I/flutter ( 6416): FirstScreen : ConnectionState.waiting
I/flutter ( 6416): FirstScreen : ConnectionState.active
I/flutter ( 6416): SecondScreen build
I/flutter ( 6416): SecondScreen : ConnectionState.waiting
I/flutter ( 6416): SecondScreen : ConnectionState.active
I/flutter ( 6416): FirstScreen build
I/flutter ( 6416): FirstScreen : ConnectionState.waiting
I/flutter ( 6416): FirstScreen : ConnectionState.active
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...