触发功能从小部件到状态对象
这是该方案的简化版本:
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
?
-
虽然
GlobalKey
允许轻松访问任何小部件的状态;避开它。窗口小部件应 不 直接与其他部件进行交互。这是Flutter的核心原则之一。Flutter改用反应式编程。小部件之间通过提交事件进行通信。不能直接编辑所需的小部件。
明显的好处是小部件保持独立。并且可能有数十个小部件可以使用相同的原理相互通信。
如果要调用方法,则使用相同的原理:A
Listenable
或Stream
在小部件之间共享。但无需使用AnimatedWidget
或StreamBuilder
进行收听。相反,我们将手动进行侦听(这需要更多样板)以触发自定义功能。这是使用的示例
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(); } }
在此示例中,每当对实例化由进行单击时
someMethod
,AnotherWidget
将调用of
。RaisedButton``_ParentWidgetState