flutter中InheritedWidget共享数据
InheritedWidget
是Flutter框架中用于在Widget树中共享数据的机制。它是一个特殊的Widget,可以将其放置在Widget树的上层,并向下传递共享的数据给其子Widget。子Widget可以通过InheritedWidget
来获取共享的数据,而不需要通过显式地将数据传递给它们。
import 'package:flutter/material.dart'; class MyKey extends StatelessWidget {
const MyKey({super.key}); @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.blue, // 添加背景颜色
title: const Text("这是导航栏2"),
),
body: MyApp());
}
} class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key); @override
_MyAppState createState() => _MyAppState();
} class _MyAppState extends State<MyApp> {
// 定义数据
int counter = 0; // 定义方法,用于改变数据
void incrementCounter() {
setState(() {
counter++;
});
} @override
Widget build(BuildContext context) {
return MyInheritedWidget(
// 将数据和方法传递给 InheritedWidget
counter: counter,
incrementCounter: incrementCounter,
child: const MaterialApp(
home: Scaffold(
body: Column(
children: [
Expanded(flex: 1, child: MyAPP1()),
Expanded(flex: 1, child: MyApp2()),
],
),
),
),
);
}
} class MyInheritedWidget extends InheritedWidget {
// 定义数据和方法
final int counter;
final VoidCallback incrementCounter; MyInheritedWidget({
Key? key,
required Widget child,
required this.counter,
required this.incrementCounter,
}) : super(key: key, child: child); @override
bool updateShouldNotify(MyInheritedWidget oldWidget) {
// 如果数据发生变化,则通知子孙节点更新
return counter != oldWidget.counter;
} // 手动获取 InheritedWidget 的实例对象
static MyInheritedWidget? of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
}
} class MyAPP1 extends StatelessWidget {
const MyAPP1({Key? key}) : super(key: key); @override
Widget build(BuildContext context) {
// 使用 of 方法获取 InheritedWidget 的实例对象
final counter = MyInheritedWidget.of(context)?.counter ?? 0; return Center(
child: Container(
color: Colors.red,
height: double.infinity,
width: double.infinity,
child: Text(
"red,当前值为:$counter", // 显示数据
style: const TextStyle(color: Colors.white, fontSize: 24),
),
),
);
}
} class MyApp2 extends StatelessWidget {
const MyApp2({Key? key}) : super(key: key); @override
Widget build(BuildContext context) {
// 使用 of 方法获取 InheritedWidget 的实例对象和方法
final counter = MyInheritedWidget.of(context)?.counter ?? 0;
final incrementCounter =
MyInheritedWidget.of(context)?.incrementCounter ?? () {}; return Center(
child: Container(
color: Colors.yellow,
height: double.infinity,
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"yellow,当前值为:$counter", // 显示数据
style: const TextStyle(fontSize: 24),
),
ElevatedButton(
onPressed: incrementCounter, // 调用方法
child: const Text("按钮改变值"),
),
],
),
),
);
}
}
flutter中InheritedWidget共享数据的更多相关文章
- Laravel5.4框架中视图共享数据的方法详解
本文实例讲述了Laravel5.4框架中视图共享数据的方法.分享给大家供大家参考,具体如下: 每个人都会遇到这种情况:某些数据还在每个页面进行使用,比如用户信息,或者菜单数据,最基本的做法是在每个视图 ...
- Android开发中多进程共享数据
# 背景 最近在工作中遇到一个需求,需要在接收到推送的时候将推送获得的数据存起来,以供app启动时使用.我们会认为这不是So easy吗?只要把数据存到SharedPreferences中,然后让ap ...
- windows核心编程之进程间共享数据
有时候我们会遇到window进程间共享数据的需求,例如说我想知道系统当前有多少某个进程的实例. 我们能够在程序中定义一个全局变量.初始化为0.每当程序启动后就加1.当然我们我们能够借助第三方介质来储存 ...
- Nodejs中cluster模块的多进程共享数据问题
Nodejs中cluster模块的多进程共享数据问题 前述 nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核 ...
- 【转】asp.net中利用session对象传递、共享数据[session用法]
来自:http://blog.unvs.cn/archives/session-transfer-method.html 下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值 ...
- Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法
本例定义了4个类,这里说一下,方便下面讲解.分别是Product(产品),Producer(生产者),Consumer(消费者), Test(测试类). 多线程之间通信与共享数据只要引用同一内存区域就 ...
- asp.net中利用session对象传递、共享数据[session用法]
下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值: 首先定义将一个文本值或单独一个值赋予session,如下: session[“name”]=textbox1.text ...
- Java中的线程--线程范围内共享数据
接着学习Java中的线程,线程范围内的共享数据! 一.线程范围内的数据共享定义 对于相同的程序代码,多个模块在同一个线程中共享一份数据,而在另外线程中运行时又共享另外一份数据. 共享数据中存在的问题, ...
- laravel5.5框架中视图间如何共享数据?视图间共享数据的两种方法
laravel框架中视图间共享数据有两种,一种是用视图门面share()方法实现,另一种是用视图门面composer() 方法实现,那么,两种方法的实现究竟是怎样的呢?让我们来看一看接下来的文章内容. ...
- ThreadLocal(在一个线程中共享数据)
ThreadLocal 在"事务传递Connection"参数案例中,我们必须传递Connection对象,才可以完成整个事务操作.如果不传递参数,是否可以完成?在JDK中给我们提 ...
随机推荐
- 低代码助力微信小程序对接,提升开发效率
摘要:本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 微信小程序相信大家都用过,相较于APP,微信小程序的优势在于其便 ...
- 谱图论:Laplacian算子及其谱性质
1 Laplacian 算子 给定无向图\(G=(V, E)\),我们在上一篇博客<谱图论:Laplacian二次型和Markov转移算子>中介绍了其对应的Laplacian二次型: \[ ...
- Linux CMake编译kwindowsystem错误汇总
1.APPSTREAMCLI-NOTFOUND 安装appstream apt-get install appstream 2.FISH_EXECUTABLE 安装fish apt-get insta ...
- Java开发中的工作流程和步骤
前言 随着环境的变迁,大家总会更换工作,有裁员的,有跳槽的,除了进进出出的老人,还有源源不断入坑的新人. 很多人入职之后还不知道怎么快速适应工作,对我而言,除去寥寥可数的同事感情,对我而言,更换工作更 ...
- 一、docker的安装及docker-compose安装
一. 安装docker 1.1安装 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun # https://get.d ...
- Intellij13 IDEA常用快捷键 (mac 10.5 +),优化,使用出现的问题汇总
http://blog.csdn.net/xiaohulunb/article/details/20729261
- 快速教程|如何在 AWS EC2上使用 Walrus 部署 GitLab
Walrus 是一款基于平台工程理念的开源应用管理平台,致力于解决应用交付领域的深切痛点.借助 Walrus 将云原生的能力和最佳实践扩展到非容器化环境,并支持任意应用形态统一编排部署,降低使用基础设 ...
- STL multimap容器
multimap容器 multimap容器保存的是有序的键/值对,但是可以保存重复的元素.multimap中会出现具有相同键值的元素序列.multimap大部分成员函数的使用方式和map相同.因为重复 ...
- 手撕Vue-Router-初始化路由信息
前言 经过上一节课的学习,我们已经完成了提取我们想要的路由信息数据格式,提取完毕了之后,接下来我们该干什么,接下来需要做的步骤就是监听路由的变化,保存当前的路由. 那么就会遇到几个问题,就是怎么监听, ...
- C#/.NET/.NET Core推荐学习书籍(已分类)
前言 古人云:"书中自有黄金屋,书中自有颜如玉",说明了书籍的重要性.作为程序员,我们需要不断学习以提升自己的核心竞争力.以下是一些优秀的C#/.NET/.NET Core相关学习 ...