从子小部件通知父小部件

3

我正在尝试从子孙小部件刷新父小部件。实际上,在 A 使用 B,B 使用 C 的许多小部件中间。我想在 C 小部件的某个事件上刷新 A 小部件。我进行了大量研究,但找不到确切的答案。一个代码片段将非常有帮助。谢谢。

2个回答

4

有几种解决方案:

  • A 传递一个回调函数到 BB 然后将其传递到 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);
      },
    );
  }
}

0

你为什么想要刷新?你更新了一些数据,希望显示新的数据吗?

你可以尝试使用 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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接