问题标签 [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 投票
1 回答
258 浏览

flutter - Flutter:如何正确地将 Provider.of 方法放入 StatefulWidget 中,以便在我的代码中使用 Dispose()?

简介:我花了一个多小时浏览 StackOverflow 来寻找这个答案;所以,我犹豫地决定问这个我认为没有答案的问题。我希望它不会重复已经回答的问题,令人作呕。

在过去的五周里,我一直沉浸在 BLoC 模式的研究中(是的,我知道我落后于曲线大约一年)。我一直在观看几个视频并阅读有关该主题的几本书。我了解到,如果没有调用 dispose 方法,就会发生内存泄漏。在我最近观看的许多 YouTube 视频中,建议使用有状态小部件而不是无状态小部件,以便可以在应用程序的生命周期中使用 dispose 方法来防止内存泄漏。

问题:通过Provide.of 方法安置继承的小部件以获得有状态小部件的上下文范围的正确方法是什么,因此可以在生命周期中使用dispose()方法?

相关代码:

问题:我认为必须在代码的 _HomeState 区域内调用 Provider.of 方法,因为这是上下文可用的地方。但是,通过这样做,它会将其从 dispose 方法的范围中删除。

问题:关于 dispose() 方法范围的可用性,我做错了什么,有没有我没有看到的答案?

0 投票
0 回答
21 浏览

flutter - 显示 InheritedWidget 中包含的值时出现问题

我已经在 Flutter 中开发了几个月,但我还不是很有经验。这些天我正在开发一个我从一开始就没有创建的应用程序,我遇到了一个奇怪的问题,不幸的是我不能粘贴太多的代码,但我试图解释错误的行为。应用程序的状态包含在一个 InheritedWidget 中,该控件在所有其他控件之前被调用。例如,在这个 InheritedWidget 中有一个值必须始终在应用程序顶部(在 AppBar 中)可见。问题是,如果在运行时在 InheritedWidget 中更改了此值,则视图会显示以前的值(就好像它没有更新一样),但是如果我将 Navigator.push() 转到新页面,则 AppBar 会显示正确的值(即更新的值)。如果我跳到上一页,旧值会重新出现在 AppBar 中。

即使 InheritedWidget 中的值发生更改,视图似乎也不会更新。我指定在显示之前,这个值是直接从 InheritedWidget 中提取的,使用context.dependOnInheritedWidgetOfExactType<InheritedWidgetName>(). 我还指定以这种方式设置“updateShouldNotify”: @override bool updateShouldNotify(Session oldWidget) { return true; }

我想问是否有人知道可能导致此问题的原因。

提前致谢。

0 投票
1 回答
373 浏览

android - 主屏幕上的 ListTile 未使用 InheritedWidget 更新

我开始使用颤振/飞镖,我正在尝试使用 InheritedWidget 和 TextControllers 实现一个简单的笔记应用程序,但是当我添加或编辑一些笔记时,它不会更新主屏幕。我在控制台中打印了新的笔记列表,它通过添加和编辑进行了更新,但在主屏幕中没有更新,仍然显示初始笔记列表({'title':'someTitle1','text':'someText1'}, ...)。

主要飞镖:

主屏幕脚手架主体:

添加/编辑注释页面:

继承小部件:

添加注释后的主屏幕: HomeScreen

添加注释后在控制台中打印的注释列表:

我正在使用 Android Studio 和真实设备而不是模拟器。我找不到错误,如果您有其他方法来执行此“更新”,请告诉我。

0 投票
1 回答
238 浏览

flutter - 请解释语法 - 使用继承的小部件的颤振块提供程序

我不明白构造函数部分和静态函数部分。极好的?依赖InheritedWidgetOfExactType?

0 投票
3 回答
2033 浏览

flutter - Flutter:我应该如何使用 InheritedWidget?

简介:我认为这个问题原则上可能是共享的,但我觉得这个特定的应用程序不是。我谦虚地提交它以供考虑,所以请温柔。我的代码在这里偶然发现了一个明显的陷阱,我根本不知道如何修复它。在考虑了几个小时之后,我什至不知道该怎么做。

问题: InheritedWidget没有更新其上方小部件中的状态。

期望:我希望当我在HomePage的PageView上滑动时,BottomAppBarText会更新。但是,这不会发生。

描述:我正在尝试使用InheritedWidget ( InheritedPageIndex ),它是通过Provider方法在根小部件 ( MaterialApp )上方初始化的(请参阅下面的代码)。其中,有一个值向下传递到小部件树中它下方的小部件 ( MenuPage )。我希望这个值在状态改变时更新;我尝试通过在小部件树中它下方的小部件中滑动PageView ( HomePage ) 来进行修改。

在此处输入图像描述

代码:我已经重新编写并简化了我的代码,以便我们可以更轻松地诊断和修复问题,它看起来像这样:

page_index_model.dart

page_index_provider.dart

主要.dart

menu_page.dart

home_page.dart

假设:经过大量研究和反思。我相信我无法更新 Provider 的价值;因为它在第一个实例化的 InheritedWidget 和改变状态的方法之间。也许另一种说法是,我想改变的状态就在它的正上方;并且,它取而代之的是第二个提供者的状态而不是使用第一个?

问题:

1)为了我的利益,我的假设是正确的,还是这里发生了其他事情?

2) 我该如何解决我的问题?我不相信实现 BLoC 方法会解决这个问题,因为它也使用提供程序?

在这种情况下,如果没有 InheritedWidget,我不知道如何将状态向上传递到小部件树。

0 投票
4 回答
949 浏览

flutter - Provider Widget 的放置位置——Flutter Provider Package

我目前正在学习使用 Flutter 进行应用程序开发,并且已经开始学习 Provider 包。我遇到了一些困难并且收到了错误:

“在此...小部件上方找不到正确的提供程序”

我最终将 Provider 小部件移动到环绕我的 MaterialApp 小部件而不是我的 Scaffold 小部件,这似乎解决了问题。

话虽如此,我不确定为什么这会解决问题。我们是否应该将我们的 Provider 小部件放在 MaterialApp 周围?如果是这样,有人可以解释为什么需要这样做吗?如果没有,有人可以解释如何确定将 Provider 小部件放置在我们的树中的位置吗?

0 投票
1 回答
164 浏览

flutter - 无法在 Flutter 中初始化 Inherited 小部件

我正在尝试使用继承的小部件在所有屏幕上共享相同的服务。

这是我的继承小部件的代码

因此,我在主屏幕中对其进行了初始化:

最后我想从后续屏幕访问它:

但是当最后一个屏幕被构建时,我收到了这个错误消息

在 null 上调用了 getter 'audioProvider'。接收方:null 尝试调用:audioProvider

我注意到,如果我在 main.dart 中初始化小部件,则错误不会出现并且一切正常

但我想让它只在小部件子树的某个部分可用,但不知道为什么它不起作用。

可能是由于屏幕之间的路由吗?或者还有什么其他原因?

谢谢

0 投票
1 回答
2703 浏览

flutter - Flutter Bloc A 在 Bloc B 中添加流,但此流不会通过 StreamBuilder 在 UI 中呈现

我正在尝试为新的颤振项目转变为 bloc / provider 架构。一段时间以来,我一直在解决一个问题,其中一个块的流将通过 StreamBuilder 在 UI 上呈现,而另一个块则不会。在我继续之前,我很想(并且需要)了解原因。

我有两个集团,第一个是 ble_service。我可以从 UI 调用函数到这个 bloc(app.dart 第 60-72 行)连接到设备并通过 StreamBuilder(第 98 行)呈现特征在 UI 中返回的内容。只需在 UI 中渲染从 ble 设备返回的 json 有效负载。这会非常频繁地每秒更新多次。

我的计划是有一个解析器块(bleBeltNotifyParser_bloc),它将解析来自 ble_service 的传入 json 有效负载,然后从那里的 UI 流式传输。在 ble_service 中,我将 json 有效负载传递给 parserInputSink,这是来自 Parser Bloc 的一个流(ble_service 第 99 行)。在 bleBeltNotifyParser.bloc 中,我在第 21 行监听它并将它传递给我计划解析它的 aTest2()。我在这里停了下来,因为我试图在 UI 上呈现这些数据(app.dart 第 108 行),但无论将数据传递到 parserInputController 的不同组合如何,UI 都只会呈现种子数据。我通过在第 28 行打印它来确认流正在获取数据。

我还确认我可以通过按钮(第 73 行和第 80 行)将一些数据放入流中,从而从 UI 访问 Parser 块。当按下这些按钮时,该数据将添加到流中,并且 UI 会按预期更新。

为什么 StreamBuilder 适用于 blue_service 而不适用于 bleBeltNotifyParser_bloc?我还尝试在服务中创建流,然后在解析器中收听它。他们也没有运气。

我的 main.dart

我的应用状态

我的应用程序.dart

我的 ble_service.dart

我的 bleBeltNotifyParser_bloc 我无法渲染

0 投票
1 回答
97 浏览

flutter - 在 build-Method 中分配 InheritedWidget

让 A 成为一个 InheritedWidget,我可以通过调用 A.of(context) 来获取整个应用程序。

如果我有 StatefulWidget,那么更好的选择是什么(就性能或代码质量而言):

一个)

二)

我从未见过有人使用选项 A),所以我想知道。我更喜欢选项 A),因为 _TestState 类中的每个方法都可以轻松使用 a-Object,并且它在构建方法中也只分配一次。

0 投票
1 回答
26 浏览

flutter - 如何通过推送路由访问 InheritedWidget 的数据?

所以我有一个 InheritedWidget 持有一个令牌。

然后在我的应用程序的某个高处,我用它来显示MyScreen

MyScreen按预期工作。它可以正确获取TokenHolder的令牌。

但是,PushedScreennull我们调用TokenHolder.of(context). 为什么是这样?为什么找不到 TokenHolder?