【发布时间】:2020-01-01 15:15:00
【问题描述】:
我正在尝试从子子小部件刷新父小部件。实际上,在 A 使用 B 和 B 使用 C 之间有许多小部件。我想在 C 小部件中的事件上刷新 A 小部件。我进行了很多研究,但找不到确切的答案。剪断的代码将非常有帮助。提前致谢
【问题讨论】:
我正在尝试从子子小部件刷新父小部件。实际上,在 A 使用 B 和 B 使用 C 之间有许多小部件。我想在 C 小部件中的事件上刷新 A 小部件。我进行了很多研究,但找不到确切的答案。剪断的代码将非常有帮助。提前致谢
【问题讨论】:
有几个解决方案:
A 将执行setState 的回调传递给B,然后将其传递给C: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 小部件。有了它,您可以修改任何数据并通知所有对该数据感兴趣的人它已更改。
在您的设置中,您可以将提供程序放在 A 小部件上,在 C 小部件上您可以获得值、更新并通知所有人。这样做时,小部件将使用更新的信息自动重建。
代码是这样的:
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);
}
【讨论】: