我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Flutter怎么对数据进行传递

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用Flutter怎么对数据进行传递

这期内容当中小编将会给大家带来有关使用Flutter怎么对数据进行传递,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Flutter 中的数据传递

在开发中,数据从一个页面传递到另一个页面事很常用的,在Android 开发中,通常是通过把数据放到 intent 中传递过去。在 Flutter 中,数据是如何传递的呢?

在Flutter 中一切都是Widget,所以数据的传递就成了数据才Widget 中的传递。在之前的学习中,数据从一个Widget 传递到 子 Widget 是通过构造函数,一层一层的往里面传,要是 widget 的层级比较少,还没什么问题,要是层级很多,这样传递就太麻烦了。

还好Flutter 还提供了三种方案:InheritedWidget、Notification 和 EventBus来解决数据传递问题。

InheritedWidget

InheritedWidget 是 Flutter 中的一个功能型 Widget,适用于在 Widget 树中共享数据的场景。通过它,我们可以高效地将数据在 Widget 树中进行跨层传递。

下面看计数器的例子:

// 1.InheritedWidget,我们定义了一个继承自它的新类 CountContainer,里面存放需要共享的数据//然后,我们将计数器状态 count 属性放到 CountContainer 中,并提供了一个 of 方法方便其子 Widget 在 Widget 树中找到它。//最后,我们重写了 updateShouldNotify 方法,这个方法会在 Flutter 判断 InheritedWidget 是否需要重建,class CountContainer extends InheritedWidget { static CountContainer of(BuildContext context) =>   context.dependOnInheritedWidgetOfExactType<CountContainer>(); final _InheritedWidgetHomeState mode; final Function() function; CountContainer(   {Key key,   @required this.mode,   @required this.function,   @required Widget child})   : super(key: key, child: child); @override bool updateShouldNotify(covariant InheritedWidget oldWidget) {  return this != oldWidget; }}// 2. 通过构建方法,把数据放到 InheritedWidget中class _InheritedWidgetHomeState<InheritedWidgetHome> extends State { int count = 0; void _incrementCounter() => setState(() {  count++; }); @override Widget build(BuildContext context) {  return CountContainer(   mode: this,   function: _incrementCounter,   child: CountWidget(),  ); }}// 3. 在子 widget 通过 CountContainer.of方法,获取到自定义的 InheritedWidget,并从中取得共享的数据class CountWidget extends StatelessWidget { @override Widget build(BuildContext context) {  CountContainer state = CountContainer.of(context);  return Scaffold(   appBar: AppBar(    title: Text("InheritedWidget demo"),   ),   body: Text("current count is ${state.mode.count}"),   floatingActionButton: FloatingActionButton(    child: Icon(Icons.add),    onPressed: state.function,   ),  ); }}

可以看到,InheritedWidget 的数据流动方式是从父 Widget 到子 Widget 逐层传递。

  1. 首先把通过构造函数需要共享的数据放到 InheritedWidget 中,然后提供一个静态方法,返回自身;

  2. 然后在把自定义的 InheritedWidget做为父容器,传入需要共享的数据;

  3. 最后在子widget 中,通过静态方法获取到 InheritedWidget 对象,自然就拿到里面的数据了。

EventBus

无论是 InheritedWidget 还是 Notificaiton,它们的使用场景都需要依靠 Widget 树,在使用起来就有点极限了,但Flutter 提供了一个更好的数据传递方法--EventBus,传递数据不再受到限制了。

在原生开发中,也有使用过 事件总线EventBus,Flutter 中实现跨组件通信的机制也是一样。它遵循发布 / 订阅模式,允许订阅者订阅事件,当发布者触发事件时,订阅者和发布者之间可以通过事件进行交互。发布者和订阅者之间无需有父子关系,甚至非 Widget 对象也可以发布 / 订阅。这些特点与其他平台的事件总线机制是类似的。

由于 EventBus是第三方库,所以需要引入:

event_bus: 2.0.0

从第二个页面,把数据回传到第一个页面

//建立公共的event busEventBus eventBus = EventBus();class CustomEvent { String msg; CustomEvent(this.msg);}class _EventBusPager1State extends State { String message = "原来的数据"; StreamSubscription subscription; @override void initState() {  subscription = eventBus.on<CustomEvent>().listen((event) {   setState(() {    message = event.msg;   });  });  super.initState(); } @override Widget build(BuildContext context) {  return Scaffold(   appBar: AppBar(    title: Text("EventBusPager1"),   ),   body: Center(    child: Text(message),   ),   floatingActionButton: FloatingActionButton(    child: Icon(Icons.open_in_browser),    onPressed: () => Navigator.push(      context, MaterialPageRoute(builder: (context) => EventBusPager2())),   ),  ); } @override void dispose() {  subscription.cancel();  super.dispose(); }}class EventBusPager2 extends StatelessWidget { @override Widget build(BuildContext context) {  return Scaffold(   appBar: AppBar(    title: Text("EventBusPager2"),   ),   body: Center(    child: Text("EventBusPager1"),   ),   floatingActionButton: FloatingActionButton(    child: Icon(Icons.send),    onPressed: () {     eventBus.fire(CustomEvent("data from page 2"));     Navigator.pop(context);    },   ),  ); }}

上述就是小编为大家分享的使用Flutter怎么对数据进行传递了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Flutter怎么对数据进行传递

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Flutter怎么对数据进行传递

这期内容当中小编将会给大家带来有关使用Flutter怎么对数据进行传递,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Flutter 中的数据传递在开发中,数据从一个页面传递到另一个页面事很常用的,在And
2023-06-14

Java中怎么对参数进行传递

本篇文章给大家分享的是有关Java中怎么对参数进行传递,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样
2023-05-31

使用Flutter怎么对JSON进行解析

本篇文章为大家展示了使用Flutter怎么对JSON进行解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Dart实体类格式class CategoryMo { String name; int c
2023-06-14

如何使用Vue进行数据传递(方法浅析)

Vue是一个流行的JavaScript框架,它可以帮助我们构建高效的用户界面。在Vue中,有多种方法可以进行数据传递,这些方法可以应用于单个组件或整个Vue实例。本文将介绍如何使用Vue进行数据传递。PropsProps是Vue提供的一种属性绑定机制,它可以将数据从父组件传递到子组件。在父组件中,我们可以使用v-bind指令将数据绑定到子组件的Props属性,如下所示:```<
2023-05-14

如何使用java搭建ftp/sftp进行数据传递

这篇文章将为大家详细讲解有关如何使用java搭建ftp/sftp进行数据传递,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。ftp/sftp概念及搭建ftp是一种文件传输协议,让客户端和服务端能够互相传递文
2023-06-20

怎么使用Intent传递对象

这篇文章主要介绍“怎么使用Intent传递对象”,在日常操作中,相信很多人在怎么使用Intent传递对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Intent传递对象”的疑惑有所帮助!接下来,请跟
2023-06-04

使用spring MVC怎么传递对象参数

本篇文章为大家展示了使用spring MVC怎么传递对象参数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。采用@ModelAttribute注解的方式,接收方式如下:@RequestMapping(
2023-05-31

怎么使用POST方法传递数据

本篇内容介绍了“怎么使用POST方法传递数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用POST方法传递数据使用POST方法向服务器传
2023-06-08

Android怎么使用socket进行二进制流数据传输

本篇内容主要讲解“Android怎么使用socket进行二进制流数据传输”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android怎么使用socket进行二进制流数据传输”吧!简单的自定义协议
2023-07-06

在Android系统中使用gzip进行数据传递实例代码

接下来,让我解说一下如何在Android系统中使用gzip进行数据传递 HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来减少文件大小,减少文件大小有两个明显的好处,一是可以减少
2022-06-06

使用phonegap怎么对数据库进行操作

使用phonegap怎么对数据库进行操作?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实例如下:
2023-06-09

使用springmvc怎么对模型数据进行处理

使用springmvc怎么对模型数据进行处理?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。springmvc提供了四种方式来输出模型数据ModelAndView
2023-06-06

Android中怎么使用Activity和Fragment传递数据

Android中怎么使用Activity和Fragment传递数据,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、第一种方式,也是最常用的方式,就是使用Bundle来传递参数
2023-05-30

使用gorm怎么对MySql数据库进行操作

本篇文章给大家分享的是有关使用gorm怎么对MySql数据库进行操作,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、表中字段区分大小写的设置在使用gorm查询的时候,会出现账
2023-06-07

使用python怎么对表格数据进行处理

这篇文章给大家介绍使用python怎么对表格数据进行处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python对Excel表格的处理首先我们看一个最简单的情况,我们先不考虑性能的问题,那么我们可以使用xlrd这个工
2023-06-14

使用SpringMVC怎么实现对数据进行校验

使用SpringMVC怎么实现对数据进行校验?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、导入jar包若要实现数据校验功能,需要导入必要的jar包,主要包括以下几个:c
2023-05-31

怎么用python对数据进行降噪

在Python中,可以使用不同的方法对数据进行降噪。以下是一些常见的降噪方法:均值滤波:通过计算窗口内像素的平均值来去除噪声。可以使用OpenCV库中的blur函数来实现。import cv2image = cv2.imread('
怎么用python对数据进行降噪
2024-02-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录