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共享数据的更多相关文章

  1. Laravel5.4框架中视图共享数据的方法详解

    本文实例讲述了Laravel5.4框架中视图共享数据的方法.分享给大家供大家参考,具体如下: 每个人都会遇到这种情况:某些数据还在每个页面进行使用,比如用户信息,或者菜单数据,最基本的做法是在每个视图 ...

  2. Android开发中多进程共享数据

    # 背景 最近在工作中遇到一个需求,需要在接收到推送的时候将推送获得的数据存起来,以供app启动时使用.我们会认为这不是So easy吗?只要把数据存到SharedPreferences中,然后让ap ...

  3. windows核心编程之进程间共享数据

    有时候我们会遇到window进程间共享数据的需求,例如说我想知道系统当前有多少某个进程的实例. 我们能够在程序中定义一个全局变量.初始化为0.每当程序启动后就加1.当然我们我们能够借助第三方介质来储存 ...

  4. Nodejs中cluster模块的多进程共享数据问题

    Nodejs中cluster模块的多进程共享数据问题 前述 nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核 ...

  5. 【转】asp.net中利用session对象传递、共享数据[session用法]

    来自:http://blog.unvs.cn/archives/session-transfer-method.html 下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值 ...

  6. Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法

    本例定义了4个类,这里说一下,方便下面讲解.分别是Product(产品),Producer(生产者),Consumer(消费者), Test(测试类). 多线程之间通信与共享数据只要引用同一内存区域就 ...

  7. asp.net中利用session对象传递、共享数据[session用法]

    下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值: 首先定义将一个文本值或单独一个值赋予session,如下: session[“name”]=textbox1.text ...

  8. Java中的线程--线程范围内共享数据

    接着学习Java中的线程,线程范围内的共享数据! 一.线程范围内的数据共享定义 对于相同的程序代码,多个模块在同一个线程中共享一份数据,而在另外线程中运行时又共享另外一份数据. 共享数据中存在的问题, ...

  9. laravel5.5框架中视图间如何共享数据?视图间共享数据的两种方法

    laravel框架中视图间共享数据有两种,一种是用视图门面share()方法实现,另一种是用视图门面composer() 方法实现,那么,两种方法的实现究竟是怎样的呢?让我们来看一看接下来的文章内容. ...

  10. ThreadLocal(在一个线程中共享数据)

    ThreadLocal 在"事务传递Connection"参数案例中,我们必须传递Connection对象,才可以完成整个事务操作.如果不传递参数,是否可以完成?在JDK中给我们提 ...

随机推荐

  1. Python基础——变量、常量、数字类型、四 列表list、五 字典dict、六 布尔bool、垃圾回收机制、用户交互、运算符、流程控制

    文章目录 变量 一 引入 一.什么是变量? 二.为什么要有变量? 三.怎么使用变量(先定义.后使用) 3.1.变量的定义与使用 3.2.变量名的命名规范 3.3.变量名的命名风格 3.4.变量值的三大 ...

  2. PolygonCollider2D.OverlapPoint()在小scale下失效的一种解决办法

    偶然发现PolygonCollider2D的方法OverlapPoint()有时会失效(一直返回false),测试后发现在scale(这里指世界空间的scale,后同)很小的情况下(通常在UI Can ...

  3. MicroSIP-3.21.3+pjproject-2.13.1+ opus-1.3.1+VS2019

    本文记录了我通过VS2019编译MicroSIP-3.21.3开源项目的过程. Microsip:MicroSIP source code pjproject:Download PJSIP - Ope ...

  4. 操作PDF的方法

    PDF的内容提取.转换见上篇 PDF操作: 旋转 删除 合并 拆分 转成图片 导出内嵌资源图片 两页合并成一页 添加.去除密码 添加水印 PDF旋转某一页 var document = pdfView ...

  5. 【封装】Splay

    注意确保操作合法性,否则可能陷入死循环 以点权作为排序依据 struct Splay{ #define ls p[u].son[0] #define rs p[u].son[1] #define ma ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (149)-- 算法导论12.2 4题

    五.用go语言,证明:如果一棵二叉搜索树中的一个结点有两个孩子,那么它的后继没有左孩子,它的前驱没有右孩子. 灵捷3.5 . 文心一言: 为了证明这个性质,我们首先需要明确二叉搜索树(BST)的定义和 ...

  7. Tainted canvases may not be exported,视频帧截图跨域

    做原生相机拍照的时候遇见的有趣问题,视频流是上传到云服务器的在线链接,赋值到video的src上,然后使用canvas的drawImg方法去截取视频帧做照片,结果canvas报错视频跨域. 解决方案: ...

  8. Linux笔记02: Linux环境_2.1虚拟机软件VMware

    2.1 虚拟机软件VMware 如果直接在计算机上安装多个操作系统,同一个时刻只能运行一个操作系统,切换系统需重启计算机.VMware可以使用户在一台计算机上同时运行多个操作系统(如Windows.L ...

  9. 解决URLEncoder.encode 编码空格变 + 号

    jdk自带的URL编码工具类 URLEncoder 在对字符串进行URI编码的时候,会把空格编码为 + 号. 空格的URI编码其实是:%20 解决办法:对编码后的字符串,进行 + 号替换为 %20.总 ...

  10. Java中的并发队列

    1.队列 队列是一种数据结构.它有两个基本操作:在队列尾部加入一个元素,和从队列头部移除一个元素(注意不要弄混队列的头部和尾部)就是说,队列以一种先进先出的方式管理数据,如果你试图向一个 已经满了的阻 ...