当父窗口小部件执行setState()时,如何防止子窗口小部件重新绘制



我在树的许多stateFull小部件中都有一个ListView,我无法与所有父小部件分离。Listviewstreambuilder(firebase(构建。从stateFull小部件的大层次结构中,其中一些小部件随时执行setState小部件,然后子ListView也会重新绘制,它将再次从firebase及其闪烁(闪烁(的中获取数据

解释以下示例

StatefullWidget(
child:StatefullWidget(
child:StatefullWidget(
child:ListView()
),
),
);

Listview((有三个父小部件,用于在父小部件中多次调用的用户友好应用程序setState。

所以我想避免listView((的闪烁和重绘,即使父窗口小部件重绘(setState(((

https://pub.dev/documentation/provider/latest/provider/Selector-class.html

提供程序的"选择器"就是您找到的内容。

但通常优化性能就足够了。ListView.builder、constWidget、key等。,https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html#performance-注意事项

您应该使用其中一种状态管理方法。

例如,使用getx包,您可以使小部件成为无状态的,并使用getx小部件进行任何更新数据。

这是默认flutter应用程序的getx用法示例。

class Home extends StatelessWidget {
final controller = Get.put(Controller());
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("counter")),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GetBuilder<Controller>(
builder: (_) => Text(
'clicks: ${controller.count}',
)),
ElevatedButton(
child: Text('Next Route'),
onPressed: () {
Get.to(Second());
},
),
],
),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: controller.increment(),  
),
);
}
}
class Second extends StatelessWidget {
final Controller ctrl = Get.find();
@override
Widget build(context){
return Scaffold(body: Center(child: Text("${ctrl.count}")));
}
}

最新更新