Flutter InheritedWidget、provider数据共享

2023-10-12 15:50

本文主要是介绍Flutter InheritedWidget、provider数据共享,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.继承InheritedWidget定义需要共享的数据


class ShareDateWidget extends InheritedWidget {final String data;//需要共享的数据const ShareDateWidget({Key? key, required Widget child, required this.data}): super(key: key, child: child);//获取当前共享的数据,方便使用者访问static ShareDateWidget? of(BuildContext context) =>context.dependOnInheritedWidgetOfExactType<ShareDateWidget>();@overridebool updateShouldNotify(covariant ShareDateWidget oldWidget) =>//判断改变的数据和原来的数据是否是相同的,如果不相同则返回true通知子树中依赖data的Widget重新build//返回true就会重新build否则不会//同时如果返回false使用者的didChangeDependencies方法也不会被调用oldWidget.data != data;
}

2.定义两个使用者


class _TestWidget extends StatefulWidget {@overrideState<StatefulWidget> createState() => _TestWidgetState();
}
class _TestWidgetState extends State<_TestWidget> {@overrideWidget build(BuildContext context) =>Text('Widget Top:${ShareDateWidget.of(context)?.data ?? ""}');@overridevoid didChangeDependencies() {super.didChangeDependencies();if (kDebugMode) {print("Dependencies change");}}
}

class _Test2Widget extends StatefulWidget {@overrideState<StatefulWidget> createState() => _Test2WidgetState();
}class _Test2WidgetState extends State<_Test2Widget> {@overrideWidget build(BuildContext context) =>Text('Widget Bottom:${ShareDateWidget.of(context)?.data ?? ""}');@overridevoid didChangeDependencies() {super.didChangeDependencies();if (kDebugMode) {print("Dependencies change");}}
}

如果使用者共享使用的InheritedWidget的数据就会回调使用者didChangeDependencies方法

3.实现一个按钮点击改变ShareDateWidget的共享数据


class _TestPage extends StatefulWidget {@overrideState<StatefulWidget> createState() => _TestPageState();
}class _TestPageState extends State<_TestPage> {String text = "text ";@overrideWidget build(BuildContext context) => MaterialApp(home: Scaffold(body: ShareDateWidget(data: text,child: Container(alignment: Alignment.center,child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [_TestWidget(),ElevatedButton(onPressed: () {setState(() {text = '当前时间:${DateTime.now()}';});},child: const Text('改变数据')),_Test2Widget(),],),),),),);
}

最后出来的效果就是只要点击按钮就会改变ShareDateWidgetdata数据:
最后出来的效果就是只要点击按钮就会改变ShareDateWidget的data数据

按照InheritedWidget的逻辑官方还提供了一个provider

1.创建数据共享模板:

引入插件pubspec.yaml

dependencies:provider: ^6.0.2

数据共享模板

class HomeMode extends ChangeNotifier {String homeData = "正在获取...";void getHomeData() {//通过接口获取数据callGET(ServiceUrl.home, result: (result) {//获取数据正常,发送通过更新数据homeData = result.toString();notifyListeners();}, resultErr: (error, stark) {homeData = error.toString();notifyListeners();});}
}

2.使用数据

使用数据最外层用ChangeNotifierProvider包裹

class HomeNewPage extends StatelessWidget {const HomeNewPage({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) => ChangeNotifierProvider(create: (context) => HomeMode(),child: const HomeNewWidget(),);
}

订阅数据


class HomeNewWidget extends StatefulWidget {const HomeNewWidget({Key? key}) : super(key: key);@overrideState<StatefulWidget> createState() => HomeState();
}class HomeState extends State<HomeNewWidget> {@overridevoid initState() {super.initState();//请求获取数据context.read<HomeMode>().getHomeData();}@overrideWidget build(BuildContext context) => Scaffold(body: Container(alignment: Alignment.center,child: Text(context.watch<HomeMode>().homeData),),);
}

这篇关于Flutter InheritedWidget、provider数据共享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/196884

相关文章

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

Flutter Button使用

Material 组件库中有多种按钮组件如ElevatedButton、TextButton、OutlineButton等,它们的父类是于ButtonStyleButton。         基本的按钮特点:         1.按下时都会有“水波文动画”。         2.onPressed属性设置点击回调,如果不提供该回调则按钮会处于禁用状态,禁用状态不响应用户点击。

flutter开发实战-flutter build web微信无法识别二维码及小程序码问题

flutter开发实战-flutter build web微信无法识别二维码及小程序码问题 GitHub Pages是一个直接从GitHub存储库托管的静态站点服务,‌它允许用户通过简单的配置,‌将个人的代码项目转化为一个可以在线访问的网站。‌这里使用flutter build web来构建web发布到GitHub Pages。 最近通过flutter build web,通过发布到GitHu

Flutter 中的低功耗蓝牙概述

随着智能设备数量的增加,控制这些设备的需求也在增加。对于多种使用情况,期望设备在需要进行控制的同时连接到互联网会受到很大限制,因此是不可行的。在这些情况下,使用低功耗蓝牙(也称为 Bluetooth LE 或 BLE)似乎是最佳选择,因为它功耗低,在我们的手机中无处不在,而且无需连接到更广泛的网络。因此,蓝牙应用程序的需求也在不断增长。 通过阅读本文,您将了解如何开始在 Flutter 中开

flutter开发多端平台应用的探索 下 (跨模块、跨语言通信之平台通道)

前文 Flutter 是一个跨平台的开发框架,它允许开发者使用相同的代码库来构建 iOS、Android、Web 和桌面应用程序。 上文flutter开发多端平台应用的探索 上(基本操作)-CSDN博客列举了一些特定平台的case(桌面端菜单,鼠标快捷键)的使用方法,有些是flutter提供了对应能力,只需要学习如何调API,有些事三方库支持,本文要探讨的平台通道是更为强大的工具,很多三方插件