Flutter 不必要的重建

Flutter 不必要的重建,flutter,google-cloud-firestore,stream-builder,Flutter,Google Cloud Firestore,Stream Builder,在我的应用程序中,我有两个屏幕,使用streambuilders和Navigator.push()。当streambuilders获取数据时,它会重建其子体并显示数据。在此之前,一切正常,但当我移动到第二个屏幕时,第一个屏幕上的streambuilder会再次重建 如果我错了,请纠正我 (如果streambuilder再次重建,则意味着每次我在屏幕之间移动时,它都会创建一个新的流并再次从firestore获取数据) 如果重建时数据没有再次从firestore中删除,则没有问题,但如果确实存在,则

在我的应用程序中,我有两个屏幕,使用
streambuilders
Navigator.push()。当streambuilders获取数据时,它会重建其子体并显示数据。在此之前,一切正常,但当我移动到第二个屏幕时,第一个屏幕上的streambuilder会再次重建

如果我错了,请纠正我 (如果streambuilder再次重建,则意味着每次我在屏幕之间移动时,它都会创建一个新的流并再次从firestore获取数据)

如果重建时数据没有再次从firestore中删除,则没有问题,但如果确实存在,则如何解决此问题

第一屏代码

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();
            },
          ),
        ),
      ),
    );
  }
当第一屏加载时

I/flutter ( 6416): FirstScreen build
I/flutter ( 6416): FirstScreen : ConnectionState.waiting
I/flutter ( 6416): FirstScreen : ConnectionState.active
当移到第二屏幕时

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

你可以订阅
,也就是说,你可以在数据可用时获取数据。我怀疑是否可以从
对象请求新数据。在生成器中,如果(snap.data.documentChanges.length!=0)打印(“新数据可用”),则添加此代码
。通过这种方式,您将知道
小部件
是何时使用firestore中的新数据构建的。但我在这里关心的是,为什么当我移动到另一个页面时,流生成器正在重建,流生成器是否再次从firestore读取了数据,或者只是显示了它先前获取的数据?您可能想要读取此文件,您可以订阅
,即当数据可用时获取数据。我怀疑是否可以从
对象请求新数据。在生成器中,如果(snap.data.documentChanges.length!=0)打印(“新数据可用”),则添加此代码
。通过这种方式,您将知道
小部件
是何时使用firestore中的新数据构建的。但我在这里关心的是,为什么当我移动到另一个页面时,流生成器正在重建,流生成器是否再次从firestore读取数据,或者只是显示它先前获取的数据?您可能想阅读此内容