[Flutter]Flutter原生实现StatefulWidget组件间通信的两种方式

日常开发中有多种场景需要StatefulWidget组件之间进行通信,例如,PageView页面跳转时需要处理子页面逻辑,Widget间传递数据,回调方法等等,组件间通信可以用Event Bus,Redux等库来实现。本文介绍2种Flutter原生实现StatefulWidget间组件通信的方法。

演示动画

组件通信

方法1:Global Key通信
创建一个GlobalKey final key = GlobalKey<MyStatefulWidgetOneState>();,通过 key.currentState 访问State对象的公共属性和方法。

  1. 声明一个全局的GlobalKey
final key = GlobalKey<MyStatefulWidgetOneState>();
  1. StatefulWidgetOne的构造方法传入这个key
class MyStatefulWidgetOne extends StatefulWidget {
  MyStatefulWidgetOne({ Key key }) : super(key: key);
  MyStatefulWidgetOneState createState() =>   
  MyStatefulWidgetOneState();
}
  1. MyStatefulWidgetOneState 种定义 updateMessage方法,这个方法可以作为一个回调在外部触发。
void updateMessage(String msg) {
    setState((){
      _message = msg;
    });
}
  1. MyStatefulWidgetTwoState中,通过key可以取到WidgetOneState的public属性,也能通过调用updateMessage方法来实现对MyStatefulWidgetTwoState的更改。
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Divider(),
        Text('Widget two'),
        Container(height: 20.0,),
        RaisedButton(
          child: Text("Get Current Message"),
          onPressed: () {
            setState(() {
              _objectOne = key.currentState.message;
            });
          },
        ),
        Text(_objectOne),
        RaisedButton(
          child: Text("Update Message"),
          onPressed: () {
            setState(() {
              key.currentState.updateMessage("new message");
            });
          },
        ),
      ],
    );
  }

方法2:通过ValueNotifier通信
ValueNotifier是一个包含单个值的变更通知器,当它的值改变的时候,会通知它的监听。

  1. 定义ValueNotifierData类,继承ValueNotifier
class ValueNotifierData extends ValueNotifier<String> {
  ValueNotifierData(value) : super(value);
}
  1. 定义_WidgetOne,包含一个ValueNotifierData的实例。
class _WidgetOne extends StatefulWidget {
  _WidgetOne({this.data});
  final ValueNotifierData data;
  @override
  _WidgetOneState createState() => _WidgetOneState();
}
  1. _WidgetOneState中给ValueNotifierData实例添加监听。
@override
initState() {
  super.initState();
  widget.data.addListener(_handleValueChanged);
  info = 'Initial mesage: ' + widget.data.value;
}

void _handleValueChanged() {
    setState(() {
      info = 'Message changed to: ' + widget.data.value;
    });
  }
  1. ValueNotifierCommunication组件中实例化_WidgetOne,可以通过改变ValueNotifierData实例的value来触发_WidgetOneState的更新。
@override
Widget build(BuildContext context) {
  ValueNotifierData vd = ValueNotifierData('Hello World');
  return Scaffold(
    appBar: AppBar(title: Text('Value Notifier Communication'),),
    body: _WidgetOne(data: vd),
    floatingActionButton: FloatingActionButton(child: Icon(Icons.refresh),onPressed: () {
      vd.value = 'Yes';
    }),
  );
}

源码

点击Github源码浏览下载本示例源码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,133评论 19 139
  • 背景 最近一直在考虑Flutter如何处理由原生页面处理后返回的结果,比如:startActivityForRes...
    Cosecant阅读 10,778评论 8 14
  • 本文主要介绍了Flutter布局相关的内容,对相关知识点进行了梳理,并从实际例子触发,进一步讲解该如何去进行布局。...
    Q吹个大气球Q阅读 13,380评论 6 51
  • 2009-9-11 21:20 找一个安静的地方安享晚年。 就在我们意识到自己已经不再年轻的时候,也许我们就该这样...
    陌陌红城阅读 1,796评论 0 0
  • 这是一本关于如何获得成功的书。如何设立自己和他人的目标,解释设立的目标是如何工作的,什么样的策略可以使我们获得成功...
    自我冒险家阅读 2,498评论 0 1

友情链接更多精彩内容