从子子部件通知父部件

时间:2019-08-28 11:43:20

标签: flutter flutter-layout

我正在尝试从子子窗口小部件刷新父窗口小部件。实际上,在A用途B和B用途C之间有许多小部件。我想在C小部件中的事件上刷新A小部件。我做了很多研究,但找不到确切答案。删除代码将非常有帮助。预先感谢

2 个答案:

答案 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);
}