InheritedWidget就满足了我们这一需求。 使用方法 我们创建一个继承InheritedWidget的Widget。...数据获取方法 static MyInheritedWidget getData(BuildContext context) { return context.inheritFromWidgetOfExactType...(MyInheritedWidget); } 我们看一下inheritFromWidgetOfExactType方法的源码: /// Obtains the nearest widget of...InheritedWidget inheritFromWidgetOfExactType(Type targetType, { Object aspect }); 注释说得很清楚,inheritFromWidgetOfExactType...It is safe to /// call [BuildContext.inheritFromWidgetOfExactType] from this method. /// /// Subclasses
# 使用InheritedWidget传递数据 除了StatefulWidget、StatelessWidget之外flutter还提供了另外一个用的Widget组件即InheritedWidget。...InheritedWidget是为了向后代传递数据,如果InheritedWidget发生了嵌套呢?...(MyInheriteWidget) .widget; return (widget as MyInheriteWidget).model; } 要搞清楚inheritFromWidgetOfExactType...@override InheritedWidget inheritFromWidgetOfExactType(Type targetType, { Object aspect }) {...被调用的前提是这个后代是一个StatefulWidget,且是通过inheritFromWidgetOfExactType方法来获取先辈的数据。
所以当我们通过 context 调用 inheritFromWidgetOfExactType 时,就可以通过这个 Map 往上查找,从而找到这个上级的 InheritedWidget 。...我们直接找到 Element 中的 inheritFromWidgetOfExactType 方法实现,如下关键代码所示: 首先从 _inheritedWidgets 中查找是否有该类型的 InheritedElement...@override InheritedWidget inheritFromWidgetOfExactType(Type targetType, { Object aspect }) { //...一般需要 BuildContext ,如Theme.of(context) ,而 BuildContext 的实现就是 Element ,所以当我们调用 context.inheritFromWidgetOfExactType...2、InheritedProvider 状态共享肯定需要 InheritedWidget ,InheritedProvider 就是InheritedWidget 的子类,所有的 Provider 实现都在
InheritedWidget & ValueNotifier InheritedWidget 这个既熟悉又陌生类可以帮助我们在Flutter中沿着树向下传递信息。...image.png 获取 最后就是最上面看到的那段代码,通过context.inheritFromWidgetOfExactType来获取。...继承InheritedWidget //1. 模仿MediaQuery。...通过InheritedWidget来保存状态 通过context.inheritFromWidgetOfExactType来获取属性 使用ValueNotifer来实现属性监听。...InheritedWidget 可以持有一个状态,共它的子树来获取。
InheritedWidget & ValueNotifier InheritedWidget 这个既熟悉又陌生类可以帮助我们在Flutter中沿着树向下传递信息。...= null); final MediaQuery query = context.inheritFromWidgetOfExactType(MediaQuery); if (query...继承InheritedWidget //1. 模仿MediaQuery。...通过InheritedWidget来保存状态 通过context.inheritFromWidgetOfExactType来获取属性 使用ValueNotifer来实现属性监听。...InheritedWidget 可以持有一个状态,共它的子树来获取。
从上往下 数据从根往下传数据,常规做法是一层层往下,当深度变大,数据的传输变的困难,flutter提供InheritedWidget用于子节点向祖先节点获取数据的机制,如下例子: class FrogColor...extends InheritedWidget { const FrogColor({Key key, @required this.color, @required Widget child})...child: child); final Color color; static FrogColor of(BuildContext context) { return context.inheritFromWidgetOfExactType...'Data Flow', style: TextStyle(color: FrogColor.of(context).color), ); } } context.inheritFromWidgetOfExactType...系统中有不少Widget就是这样的,比如MediaQuery,可以看下其定义,如下: class MediaQuery extends InheritedWidget{ final MediaQueryData
本文将首先介绍InheritedWidget的实现方式。...这里,将使用InheritedWidget作为全局状态的管理者,那么将InheritedWidget作为根Widget可以实现下面的Widget都可以获取到该Widget持有的状态。...super(key: key, child: child); static LoginStateWidget of(BuildContext context) { return context.inheritFromWidgetOfExactType...多个InheritedWidget,每个InheritedWidget管理一个状态类,这个时候需要嵌套InheritedWidget,如果每个状态之间还有依赖的话,还需要考虑InheritedWidget...原理 关于InheritedWidget的实现原理,可以参考从 Flutter 源码看 InheritedWidget 内部实现原理 总结 可以发现InheritedWidget的使用,可以看做是在全局创建
InheritedWidget InheritedWidget 是 Flutter 中的一个功能型 Widget,在构建Widget的同时可以在Widget层中向下传递,适用于在 Widget 树中共享数据的场景...context) => context.inheritFromWidgetOfExactType(CountContainer) as CountContainer; final MyInheritedModel...但是如果想要修改InheritedWidget中的值,通常情况下我们还是需要用到State。...{ static CountContainer of(BuildContext context) => context.inheritFromWidgetOfExactType(CountContainer...= oldWidget.model; } 可以看到,我们把model改为State,使InheritedWidget持有State这样我们就可以通过InheritedWidget在任意的地方调用State
context.inheritFromWidgetOfExactType(type) : context.ancestorWidgetOfExactType(type); if...context.inheritFromWidgetOfExactType(type) : context.ancestorWidgetOfExactType(type); if (widget...这里解释一下这两个方法: inheritFromWidgetOfExactType 是用来获取给定类型的最近的 widget,并且在值更新的时候自动重新构建。..._InheritedModel 在上面的build 和 of 方法中,都出现了该 Model, 他其实就是一个 InheritedWidget,重写了 updateShouldNotify方法来控制重绘...代码如下: class _InheritedModel extends InheritedWidget { final T model; final int version
二、InheritedWidget InheritedWidget 是一个抽象类,在 Flutter 中扮演者十分重要的角色,或者你并未直接使用过它,但是你肯定使用过和它相关的封装。 ?...,所以通过 MaterialApp 作为入口,其实就是嵌套在 InheritedWidget 下。...如上图所示,通过 Theme.of(context) 获取到的主题数据,其实是通过 context.inheritFromWidgetOfExactType(_InheritedTheme) 去获取的,...而 Element 中实现了 BuildContext 的 inheritFromWidgetOfExactType 方法,如下所示: ?...三、内存 最近闲鱼技术发布了 《Flutter之禅 内存优化篇》 ,文中对于 Flutter 的内存做了深度的探索,其中有一个很有趣的发现是: Flutter 中 ImageCache 缓存的是 ImageStream
对于 Ephemeral State, 可以用 StatefulWidget 进行状态管理。...对于 App State, 有以下几种方式可以考虑状态传递与刷新: InheritedWidget: Flutter 提供的功能性组件,用来与子孙节点共享数据 Event Bus:一个全局的单例,相当于是借助全局的静态变量...3. provider 尽管 InheritedWidget 已经提供了一套数据共享的方案,但是显然它所带来的模板代码太多了,需要写很多重复的代码,比如覆写注册依赖和通知函数,对于复杂一点的应用,需要一套更加方便的数据管理方案...3.4 封装通用的页面容器 在 业务场景中,绝大多数页面都是需要通过 api 请求获取数据,根据返回结果页面显示:加载中、正常页面、空状态、网络错误、其他错误这么几种情况。...因此,可以抽象把这个过程抽离出一个通用的容器,注意的是 Flutter 的 UI 型组件的设计倾向于组合而不是继承,而对于功能型组件则多使用继承和 mixin。
---- 2.第一个解决方案:InheritedWidget 这里我们使用一个InheritedWidget来提供数据和方法,让她们共享与五个组件之中。...就像下面这样,将值存储于一个InheritedWidget中,随用随取。这样世界终于清静了,不用构造传值满天飞。 ?...VoidCallback increment;//增长函数 const CountModel(this.count,this.increment); } class CountWidget extends InheritedWidget...: key, child: child); static CountWidget of(BuildContext context) {//提供数据模型方法 return context.inheritFromWidgetOfExactType...如果你的封装层级较深,InheritedWidget将是你数据传递的好帮手。
WillPopScope(返回事件拦截器) InheritedWidget(数据传递与共享) Theme (主题控制) ---- WillPopScope(返回事件拦截器) 可防止误触情况的发生,也可监听返回按钮点击事件...(数据传递与共享) 通过 InheritedWidget 数据可以在 Widget 树中从上向下共享与传递,组件之间也可实现跨级传递数据 const InheritedWidget({ Key key...Test(共享数据提供者) * @author liyongli 20190514 * */ class InheritedWidgetTest extends InheritedWidget{...super(child:child); // 获取共享数据 static InheritedWidgetTest getData(BuildContext con){ return con.inheritFromWidgetOfExactType...---- Theme (主题控制) 通过 ThemeData 可以控制 Theme 视图内的组件风格,如颜色、字体、样式等,实际上也是通过 InheritedWidget 来共享与传递主题数据 const
---- 2.第一个解决方案:InheritedWidget 这里我们使用一个InheritedWidget来提供数据和方法,让她们共享与五个组件之中。...就像下面这样,将值存储于一个InheritedWidget中,随用随取。这样世界终于清静了,不用构造传值满天飞。...VoidCallback increment;//增长函数 const CountModel(this.count,this.increment); } class CountWidget extends InheritedWidget...: key, child: child); static CountWidget of(BuildContext context) {//提供数据模型方法 return context.inheritFromWidgetOfExactType...如果你的封装层级较深,InheritedWidget将是你数据传递的好帮手。
本节主要涉及Object中通用的一些方法,比如equals,hashCode,toString,clone,finalize等等 覆盖equals时请遵守通用约定 equals方法实现的等价关系:...自反性:对于所有的非null,a=a 对称性:a=b,则b=a 传递性:a=b,b=c,则a=c 一致性:对于没有被修改的ab,如果a=b,则一直a=b 非空性:对于任何非Null,a!...=null 高质量equals方法的诀窍: 使用==操作符检查——“参数是否为这个对象的引用” 使用instanceof检查——“参数是否为正确的类型” 参数转换成正确的类型 对于每个关键域,检查参数中的域是否与对象的域相匹配
首先我们知道 context 只是接口,而在 Flutter 中 context 的实现是 Element ,在 Element 的 inheritFromWidgetOfExactType 方法实现里..._inheritedWidgets 一般情况下是空的,只有当父控件是 InheritedWidget 或者本身是 InheritedWidgets 时才会有被初始化,而当父控件是 InheritedWidget...所以当我们通过 context 调用 inheritFromWidgetOfExactType 时,就可以往上查找到父控件的 Widget,从在 scoped_model 获取到 _InheritedModel...如果和 rxdart 结合可以简化 StreamController 的一些操作,同时如果你需要利用 BloC 模式实现状态共享,那么自己也可以封装多一层 InheritedWidgets 的嵌套,如果对于这一块有疑惑的话...如果对于 Stream 流程不熟悉的还请看上篇。 现在再对照流程图会不会清晰很多了?
~~ 第3章 对于所有对象都通用的方法 Object的设定是为了扩展,它的所有非final方法(equals hashCode toString clone finalize)都有明确的通用约定,因为它们被设计是要被覆盖...(override)的 而在覆盖这些方法时,都有责任遵守这些通用的约定,否则,其他依赖这些约定的类(如HashMap&HashSet)就无法结合该类一起正常运作....重写equals的时候就必须要遵守它的通用约定 equals方法实现了等价关系(equivalence relation): 自反性(reflexive) 对于任何非null的引用值x,x.equals...对于任何非null的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)就会一致地返回true,或者false 对于任何非null的引用值,x,x.equals...对于对象中每个关键域f(指equals方法中涉及的每个域),完成以下步骤: 如果f是boolean,则计算 f?
第 1 条:覆盖equals方法时请遵守通用约定 覆盖equals方法看似很简单,但是有许多覆盖方式会导致错误,并且后果非常严重。...对于既不是float也不是double类型的基本类型域,可以使用==操作符进行比较;对于对象引用域,可以递归地调用equals方法;对于float域,可以使用Float.compare方法;对于double...&& pn.areaCode == areaCode; } } 如上述代码所示,该类的equals方法就是根据上面的诀窍构造出来的,符合equals方法的各项等价关系以及通用约定...如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,这样的集合包括HashMap、HashSet和Hashtable等。...result = 31 * result + lineNubmer; return result; } 如上述代码所示,这个hashCode方法就是根据上面的方法构造出来的,满足hashCode方法的通用约定
String name}) { print(name); print(age); } // 解决函数调用时候,参数不明确的问题 test(name:"hicc",age: 30) // 这样对于组件的使用尤为方便...InheritedWidget 同样 Flutter 也有个context一样的东西,那就是InheritedWidget,使用起来也很简单。...= count; } static GlobalData of(BuildContext context) => context.inheritFromWidgetOfExactType(GlobalData...class GlobalData extends InheritedWidget { final int count; final Stream timeInterval$ =...= count; } static GlobalData of(BuildContext context) => context.inheritFromWidgetOfExactType(GlobalData