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