flutter 跨组件传递数据的三种方式

三种方式

 1. inheritedWidget
 2. notification  
 3. eventbus 

inheritedWidget方式

class InheritedWidgetScreen extends StatefulWidget {
  InheritedWidgetScreen({Key key}) : super(key: key);


  @override
  _InheritedWidgetScreenState createState() => _InheritedWidgetScreenState();
}

class _InheritedWidgetScreenState extends State<InheritedWidgetScreen> {
  int _counter = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("inheritedWidget 使用"),
      ),
      body: Center(
        child: ShareWidget( //使用ShareWidget
          data: _counter,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Padding(
                padding: const EdgeInsets.only(bottom: 20.0),
                child: Text('You have clicked the button this many time:'),
              ),
              Padding(
                padding: const EdgeInsets.only(bottom: 20.0),
                child: _TextWidget(), //子widget中依赖ShareWidget
              ),
              RaisedButton(
                child: Text('Increment'),
                onPressed: () => setState(() => ++_counter),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class ShareWidget extends InheritedWidget {

  final int data;

  ShareWidget({@required this.data, Widget child}) : super(child: child);

  //定义一个方法,方便子树中的widget获取这个widget,进而获得共享数据。
  static ShareWidget of(BuildContext context) {
    /**
     * 获取最近的给定类型的Widget,该widget必须是InheritedWidget的子类,
     * 并向该widget注册传入的context,当该widget改变时,
     * 这个context会重新构建以便从该widget获得新的值。
     * 这就是child向InheritedWidget注册的方法。
     */
    return context.inheritFromWidgetOfExactType(ShareWidget);
  }

  /**
   * framework通过使用以前占据树中的这个位置的小部件作为参数调用这个函数来区分这些情况。
   */
  @override
  bool updateShouldNotify(ShareWidget oldWidget) {
    return oldWidget.data != data;
  }
}

class _TextWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _TextWidgetState();
  }
}

class _TextWidgetState extends State<_TextWidget> {
  @override
  Widget build(BuildContext context) {
    return Text(
        ShareWidget
            .of(context)
            .data
            .toString()
    );
  }

  /**
   * 如果依赖的InheritedWidget改变了,framework将会调用这个方法来通知这个对象。
   * 在这个方法中调用BuildContext.inheritFromWidgetOfExactType是安全的。
   * 子类很少覆写这个方法,因为framework通常会在依赖的InheritedWidget改变后调用build方法,
   * 覆写这个方法通常用来做一些耗时的工作,比如网络请求
   */
  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    print("Dependencies change");
  }
}

notification 方式

	class NotificationScreen extends StatefulWidget {
	  NotificationScreen({Key key}) : super(key: key);
	
	  @override
	  _NotificationScreenState createState() => _NotificationScreenState();
	}
	
	class _NotificationScreenState extends State<NotificationScreen> {
	
	  @override
	  Widget build(BuildContext context) {
	    return Scaffold(
	        appBar: AppBar(
	          title: Text("Notification 使用"),
	        ),
	        body: NotificationListener(
	          onNotification: (notification) {
	            setState(() {
	              ToastUtil.showToast("上级接到了通知");
	            });
	            return true;
	          },
	          child: new RaisedButton(
	              textColor: Colors.black,
	              child: new Center(
	                child: new Text('点击传递随机数给上层Widget'),
	              ),
	              onPressed: () {
	                new TestNotification(count: new Random().nextInt(100))
	                    .dispatch(context);
	              }),
	        ));
	  }
	}
	
	class TestNotification extends Notification {
	  TestNotification({
	    @required this.count,
	  });
	
	  final int count;
	}

evenbus 的方式

       evenbus的方式请自行搜索

完整代码请访问

完整代码请访问GitHub

更多内容请关注公众号

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值