首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

对于通用InheritedWidget,inheritFromWidgetOfExactType不起作用

通用InheritedWidget是Flutter框架中的一个重要概念,用于在组件树中共享数据。在使用InheritedWidget时,可以通过inheritFromWidgetOfExactType方法来获取最近的父级InheritedWidget,并监听其数据的变化。然而,有时候inheritFromWidgetOfExactType方法可能不起作用的原因可能有以下几点:

  1. 组件树中没有对应类型的InheritedWidget:inheritFromWidgetOfExactType方法只能获取最近的父级InheritedWidget,如果组件树中没有对应类型的InheritedWidget,该方法将返回null。
  2. InheritedWidget类型不匹配:inheritFromWidgetOfExactType方法需要传入一个类型参数,用于指定要获取的InheritedWidget的类型。如果传入的类型与实际的InheritedWidget类型不匹配,该方法将返回null。
  3. InheritedWidget未更新:inheritFromWidgetOfExactType方法只能获取到最近的父级InheritedWidget,并监听其数据的变化。如果父级InheritedWidget的数据没有发生变化,该方法将返回null。

解决这个问题的方法可以有以下几种:

  1. 确保组件树中存在对应类型的InheritedWidget,并且该InheritedWidget已经被正确地插入到组件树中。
  2. 检查传入inheritFromWidgetOfExactType方法的类型参数是否与实际的InheritedWidget类型匹配。
  3. 确保父级InheritedWidget的数据发生了变化,可以通过在InheritedWidget中使用setState方法来触发数据的更新。

总结起来,对于通用InheritedWidget,如果inheritFromWidgetOfExactType方法不起作用,需要检查组件树中是否存在对应类型的InheritedWidget,并且该InheritedWidget的数据是否发生了变化。如果问题仍然存在,可以进一步检查传入inheritFromWidgetOfExactType方法的类型参数是否正确。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Flutter完整开发实战详解(十五、全面理解State与Provider)

    所以当我们通过 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 实现都在

    3.6K21

    Flutter完整开发实战详解(五、 深入探索)

    二、InheritedWidget InheritedWidget 是一个抽象类,在 Flutter 中扮演者十分重要的角色,或者你并未直接使用过它,但是你肯定使用过和它相关的封装。 ?...,所以通过 MaterialApp 作为入口,其实就是嵌套在 InheritedWidget 下。...如上图所示,通过 Theme.of(context) 获取到的主题数据,其实是通过 context.inheritFromWidgetOfExactType(_InheritedTheme) 去获取的,...而 Element 中实现了 BuildContext 的 inheritFromWidgetOfExactType 方法,如下所示: ?...三、内存 最近闲鱼技术发布了 《Flutter之禅 内存优化篇》 ,文中对于 Flutter 的内存做了深度的探索,其中有一个很有趣的发现是: Flutter 中 ImageCache 缓存的是 ImageStream

    1.8K30

    flutter传递值到任意widget(当需要widget嵌套使用需要传递值的时候)

    如下面代码所描述: 表示需要将widgetA中的点击改变内容传递到widgetB中的widgetC中展示; 需要通过设置widgetB的构造函数,接收对应参数,再传递给widgetC展示; class Inheritedwidget...中间类: //countProvider类 提供count属性和child属性 用于与原widget相关联, class CountProvider extends InheritedWidget{...child:child); //提供方法获取到countprovider类对象 static CountProvider of(BuildContext context){ return context.inheritFromWidgetOfExactType...(CountProvider); } @override bool updateShouldNotify(InheritedWidget oldWidget) { // TODO: implement...updateShouldNotify return false; } } 通过counterprovider包裹需要展示的widget并传入需要改变的值; class Inheritedwidget

    1.6K31

    2021 年值得期待的 Flutter 数据流管理方案

    对于 Ephemeral State, 可以用 StatefulWidget 进行状态管理。...对于 App State, 有以下几种方式可以考虑状态传递与刷新: InheritedWidget:  Flutter 提供的功能性组件,用来与子孙节点共享数据 Event Bus:一个全局的单例,相当于是借助全局的静态变量...3. provider 尽管 InheritedWidget 已经提供了一套数据共享的方案,但是显然它所带来的模板代码太多了,需要写很多重复的代码,比如覆写注册依赖和通知函数,对于复杂一点的应用,需要一套更加方便的数据管理方案...3.4 封装通用的页面容器 在 业务场景中,绝大多数页面都是需要通过 api 请求获取数据,根据返回结果页面显示:加载中、正常页面、空状态、网络错误、其他错误这么几种情况。...因此,可以抽象把这个过程抽离出一个通用的容器,注意的是 Flutter 的 UI 型组件的设计倾向于组合而不是继承,而对于功能型组件则多使用继承和 mixin。

    2K20

    Flutter跨平台移动端开发丨WillPopScope、InheritedWidget、Theme

    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

    1.3K30

    Flutter完整开发实战详解(十二、全面深入理解状态管理设计)

    首先我们知道 context 只是接口,而在 Flutter 中 context 的实现是 Element ,在 Element 的 inheritFromWidgetOfExactType 方法实现里..._inheritedWidgets 一般情况下是空的,只有当父控件是 InheritedWidget 或者本身是 InheritedWidgets 时才会有被初始化,而当父控件是 InheritedWidget...所以当我们通过 context 调用 inheritFromWidgetOfExactType 时,就可以往上查找到父控件的 Widget,从在 scoped_model 获取到 _InheritedModel...如果和 rxdart 结合可以简化 StreamController 的一些操作,同时如果你需要利用 BloC 模式实现状态共享,那么自己也可以封装多一层 InheritedWidgets 的嵌套,如果对于这一块有疑惑的话...如果对于 Stream 流程不熟悉的还请看上篇。 现在再对照流程图会不会清晰很多了?

    2.1K20

    ​第3章 对于所有对象都通用的方法

    ~~ 第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?

    51920

    效率编程 之「对于所有对象都通用的方法」

    第 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方法的通用约定

    41730
    领券