问题标签 [inherited-widget]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
8957 浏览

widget - 颤振错误:“小部件无法构建,因为已经在构建过程中”

我收到了这个错误:

在用代码淹没你之前,我想解释一下背后的逻辑:我正在尝试实现游戏百家乐的规则,为此我设置了一个继承的小部件,一些无状态的小部件将输入发送到存储的对象在继承状态下,其他widget根据这个对象数据重建自己。

我所做的最后一个更改是应用百家乐“绘图规则”,它可以使对象在需要时跳过输入,但是当发生这种情况时,继承的小部件不喜欢它。

我将发布代码的最后一部分,但如果您认为其他内容相关,请询问,我会发布它。

预先感谢您的帮助

...

...

...

0 投票
1 回答
2720 浏览

flutter - Scoped Model、BLoC 模式、StreamBuilder 和 Inherited Widget(或 Model)我应该选择哪一个,为什么?

我想我现在至少对如何在我的应用程序中使用BLoCStream BuilderInherited Widget(或Model)有了一个模糊的想法(没什么特别的,但对我来说这需要时间),但是使用Scoped Model
我有一个一种生存危机:我觉得他们大多可以做同样的事情,或者至少我可以用他们中的任何一个获得相同的明显结果,但我没有能力理解何时 以及为什么一个人比另一个人更好。

0 投票
1 回答
1115 浏览

flutter - Flutter - InheritedModel 仍会更新子项,即使它与某个方面不匹配

再会。我看过一个关于 Flutter 的 InheritedModel 的视频,并对它产生了兴趣。不幸的是,我似乎无法让它正常工作。


摘要:需要帮助如何正确实现 InheritedModel。

预期的代码输出:更新参数CountText时不应更新小部件。countCountModel

实际代码输出CountText仍在更新(我认为这是因为父小部件是 a StatefulWidget


细节

我正在尝试Counter使用InheritedModel. 下面的代码是我的代码


我有一个 CountModel asInheritedModel和一个CountText小部件,它使用来自CountModel. 正如您在 的实现中所看到的CountText,它test在获取CountModel. count据我了解,在 CountModel 中更新值时不应更新它。不幸的是,这不会发生。

0 投票
2 回答
2269 浏览

dart - 使用 Inherited Widget 时如何处理 bloc?

我使用blocand制作了一个简单的应用程序InheritedWidget。以下是代码

我不明白在使用时如何调用 bloc 的 dispose 方法InheritedWidget。当然,我可以创建一个全局变量 bloc 并避免使用InheritedWidgetbloc 中存在的 dispose 方法来处理 bloc 但我真的想使用InheritedWidget.

使用PublishSubjectfrom是否会自动rxdart处理streamcontroller,是否具有生命周期意识,我在文档中找不到与此相关的任何内容。是否有任何调试过程以确保streamcontroller正确处理?

0 投票
1 回答
10777 浏览

flutter - Flutter - 了解 Provider、Bloc 的生命周期以及何时处置流

需要了解什么时候应该Bloc模式和Bloc的生命周期(如何释放持有内存的对象)

我有一个屏幕,我正在从服务器获取数据,并且数据将仅用于单个屏幕。我正在使用 Bloc 模式来显示数据。

使用 Bloc 模式时,我有一个使用 StatelessWidget 的屏幕。我正在尝试处理“WillPopScope”上的流。一旦处理完毕,流就不能再使用了。因为访问同一个屏幕会导致崩溃,因为我已经用 Bloc 包装了 MaterialApp。

  1. 创建了一个流
  1. 处理流
  1. 在提供者中包装 Material App:
  1. Statelesswidget 'WillPopScope',我评论了代码的处置,因为据我了解,当前 bloc 已创建一次:

第一个问题,假设我创建了一个广播流并删除了“WillPopScope”中的代码处置,那么一切都按预期工作,但我认为,这样,我的 Bloc 为应用程序的生命周期保留了一个内存。

第二个问题,如何处理在屏幕内使用数据的情况。在这种情况下推荐使用 Bloc 模式吗?

0 投票
1 回答
508 浏览

dart - 在颤振中使用祖先InheritedElementForWidgetOfExactType

我在上面有一个聊天对象InheritedWidget到我的应用程序的根小部件。我想在其中访问此对象initState以设置子小部件的初始状态。我有以下代码:

我收到一条错误消息: "The getter 'chat' isn't defined for the class 'InheritedWidget'

是不是我用的方法不对,怎么用?

0 投票
1 回答
3662 浏览

dart - InheritedWidget 混淆

InheritedWidget的 Flutter文档说

小部件的基类,可有效地沿树向下传播信息。

要从 > 构建上下文获取特定类型的继承小部件的最近实例,请使用 BuildContext.inheritFromWidgetOfExactType。

继承的小部件,当以这种方式引用时,将导致消费者在继承的小部件本身改变状态时重建。

鉴于 Flutter 中的小部件是不可变的,并且在示例代码中......

color 属性final因此无法重新分配。假设这个小部件就在树的顶部,就像在大多数示例中一样,它什么时候会有用。对于要替换的小部件,必须创建一个新实例。

大概在这样做的地方,也将创建一个作为孩子传递的新实例,导致该孩子的后代也重建,创建其孩子的新实例等。

最终还是重建了整棵树。那么通过 using 应用的选择性更新inheritFromWidgetOfExactType是没有意义的,当一个 InheritedWidget 实例的数据对于该实例永远不会改变时?

编辑:

这是我不明白的最简单的例子,我可以放在一起。在此示例中,“更改”应用程序根附近的唯一方法是重建InheritedWidget/FrogColor其父级 ( )。MyApp这会导致它重建它的子实例并创建一个新实例,FrogColor并传递一个新的子实例。我看不出有任何其他方式InheritedWidget/FrogColor 可以改变其状态,如文档中所述

...当继承的小部件本身改变状态时,将导致消费者重建。

此外,它的输出是

所以所有子小部件总是被重建。使在 inheritFromWidgetOfExactType 中完成的注册也毫无意义。

编辑2:

回应评论中的@RémiRousselet 回答,修改上面的例子,比如

通过存储不应在构建函数之外修改的树来工作,以便在每次重建时将相同的子树传递给 InhertedWidget。这确实有效,只会导致重建已向 inheritFromWidgetOfExactType 注册的小部件进行重建,而不会重建其他小部件。

尽管@RémiRousselet 说将子树存储为状态的一部分是不正确的,但我不认为有任何理由认为这是不正确的,事实上他们在一些谷歌教程视频中这样做了。在这里,她创建了一个子树并作为状态的一部分保存。在她的案例中,有 2 个 StatelessColorfulTile() 小部件。

0 投票
3 回答
11952 浏览

dart - 正确 Flutter 小部件序列以在应用加载时提取数据

当我在应用程序加载时尝试从本地存储读取数据时遇到了颤振问题。

我有一个继承的小部件,其中包含当前用户的身份验证信息。当应用程序加载时,我想查看会话令牌的本地存储。如果会话令牌存在,我想使用此信息更新继承的小部件。

我的屏幕是动态的。如果它知道用户已通过身份验证,则将他们带到请求的屏幕,否则将他们带到注册屏幕。

我遇到的问题是我无法initState()从依赖于继承小部件(我的路由器小部件)的小部件的方法更新继承小部件的状态

当应用程序加载和更新继承的小部件时,如何从本地存储中读取?

运行应用程序时出错:

路由器小部件(根)

继承的 Widget 方法检查身份验证并更新自身,这会触发我的路由器小部件的重新呈现

主要的

在应用程序加载时检查本地存储并更新包含此信息的继承小部件的正确方法是什么?

0 投票
0 回答
802 浏览

android - 继承的小部件重建整个谷歌地图小部件

使用 Flutter 构建应用程序并喜欢它,但一个烦人的问题困扰着我。

我有一个“主”状态小部件,其中包含属性中的商店列表、搜索栏、一个“子”小部件,它可以是地图或列表,我们可以通过单击按钮在视图之间切换。有一个 Inherited 小部件包裹在主小部件内,因此我们可以获得主小部件的状态,从而获得列表。

我在搜索栏上有一个监听器:

它与我们过滤列表的列表小部件(它有一个 FutureBuilder)完美而流畅地工作。

但是,对于地图小部件,我们使用 Google Maps 插件。在创建地图时,我们在其上为我们应该显示的列表中的每个项目添加一个标记:

然后,每次搜索栏中的值发生变化时,它都会重新构建整个小部件,并且效率非常低,重建时会出现不美观的黑屏。此外,它偶尔会工作一次:大多数时候,小部件甚至都没有重建,从而导致搜索结果错误。

一件奇怪的事情是,当我在调试模式下启动应用程序并在地图小部件的“构建”方法上设置断点时,它按预期工作。

我想做的是,当主小部件中的列表发生变化时:-如果我们在列表小部件上,请重建 -如果我们在 Google 地图小部件上:触发一个函数,该函数将擦除所有标记并重新添加它们给定新列表,无需重建整个小部件。

我确信有办法做到这一点,但我已经尝试了几天,但我找不到办法。也许有人可以帮助我?非常感谢 !:)

编辑:这是我的代码:

继承的小部件

列表小部件(确定)

地图小部件 (KO)

0 投票
1 回答
2021 浏览

dart - 在 Flutter 中使用 InheritedWidget 时 ListView 失去滚动位置

将 InheritedWidget 添加到应用程序后,当我使用 Pop() 从详细信息屏幕返回列表时,我发现 ListView 失去了滚动位置(所选项目索引)。

我知道小部件可以随时重建,但也许有人可以在不手动处理缓存的情况下提出解决方案。

在实现 InheritedWidget 之前 PS 滚动位置很好