详解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数据传递内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Kotlin图文讲解多语言支持实现方法

    Kotlin图文讲解多语言支持实现方法

    这篇文章主要介绍了Kotlin多语言支持实现方法,在Android开发中,我们如何支持多语言APP呢,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
    2023-02-02
  • Android实现仿iOS菊花加载圈动画效果

    Android实现仿iOS菊花加载圈动画效果

    iOS上有一个UIActivityIndicator的控件,就是俗称转菊花的控件,一般UI设计师会按照iOS的风格来出设计稿,也要求使用这种Loading效果,本文将具体的讲述如何实现这种效果,感兴趣的朋友可以参考下
    2021-05-05
  • Android拍照上传功能示例代码

    Android拍照上传功能示例代码

    这篇文章主要介绍了Android拍照上传功能用法,结合实例形式详细分析了Android拍照上传功能所涉及的相关知识点与功能实现技巧,需要的朋友可以参考下
    2016-08-08
  • Android SeekBar 自定义thumb旋转动画效果

    Android SeekBar 自定义thumb旋转动画效果

    某些音乐播放或者视频播放的界面上,资源还在加载时,进度条的原点(thumb)会显示一个转圈的效果。这篇文章主要介绍了Android SeekBar 自定义thumb thumb旋转动画效果,需要的朋友可以参考下
    2021-11-11
  • Android11绕过反射限制的方法

    Android11绕过反射限制的方法

    这篇文章主要介绍了Android11绕过反射限制的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Android Notification 使用方法详解

    Android Notification 使用方法详解

    这篇文章主要介绍了Android Notification 使用方法详解的相关资料,这里提供实例来帮助大家理解掌握这部分内容,需要的朋友可以参考下
    2017-08-08
  • 一起动手编写Android图片加载框架

    一起动手编写Android图片加载框架

    这篇文章主要和大家一起动手编写Android图片加载框架,从内部原理到具体实现来详细介绍如何开发一个简洁而实用的Android图片加载缓存框架,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • Android适配器Adapter与ListView和RecycleView的简单使用

    Android适配器Adapter与ListView和RecycleView的简单使用

    本文将为大家介绍Android开发中常用的适配器(Adapter)概念,以及ListView和RecycleView的简单使用方法,需要的朋友可以参考下
    2023-05-05
  • Android自定义对话框Dialog

    Android自定义对话框Dialog

    这篇文章主要为大家详细介绍了Android自定义对话框Dialog的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Android 开发线程的分析

    Android 开发线程的分析

    这篇文章主要介绍了Android 开发线程的分析的相关资料,需要的朋友可以参考下
    2017-04-04

最新评论