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中给我们提 ...
随机推荐
- 前端三件套系例之JS——JavaScript基础、JavaScript基本数据类型、JavaScript函数
文章目录 1 JavaScript基础 1.JavaScript是什么 2.JavaScript介绍 2-1 ECMAScript和JavaScript的关系 2-2 ECMAScript的历史 3. ...
- Go 基础之基本数据类型
Go 基础之基本数据类型 目录 Go 基础之基本数据类型 一.整型 1.1 平台无关整型 1.1.1 基本概念 1.1.2 分类 有符号整型(int8~int64) 无符号整型(uint8~uint6 ...
- isHex
public class Test { public static boolean isHex(String str) { boolean isHexFlg = true; int i = 0; ch ...
- 维修道路(repair)
维修道路(repair) 时间限制: 1 Sec 内存限制: 128 MB 题目描述 由于在十多年前道路改建时的突出贡献, Bob 被任命为维修道路的承包商, 他可以任意 选择两条路径去修理. Bo ...
- oracle命令7 -rman命令
$ rman targer /RMAN> show all; #查看rman中所有的配置RMAN configuration parameters for database with db_un ...
- js正则表达式把页面中的p标签全部换成div
documentdocument.body.innerHTML = document.body.innerHTML.replace(/<[\/]?(p)(:?\s+(:?class|style) ...
- mysql insert的特殊用法
1. 正常的insert语句:插入一条数据如下:INSERT INTO `testdb`.`tb_user` (`id`, `userName`) VALUES (3, '张飞'); 2. inser ...
- Maven的安装与配置本地仓库,镜像源,环境变量。
参考视频: 黑马程序员2023新版JavaWeb开发教程,实现javaweb企业开发全流程 [小飞非系列]最新Maven实战教程-项目实战构建利器 一.下载Maven安装包 注意安装maven前要先安 ...
- ClickHouse(16)ClickHouse日志引擎Log详细解析
日志引擎系列 这些引擎是为了需要写入许多小数据量(少于一百万行)的表的场景而开发的. 这系列的引擎有: StripeLog Log TinyLog 共同属性 引擎: 数据存储在磁盘上. 写入时将数据追 ...
- 【译】使用 GitHub Copilot 编写 Git 提交
在花费数小时修复 bug 或更新特性之后,我们开发人员最不愿意做的事情往往是仔细说明 Git 提交的内容.最新的 Visual Studio 预览版可以帮到您.使用新的生成 Git 提交消息特性来帮助 ...