标签: flutter-provider

Flutter 提供程序仅通知选定的侦听器

我正在与 Flutter 的提供者争论,无法理解它的所有可能性。问题是,例如我有这样的小部件结构:

Widget_A
--Widget_B
----Widget_C
----Widget_D
--Widget_E
--Widget_F
Run Code Online (Sandbox Code Playgroud)

简单的例子是TODO列表。想象一下你有categories,add_fieldtodos_list。每个都是一个单独的小部件。比您所做的更改categories更重要的是,todos_list应该重新加载以显示所选类别中的待办事项。稍后您使用add_fieldso添加待办事项todos_list,因为新记录也需要更新。我怎样才能实现这样的目标?

PS:我试图将所有内容分离到不同的 Provider 类中,但效果是相同的:如果小部件使用 Provider.of(context) ,无论如何它都会更新。由于我应该合并来自两个提供商的数据,因此会有一个小部件连接到两个提供商,因此结果将是无限循环。仍然。

flutter flutter-provider

5
推荐指数
0
解决办法
2056
查看次数

针对特定用例在 flutter 中的不同页面上维护相同的状态

我知道颤振中的状态管理存在某些问题,但它们似乎都不能解决我的用例。

最近我正在构建一个基于电子商务的应用程序,并遇到了这种对状态管理的真正需求。我有2页,

  1. 其中一个是产品页面,我在其中将产品添加到购物车。
  2. 第二个是购物车页面,我在其中看到最近添加到购物车的产品。

产品和购物车页面

用户可以将产品添加到购物车,然后导航到购物车。在购物车页面中,他们还可以增加或减少商品的数量。

正如您所看到的,最初黄色商品被添加到购物车中,数量为 3,但在购物车页面中,用户按下 (-) 按钮,将数量减少到 1。现在,如果用户按下后退按钮,则状态为黄色产品在产品页面上仍为 3。与粉色产品类似的情况。

因此,我尝试使用正常的 setState 和一些全局数据结构来解决这个问题来跟踪数量。但随着我的应用程序变得越来越大,跨页面维护状态真的很困难。我读过不同的状态管理解决方案,例如 redux、BloC 模式、Provider,...但我不清楚如何在我的用例中使用它们。有没有有经验的人帮我把石头敲碎,帮我消化一下?

任何有关如何解决此问题的示例代码和解释将不胜感激!

希望我的问题是清楚的!

state-management flutter flutter-provider flutter-bloc flutter-state

5
推荐指数
1
解决办法
1973
查看次数

ChangeNotifierProvider 中 Consumer / Provider.of 的差异

我不太明白 Provider.of() 和 Consumer 之间的区别。我在这里读到Consumer 就像 Provider.of 一样,带有listen: true。

但是,在下面的示例中,当我使用 Consumer 时我没有收到错误,但在使用 Provider.of 时却收到错误。我被迫使用listen: false。下面的示例是实现了 ChangeNotifierProvider 的默认 flutter 应用程序。

我只需更改 main.dart 中的 floatActionButton 中的代码即可查看 Consumer、Provider.of Listen: true 和 Provider.of Listen: false 之间的差异

counter.dart代码

import 'package:flutter/material.dart';

class Counter extends ChangeNotifier {
  int value = 0;

  void increment() {
    value++;
    notifyListeners();
  }

  void decrement() {
    value--;
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

main.dart 的完整代码,其中包含使用 Consumer 的浮动操作按钮。这是工作

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:unit_test/counter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-provider

5
推荐指数
1
解决办法
2572
查看次数

更新 Firestore 中数组的映射数据 - Flutter

我一直在尝试创建一个由 Google Firebase 提供支持的演示“Schedule-App”,但在使用 Firestore 一侧的映射值更新数组的特定值时遇到一些困难。

如下图所示,我们想要实现的onButtonPress,要更新这个特定值。

在此输入图像描述

我创建了一个数据流并通过StreamProvider.

StreamProvider<DocumentSnapshot>.value(
        value: FirebaseFirestore.instance.collection('schedule').doc(FirebaseAuth.instance.currentUser.uid).snapshots(),
Run Code Online (Sandbox Code Playgroud)

我使用以下方法来更新数组的数据,但它不起作用。

  Future<void> updateUserData(int index, String title, String text, int hour, bool check) async {
    DocumentReference snapshots = FirebaseFirestore.instance.collection('schedule').doc(FirebaseAuth.instance.currentUser.uid);
    snapshots.update({
      ['standard_schedule'][index]: {'title': title, 'text': text, 'hour': hour, 'check': check}
    });
  }
Run Code Online (Sandbox Code Playgroud)

我应该对上面的方法进行哪些更改,以便每次按下按钮时更新 bool 值?

=================================================

解决方案(2020 年 10 月 24 日):Firestore不提供更新索引处数组元素的方法。您必须读取整个文档,修改内存中的数组,然后将整个数组写回文档。

firebase flutter google-cloud-firestore flutter-provider

5
推荐指数
1
解决办法
2784
查看次数

使用 Riverpod 实现多个状态的 stateNotifier

我对如何将 stateNotifier 与 Riverpod 一起使用感到困惑。大多数教程都使用反例,这很好,但对我来说仍然不太清楚。我正在尝试实现一个具有 2 个状态的 stateNotifier : isDrawerOpen 和 isDrawerColor ,它返回布尔结果。有些功能会触发这些状态的变化。以下是我已经实现的内容,确实需要一些澄清。

import 'package:flutter_riverpod/all.dart';

class DrawerNotifier extends StateNotifier{

  DrawerNotifier() : super(false);

  bool isDrawerOpen = false;
  bool isDrawerColor = false;
  
  void toggleDrawer() {
    isDrawerOpen = !isDrawerOpen;
  }
  void toggleColor() {
    isDrawerColor = !isDrawerColor;
  }
}

final drawerProvider = StateNotifierProvider((_) => DrawerNotifier());

final isDrawerOpen = StateNotifierProvider((ref){
  final state = ref.watch(drawerProvider);
  return state.isDrawerOpen;
});

final isDrawerColor = StateNotifierProvider((ref){
  final state = ref.watch(drawerProvider);
  return state.isDrawerColor;
});
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-provider riverpod

5
推荐指数
1
解决办法
1884
查看次数

Flutter - 用户从应用程序注销后如何擦除提供商数据?

我在我的 flutter 应用程序中使用提供程序进行状态管理。我已经使用Multiprovider.

我想在用户从应用程序注销时擦除提供商数据我已读过评论但不太理解。

flutter flutter-provider flutter-state

5
推荐指数
1
解决办法
4496
查看次数

如何检查提供的类是否存在

我在我的 flutter 应用程序中使用 Provider 包。

我有条件地使用提供程序提供 ChangeNotifier 类。

树中的后续构建方法想要检查该类是否存在,如果不存在,则不是失败情况。

我如何使用 Provider 包来做到这一点。目前当我打电话...

Provider.of<MyChangeNotifier>(context);
Run Code Online (Sandbox Code Playgroud)

如果树上不存在 MyChangeNotifier,则会抛出异常。我想要的只是快速简单地检查 MyChangeNotifier 是否存在,因为这是预期的情况。

flutter flutter-provider

5
推荐指数
1
解决办法
1961
查看次数

在 Flutter 中使用 Provider 更新 AnimatedList 并为其设置动画

当列表数据存储在拥有列表小部件的同一组件中时,我能够成功地AnimatedList在 Flutter 中对 的内容进行动画处理(即,当列表数据发生更改时不会发生重建)。当我尝试从ChangeNotifierusingProvider和获取列表中的项目时,我遇到了问题Consumer

拥有 的组件AnimatedList(我们称之为ListPage)是用 构建的Consumer<ListItemService>。我的理解是,ListPage每当服务更新列表数据并调用时就会重建notifyListeners()。当发生这种情况时,我不确定ListPage可以调用其中的哪个位置AnimatedListState.insertItem来对列表进行动画处理,因为在build列表状态期间仍然是null。结果是一个列表,其内容没有动画效果。

我认为我的问题归结为“如果实时获取和更新内容,我如何管理此列表的状态?”,理想情况下,我想了解正在发生的事情,但我愿意接受有关如何我的建议如果这不是完成任务的最佳方式,则应该更改此设置。

下面是一些说明问题的代码:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<AuthService>(
          create: (_) => AuthService(),
        ),
        ChangeNotifierProxyProvider<AuthService, ListItemService>(
          create: (_) => ListItemService(),
          update: (_, authService, listItemService) …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-provider

5
推荐指数
1
解决办法
1880
查看次数

使用 FutureProvider RiverPod 组合 FutureProvider

我目前正在 Flutter 中制作 Udacity Sunshine 项目。我有两个不同的提供商来获取当前温度和每日预报。

我想合并这两个提供程序并创建一个名为weatherProvider 的新的单一提供程序。

文件:weather_data.dart

import 'package:app/models/current_weather_data.dart';

import 'one_call_weather_data.dart';

class WeatherData {
  final OneCallWeatherData oneCallWeatherData;
  final CurrentWeatherData currentWeatherData;

  WeatherData({
    required this.oneCallWeatherData,
    required this.currentWeatherData,
  });
}
Run Code Online (Sandbox Code Playgroud)

文件:weather_provider.dart

import 'package:app/models/current_weather_data.dart';
import 'package:app/models/one_call_weather_data.dart';
import 'package:app/services/weather.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

var oneCallWeatherProvider = FutureProvider<OneCallWeatherData>((ref) async {
  return await WeatherService.getOneCallWeatherData();
});

var currentWeatherProvider = FutureProvider<CurrentWeatherData>((ref) async {
  return await WeatherService.getCurrentWeatherData();
});

final weatherProvider = FutureProvider<WeatherData>((ref) async {
  final currentWeatherData = ref.watch(currentWeatherProvider);

  final onecallWeatherData = ref.watch(oneCallWeatherProvider);

 // How to return WeatherData here??
});
Run Code Online (Sandbox Code Playgroud)

在上面的提供程序中,我尝试从两个未来的提供程序获取数据并获取 …

future dart flutter flutter-provider riverpod

5
推荐指数
2
解决办法
2720
查看次数

由于提供程序类而对空值使用空检查运算符

当我尝试访问特定屏幕时,我收到“空值检查运算符”。

我屏蔽了我的“user_provider”自定义类以及使用它的部分代码,它正常显示(没有红屏),但没有这些屏幕。

这是自定义类

import 'package:flutter/widgets.dart';
import 'package:purple/models/user.dart';
import 'package:purple/resources/auth_methods.dart';

class UserProvider with ChangeNotifier {
  User? _user;
  final AuthMethods _authMethods = AuthMethods();

  User get getUser => _user!;

  Future<void> refreshUser() async {
    User user = await _authMethods.getUserDetails();
    _user = user;
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

我理解这可能是由于第 9 行中的 bang 运算符造成的,但我是 fluttr 的新手,不知道如何解决它。

state-management dart firebase flutter flutter-provider

5
推荐指数
1
解决办法
734
查看次数