我正在尝试从子孙小部件刷新父小部件。实际上,在 A 使用 B,B 使用 C 的许多小部件中间。我想在 C 小部件的某个事件上刷新 A 小部件。我进行了大量研究,但找不到确切的答案。一个代码片段将非常有帮助。谢谢。
我正在尝试从子孙小部件刷新父小部件。实际上,在 A 使用 B,B 使用 C 的许多小部件中间。我想在 C 小部件的某个事件上刷新 A 小部件。我进行了大量研究,但找不到确切的答案。一个代码片段将非常有帮助。谢谢。
有几种解决方案:
A
传递一个回调函数到 B
,B
然后将其传递到 C
,在回调函数中执行 setState
操作:class A extends StatefulWidget {
@override
_AState createState() => _AState();
}
class _AState extends State<A> {
@override
Widget build(BuildContext context) {
return B(
onSomething: () => setState(() {}),
);
}
}
class B extends StatelessWidget {
final VoidCallback onSomething;
const B({Key key, this.onSomething}) : super(key: key);
@override
Widget build(BuildContext context) {
return C(onSomething: onSomething);
}
}
class C extends StatelessWidget {
final VoidCallback onSomething;
const C({Key key, this.onSomething}) : super(key: key);
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: onSomething,
);
}
}
A
中使用 NotificationListener
,并从 C
分发一个 Notification
:class MyNotification extends Notification {}
class A extends StatefulWidget {
@override
_AState createState() => _AState();
}
class _AState extends State<A> {
@override
Widget build(BuildContext context) {
return NotificationListener<MyNotification>(
onNotification: (_) {
setState(() {});
},
child: B(),
);
}
}
class C extends StatelessWidget {
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: () {
MyNotification().dispatch(context);
},
);
}
}
你为什么想要刷新?你更新了一些数据,希望显示新的数据吗?
你可以尝试使用 Provider widget。通过它,你可以修改任何数据并通知所有对该数据感兴趣的人它已经改变。
在你的设置中,你可以将 provider 放在 A widget 上,在 C widget 上获取值,更新并通知所有人。这样做时,A widget 将自动使用更新后的信息进行重建。
代码应该是这样的:
class AppState with ChangeNotifier {
AppState();
YourData _data;
void setData(YourData data) {
_data = data;
notifyListeners();
}
}
ChangeNotifierProvider.value(
value: AppState(),
child: WidgetA()
)
WidgetC() {
Provider.of<AppState>(context).setData(yourChangedDataHere);
}