【问题标题】:Notify parent widget from sub children widgets从子子小部件通知父小部件
【发布时间】:2020-01-01 15:15:00
【问题描述】:

我正在尝试从子子小部件刷新父小部件。实际上,在 A 使用 B 和 B 使用 C 之间有许多小部件。我想在 C 小部件中的事件上刷新 A 小部件。我进行了很多研究,但找不到确切的答案。剪断的代码将非常有帮助。提前致谢

【问题讨论】:

    标签: flutter flutter-layout


    【解决方案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,
        );
      }
    }
    
    • 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);
          },
        );
      }
    }
    

    【讨论】:

      【解决方案2】:

      为什么要刷新?您更新了任何数据并希望显示新数据?

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

      【讨论】:

        猜你喜欢
        • 2019-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-22
        • 1970-01-01
        • 1970-01-01
        • 2019-09-14
        • 1970-01-01
        相关资源
        最近更新 更多