虽然
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



