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读取数据,或者只是显示它先前获取的数据?您可能想阅读此内容