我正在尝试从子子窗口小部件刷新父窗口小部件。实际上,在A用途B和B用途C之间有许多小部件。我想在C小部件中的事件上刷新A小部件。我做了很多研究,但找不到确切答案。删除代码将非常有帮助。预先感谢
答案 0 :(得分:1)
有一些解决方案:
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,
);
}
}
NotificationListener
中的A
,并从Notification
派发C
: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);
},
);
}
}
答案 1 :(得分:0)
为什么要刷新?您更新了任何数据并希望显示新数据吗?
您可以尝试使用提供程序小部件。有了它,您可以修改任何数据并通知对数据感兴趣的所有人。
在您的设置中,您可以将提供程序放在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);
}