详解Flutter中数据传递的方式

 更新时间:2022年06月27日 08:36:06   作者:老李code  
这篇文章主要和大家分享一下Flutter中常用的几种数据传递方式的应用场景以及优缺点,文中的示例代码讲解详细,感兴趣的可以了解一下

在Flutter中,常见的数据传递一共有以下几种:

1、构造方法传递

Flutter的构造方法具备着dart语言的特点,参数具备可选状态,通过构造方法传递数据,可以很方便的将任意数据进行传递,平时开发中,A跳转B页面最常用的方法就是通过构造方法进行传递。比如我们最常见的Key就是通过构造一级一级向下传递的。

优点: 相邻页面之间传递数据非常方便,你不需要进行任何额外的操作。

缺点: 当页面层级过多以及类过多时,需一级一级传递,写起来非常麻烦,代码耦合性高。

2、InheritedWidget

为了解决构造函数一级一级乡下传递的的缺点,Flutter派生出了功能性组件InheritedWidget,通过它可以实现顶级widget的数据共享,也就是说无需一级一级向下传递,即可获取数据,比如A页面有一个数据,需要在C页面使用,那么就可以不经过B页面获取,前提ABC三个页面是属于一个Widget中的,常见的 TabView布局顶层数据共享,适合复杂页面顶层向下传递数据,使用也很简单。

示例代码:

/// 数据共享
class TestData extends InheritedWidget {
  final Widget child;
  final String data; // 共享数据

  // 构造
  const TestData({
    Key? key,
    required this.child,
    required this.data,
  }) : super(key: key, child: child);

/// 定义一个静态方法 获取数据
static String of(BuildContext context) {
// return context.dependOnInheritedWidgetOfExactType<TestDataestData>()?.data??"数据有误";
return (context.getElementForInheritedWidgetOfExactType<TestData>()?.widget as TestData).data ;
}
  @override
  bool updateShouldNotify(covariant TestData oldWidget) {
    return child != oldWidget.child;
  }
}

然后在A页面的根布局套上TestData,在C页面通过of方法即可获取数据。

两种更新数据方法:

dependOnInheritedWidgetOfExactType: 子组件更新didChangeDependencies();

getElementForInheritedWidgetOfExactType: 不更新。

需要注意的点: 这种传递方式是树状结构从上而下进行传递,所共享数据的页面必须在顶层的build方法中,并且没有延迟加载,比如这个页面为动态加载,那么在C页面中的initState获取数据就会报错,原因就是首次构建时,没有加载子页面导致,可在build方法中获取,或者延时获取。

优点: 自上而下,无需一级一级传递,传递方便。

缺点: 不能跨组件传递。

应用场景: 系统中比如我们常见的MediaQuery设备信息和Theme应用主题就是通过这种方式在来进行统一数据共享的。

3、Notification

Notification是FLutter中的一种通知机制,和 InheritedWidget相反,他可以自下而上通知父组件更新数据,

定义传递数据类:

class TestDataN extends Notification{
  final String data;
  TestDataN(this.data);
}

子组件通知调用dispacth方法通知父组件。

TestDataN("data").dispatch(context);

在父组件进行监听:

NotificationListener(
    onNotification: (data){
      print("data$data");
  return true;
},child: child);

应用场景: 比如我们的ListView滚动监听、就是通过Notification实现的。

4、Stream & event_bus

以上的2、3数据传递方式都是基于同一个widget树进行传递的,跨组件通信我们可以使用Stream事件流进行传递,通过订阅者模式监听数据,可以在任意组件中进行数据传递,event_bus插件就是使用这种方式来进行数据传递的。

eventBus示例代码:

// 创建公用对象
EventBus eventBus = EventBus();
// 监听数据
eventBus.on().listen((event) {

});
// 发送
eventBus.fire(event);

使用完毕在注册接收数据页面记得销毁:eventBus.destroy();

优点: 可以跨组件通信。

到此这篇关于详解Flutter中数据传递的方式的文章就介绍到这了,更多相关Flutter数据传递内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android Studio如何打包生成APK

    Android Studio如何打包生成APK

    这篇文章主要介绍了Android Studio如何打包生成APK,帮助大家更好的进行安卓开发,感兴趣的朋友可以了解下
    2020-09-09
  • Android ListView实现上拉加载下拉刷新和滑动删除功能

    Android ListView实现上拉加载下拉刷新和滑动删除功能

    这篇文章主要为大家详细介绍了Android ListView实现上拉加载下拉刷新和滑动删除功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Android自动拦截与接听功能APK黑白名单

    Android自动拦截与接听功能APK黑白名单

    大家好,本篇文章主要讲的是Android自动拦截与接听功能APK黑白名单,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2021-12-12
  • android底部菜单栏实现原理与代码

    android底部菜单栏实现原理与代码

    底部菜单栏很重要,我看了一下很多应用软件都是用了底部菜单栏做,我这里使用了tabhost做了一种通用的(就是可以像微信那样显示未读消息数量的,虽然之前也做过但是layout下的xml写的太臃肿,这里去掉了很多不必要的层,个人看起来还是不错的,所以贴出来方便以后使用
    2013-01-01
  • Android实现监听音量的变化

    Android实现监听音量的变化

    这篇文章主要为大家详细介绍了Android实现监听音量的变化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Android使用广播(BroadCast)实现强制下线的方法

    Android使用广播(BroadCast)实现强制下线的方法

    这篇文章主要介绍了Android使用广播(BroadCast)实现强制下线的方法,实例分析了Android广播BroadCast控制activity关闭的具体步骤与实现技巧,需要的朋友可以参考下
    2016-01-01
  • 浅析android studio3.5中使用recycleview的包

    浅析android studio3.5中使用recycleview的包

    这篇文章主要介绍了android studio3.5中使用recycleview的包,本文虽然内容不长,但是给出了思路,需要的朋友可以参考下
    2019-11-11
  • Android进阶之使用时间戳计算时间差

    Android进阶之使用时间戳计算时间差

    这篇文章主要为大家详细介绍了Android进阶之使用时间戳计算时间差,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Android Hilt Retrofit Paging3使用实例

    Android Hilt Retrofit Paging3使用实例

    这篇文章主要介绍了Android Hilt依赖注入的使用,首先,某个类的成员变量称为依赖,如若此变量想要实例化引用其类的方法,可以通过构造函数传参或者通过某个方法获取对象,此等通过外部方法获取对象实例的称为依赖注入
    2023-01-01
  • Android语音识别技术详解及实例代码

    Android语音识别技术详解及实例代码

    这篇文章主要介绍了Android语音识别技术的相关资料,并附实例代码及实例实现效果图,需要的朋友可以参考下
    2016-09-09

最新评论