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. Flask框架——Flask脚本、flask知识点补充

    文章目录 Flask_脚本 1 集成Python shell 1.1 flask-script的用法: 1.1.1 实例:flask-script的简单实现 1.1.1命令添加方式: 第一种(无参命令 ...

  2. How to Install Bugzilla on Ubuntu 20.04

    In this blog post, we are going to explain in step-by-step detail on how to install Bugzilla on Ubun ...

  3. oauth2单点登录集成

    单点登陆 概念: 单点登录其实就是在多个系统之间建立链接, 打通登录系统, 让同一个账号在多个系统中通用 举个例子: 登录Gmail的时候可以用账号密码登录, 也可以用google账号登录, 而使用g ...

  4. BI 数据可视化平台建设(1)—交叉表组件演变实战

    作者:vivo 互联网大数据团队 - Zhu Jianchen 本文是vivo互联网大数据团队<BI数据可视化平台建设>系列文章第1篇 - 交叉表组件. 交叉表在数据分析里应用广泛,通过本 ...

  5. Net 高级调试之七:线程操作相关命令介绍

    一.简介 今天是<Net 高级调试>的第六篇文章.上一篇文章我们说了值类型,引用类型,数组等的内存表现形式.有了这个基础,我们可以更好的了解我们的程序在运行时的状态,内存里有什么东西,它们 ...

  6. webgoat _v8.1全流程通关

    1.1 (A1)SQL Injection (intro) 概念 本课程介绍了什么是结构化查询语言(SQL),以及如何操纵它以执行开发人员原始意图之外的任务. 目标 用户将对SQL的工作原理和用途有基 ...

  7. CoreFX中Dictionary<TKey, TValue>的源码解读

    无论是实际的项目中,还是在我们学习的过程中,都会重点的应用到Dictionary<TKey, TValue>这个存储类型.每次对Dictionary<TKey, TValue> ...

  8. 基于Python下MySQL数据库驱动

    由于MySQL服务器以独立的进程运行,并通过网络对外服务,所以,需要支持Python的MySQL驱动来连接到MySQL服务器. 1.mysql-connector-python ​ mysql-con ...

  9. js 通过id、pid遍历集合获得树结构

    原数据 let adreeJson = [ {id: 1, name: '陕西省', pid: 0}, {id: 2, name: '山西省', pid: 0}, {id: 3, name: '广东省 ...

  10. 有什么巨好用Excel数据分析技巧?

    当涉及Excel数据分析时,以下是一些非常实用的技巧和功能,供您参考.这里将为您提供关于数据整理.数据清洗.统计分析.可视化和高级分析等方面的技巧. 一.数据整理与清洗: 导入数据:使用 Excel ...