问题标签 [flutter-change-notifier]

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 回答
1289 浏览

flutter - 什么时候 ChangeNotifier 比 Flutter 中的 Observable 更受欢迎?

我一直在努力理解ChangeNotifier何时优于 Rxdart 的Observable或一般的流。

根据 Flutter 的文档:

一个可以扩展或混合的类,它提供使用 VoidCallback 进行通知的更改通知 API。

ChangeNotifier 针对少量(一或两个)侦听器进行了优化。添加和删​​除监听器是 O(N),调度通知是 O(N²)(其中 N 是监听器的数量)。

不过,我不确定 ChangeNotifier 能提供什么 Observable 或 Stream 不能。

0 投票
1 回答
1550 浏览

android - 使用 Firebase Auth 和 ChangeNotifierProvider 进行 Flutter 路由

在深入研究我的应用程序的功能之前,我正在努力使我的颤振架构尽可能好。我已经基于 ChangeNotifierProvider 制作了一个带有 firebase Authentification 的应用程序:

此 Home 小部件正在侦听身份验证状态并返回任何 LoginScreen 或 DashboardScreen 小部件(无论是否登录)。如果用户登录,LoginScreen 可以更新服务的状态。DashboardScreen 还可以通过注销来修改状态。然后由于这个通知程序,呈现的小部件正在两个屏幕之间切换。

我正在尝试将生成的路由添加到此工作部分,以使我的应用程序更加“标准”。我在 Router 类中定义了一些路由:

我现在可以修改我的 MyApp 小部件:

问题是:如何使此路由在 Home 小部件中工作?实际上,我打开了我提供的服务的状态,并返回了一个好的小部件。类似于在此开关内选择路线:

如何使用导航器?我不能在开关内使用 Navigator.pushNamed。它需要返回一个小部件。如果登录成功,如果 LoginScreen 应该处理导航,也许我错了这可能更简单?这样 Home 小部件可以直接呈现 LoginScreen。这是最好的方法吗?

我试图从一个干净且设计良好的应用程序开始,尽可能地创造出最好的架构。

谢谢您的帮助。

0 投票
1 回答
6923 浏览

flutter - 重置提供者数据 - Flutter

我在我的应用程序中使用 multiprovider。Provider 工作完美,它存储数据,并在发生任何变化时提供完美的事件。

现在,我的应用程序中有这种情况->

用户 1 已登录。现在,当我在同一个登录名中添加第二个帐户(如 Gmail - 多帐户)时,提供商会返回旧值。

我试图搜索提供者的重置值,但找不到与之相关的任何内容。

尝试过但没有用:

  • 创建了要重置的提供者的新对象。
  • Provider.of<LoginProvider>(context).dispose();
0 投票
1 回答
735 浏览

flutter - Flutter:使用泛型创建小部件时出现子类型错误

我正在为我的应用程序使用扩展 ChangeNotifier 的视图模型。要使用它们,我正在尝试实现一个通用的基本小部件:

基本小部件有一个类型参数,并使用 get_it 包的服务定位器获取视图模型的实例。

但是当我尝试运行应用程序时,使用小部件时:

Flutter 抛出运行时错误:

错误似乎是由函数参数引起的:

当我用动态交换泛型类型(ViewModelType)时,应用程序运行良好(当然没有类型安全):

任何想法如何使它与通用参数一起运行?

这是我的视图模型:

和 get_it 设置:

0 投票
0 回答
47 浏览

flutter - 如何在不使用导航器的情况下路由到另一个页面

我正在使用 MSAL 通过 ChangeNotifierProvider 对用户进行身份验证。我正在尝试从 MSAL 登录导航到另一个页面,但 Navigator.push 需要在小部件中使用。如何在不使用 Navigator.push 的情况下导航到另一个页面?或者它不能用于颤振?

下面的代码:

0 投票
1 回答
2734 浏览

flutter - 如何在 main.dart 中调用 changeNotifier 之前已经有一个flutter?

我使用提供程序从firestore一页中显示数据,然后将数据传递到第二页并调用changenotifierin main.dart

但是,每当我尝试导航到第二页时,它都会向我显示此错误:

“I/flutter (1763):引发了另一个异常:在构建期间调用了 setState() 或 markNeedsBuild()。”

我不知道该怎么办。

  • 注意:在main.dart我之前已经有一个changenotifier

第一页代码:

第二页代码:

main.dart 代码:

提供者本身

0 投票
1 回答
2686 浏览

flutter - Flutter 等待 Provider 准备好在 multiprovider 中

我在创建同步提供程序时遇到问题。我是新手,我会尽力解释得更好。

在我的 main.dart 中,我有两个提供程序,一个用于用户身份验证,一个用于代码中的另一个小部件,它只是有一个要显示的列表。我使用 ChangeNotifierProxyProvider 因为所有其他提供者都需要访问用户身份验证令牌和详细信息。用户存储、读取令牌的所有方法都在 userProvider 中。

当调用 UserProvder.init() 时,对象已创建但由于 http 请求仍未准备好,主体中的代码继续执行并将 UserProvider 传递给认为 UserProvider 已准备好但未准备好的 Conto Provider。当 ContoProvider 开始使用 UserProvider 中的令牌检索 List 时,通过 userService 访问失败,因为仍然为空。

那么,我如何同步创建提供程序以等待 UserProvider 完全准备好然后初始化所有其他提供程序?

主要.dart

userProvider.dart

ContoProvider.dart

0 投票
1 回答
1228 浏览

flutter - 未调用 ChangeNotifier 类中的函数

我有一个以 Provider 作为状态管理器的 Flutter 应用程序。位于ChangeNotifierProvier我的应用程序的最顶部(即在 MaterialApp 小部件上方)。

  1. 我有一ChangeNotifier堂课如下:
  1. 然后我有另一堂课TextField
  1. 在主应用程序下的另一个类中,我调用了amount变量:

问题是Provider.of(...)无法调用该方法。我看了一些教程,找不到背后的原因。如果我使用静态文本而不是 AmountManager 对象,它可以工作。amount程序只使用类中的初始值MyText

你觉得我哪里不对?

先感谢您,

0 投票
1 回答
225 浏览

flutter - 在 Gridview.builder 中使用 ChangeNotifierProvider.value 时遇到错误

这可能是一个错误并且不受支持。如果您处于这种情况,请考虑将key唯一性传递给每个单独的构造函数。

以上是反映在小时候使用颤振小部件运行代码的错误:-

0 投票
3 回答
2835 浏览

flutter - 当我渲染我的子材料应用程序时,如何阻止我的更改通知提供程序重建我的父材料应用程序?

我有一个应用程序类,它返回一个MaterialApp()它的主页设置为TheSplashPage(). 如果任何首选项发生更改,此应用程序会侦听首选项通知。

然后在TheSplashPage()我等待一些条件为真,如果它们是我向他们展示我的嵌套材料应用程序。

旁注:我在这里使用材质应用程序,因为它看起来更合乎逻辑,因为它具有父材质应用程序不应该有的路线。而且,一旦用户未经身份验证或断开连接,我希望整个嵌套应用程序关闭并显示另一个页面。这很好用!

但我的问题如下。这两个应用程序都会监听,ThePreferencesProvider()因此当主题更改时,它们都会收到通知并重建。但这是一个问题,因为每当父材质应用程序重建时,它都会返回启动页面。所以现在TheSplashPage()每当我更改TheSettingsPage().

所以我的问题是如何阻止我的应用程序TheSplashPage()在我更改设置时返回?

主要.dart

TheSplashPage.dart

设置页面.dart