触发功能从小部件到状态对象

发布于 2021-01-31 15:44:52

这是该方案的简化版本:

class ParentWdiegt extends StatelessWidget{
//
//
floatinActionButton: FloatingActionButtonWidget(onPressed:()=>CustomWidgetState.someMethod(someValue))
//
//somewhere in the ParentWidget tree
child: CustomWidget() //is stateful
}

CustomWidgetState

class CustomWidgetState extends State<CustomWidget>{
//trigger this function when FAB is pressed in parent widget
someMethod(SomeValue) {//}
}

有什么方法可以someMethod在不使用FAB的情况下公开要触发的状态对象InheritedWidget

关注者
0
被浏览
158
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    虽然GlobalKey允许轻松访问任何小部件的状态;避开它。窗口小部件应 直接与其他部件进行交互。这是Flutter的核心原则之一。

    Flutter改用反应式编程。小部件之间通过提交事件进行通信。不能直接编辑所需的小部件。

    明显的好处是小部件保持独立。并且可能有数十个小部件可以使用相同的原理相互通信。

    如果要调用方法,则使用相同的原理:A
    ListenableStream在小部件之间共享。但无需使用AnimatedWidgetStreamBuilder进行收听。相反,我们将手动进行侦听(这需要更多样板)以触发自定义功能。

    这是使用的示例Stream

    import 'dart:async';
    import 'package:flutter/material.dart';
    
    class ParentWidget extends StatefulWidget {
      @override
      _ParentWidgetState createState() => _ParentWidgetState();
    }
    
    class _ParentWidgetState extends State<ParentWidget> {
      final changeNotifier = new StreamController.broadcast();
    
      @override
      void dispose() {
        changeNotifier.close();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return new Column(
          children: <Widget>[
            new AnotherWidget(
              shouldTriggerChange: changeNotifier.stream,
            ),
            new RaisedButton(
              child: new Text("data"),
              onPressed: () => changeNotifier.sink.add(null),
            )
          ],
        );
      }
    }
    
    class AnotherWidget extends StatefulWidget {
      final Stream shouldTriggerChange;
    
      AnotherWidget({@required this.shouldTriggerChange});
    
      @override
      _AnotherWidgetState createState() => _AnotherWidgetState();
    }
    
    class _AnotherWidgetState extends State<AnotherWidget> {
      StreamSubscription streamSubscription;
    
      @override
      initState() {
        super.initState();
        streamSubscription = widget.shouldTriggerChange.listen((_) => someMethod());
      }
    
      @override
      didUpdateWidget(AnotherWidget old) {
        super.didUpdateWidget(old);
        // in case the stream instance changed, subscribe to the new one
        if (widget.shouldTriggerChange != old.shouldTriggerChange) {
          streamSubscription.cancel();
          streamSubscription = widget.shouldTriggerChange.listen((_) => someMethod());
        }
      }
    
      @override
      dispose() {
        super.dispose();
        streamSubscription.cancel();
      }
    
      void someMethod() {
        print('Hello World');
      }
    
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    }
    

    在此示例中,每当对实例化由进行单击时someMethodAnotherWidget将调用of
    RaisedButton``_ParentWidgetState



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看