我正在与 Flutter 的提供者争论,无法理解它的所有可能性。问题是,例如我有这样的小部件结构:
Widget_A
--Widget_B
----Widget_C
----Widget_D
--Widget_E
--Widget_F
Run Code Online (Sandbox Code Playgroud)
简单的例子是TODO列表。想象一下你有categories,add_field和todos_list。每个都是一个单独的小部件。比您所做的更改categories更重要的是,todos_list应该重新加载以显示所选类别中的待办事项。稍后您使用add_fieldso添加待办事项todos_list,因为新记录也需要更新。我怎样才能实现这样的目标?
PS:我试图将所有内容分离到不同的 Provider 类中,但效果是相同的:如果小部件使用 Provider.of(context) ,无论如何它都会更新。由于我应该合并来自两个提供商的数据,因此会有一个小部件连接到两个提供商,因此结果将是无限循环。仍然。
我知道颤振中的状态管理存在某些问题,但它们似乎都不能解决我的用例。
最近我正在构建一个基于电子商务的应用程序,并遇到了这种对状态管理的真正需求。我有2页,
用户可以将产品添加到购物车,然后导航到购物车。在购物车页面中,他们还可以增加或减少商品的数量。
正如您所看到的,最初黄色商品被添加到购物车中,数量为 3,但在购物车页面中,用户按下 (-) 按钮,将数量减少到 1。现在,如果用户按下后退按钮,则状态为黄色产品在产品页面上仍为 3。与粉色产品类似的情况。
因此,我尝试使用正常的 setState 和一些全局数据结构来解决这个问题来跟踪数量。但随着我的应用程序变得越来越大,跨页面维护状态真的很困难。我读过不同的状态管理解决方案,例如 redux、BloC 模式、Provider,...但我不清楚如何在我的用例中使用它们。有没有有经验的人帮我把石头敲碎,帮我消化一下?
任何有关如何解决此问题的示例代码和解释将不胜感激!
希望我的问题是清楚的!
state-management flutter flutter-provider flutter-bloc flutter-state
我不太明白 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) 我一直在尝试创建一个由 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不提供更新索引处数组元素的方法。您必须读取整个文档,修改内存中的数组,然后将整个数组写回文档。
我对如何将 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) 我在我的 flutter 应用程序中使用 Provider 包。
我有条件地使用提供程序提供 ChangeNotifier 类。
树中的后续构建方法想要检查该类是否存在,如果不存在,则不是失败情况。
我如何使用 Provider 包来做到这一点。目前当我打电话...
Provider.of<MyChangeNotifier>(context);
Run Code Online (Sandbox Code Playgroud)
如果树上不存在 MyChangeNotifier,则会抛出异常。我想要的只是快速简单地检查 MyChangeNotifier 是否存在,因为这是预期的情况。
当列表数据存储在拥有列表小部件的同一组件中时,我能够成功地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 中制作 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)
在上面的提供程序中,我尝试从两个未来的提供程序获取数据并获取 …
当我尝试访问特定屏幕时,我收到“空值检查运算符”。
我屏蔽了我的“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 的新手,不知道如何解决它。