我对Flutter 翼有点陌生,我正在使用Riverpod.在我使用提供者传递的类中有一个可变变量可以(好)吗?

我的供应商

final groupControllerProvider = Provider<GroupController>((ref) {
  return GroupController();
});

自定义类

class GroupController {
  List<Map<String, dynamic>>? myVariable;

  GroupController();

  Future<void> toDoWithMyVar() async {
    myVariable = ...;
  }
}

如果不好,还有什么办法呢?谢谢

推荐答案

如果您的类只是一个服务/存储库,不会涉及更新状态和重新构建小部件,那么明智的做法是使用Provider作为优雅的依赖项注入.

如果您的变量myVariable将是某种状态,您的小部件应该基于该状态重新构建,那么

  • 在最简单的情况下,使用StateProvider|FutureProvider
  • 如果您的状态需要复杂的/多种方法来更改,则使用(Async)NotifierProvider

在后一种情况下,您的代码将如下所示:

final variableProvider = NotifierProvider<TodosNotifier, List<Map<String, dynamic>>?>(VariableNotifier.new);

class VariableNotifier extends Notifier<List<Map<String, dynamic>>?> {

  @override
  List<Map<String, dynamic>>? build() {
    return null;
  }

  Future<void> toDoWithMyVar() async {
    state = ...;
  }

您可能还应该研究一下像freezed这样的包,它们允许您方便地管理不可变对象.事实是,要使这些提供程序正常工作,您的状态必须是不可变的,并正确重新定义hashcode|==

Flutter相关问答推荐

如何在列表磁贴上添加行

在Flutter中,CachedNetworks Image不工作(不从CachedData加载)

如何在Flutter 屏幕中添加箭头形状

想更新ListView上的索引点击块Flutter

material 3芯片,不能go 除输入芯片小部件上的轮廓

遇到图像路径格式问题

如何让经过Firebase身份验证的用户能够将Zip文件上载到Firebase云存储?

Android Studio扩展控件上未加载Google map

怎么才能像这样在摆动着这些曲线呢?

BaseInputfield和Textfield有什么不同?

Flutter中有没有办法区分鼠标左右平移?

Flutter如何从深入嵌套的小部件中打开抽屉?

使用Flutter项目设置Firebase遇到困难?这些解决方案或许能帮到你!

用户文档 ID 与 Firestore 中的用户 ID 相同

转换函数上传文件上传Uint8List

如何使这种相机叠加在Flutter 中?

Android Electric eel Mac M1:运行 flutter doctor -v 时无法找到Bundle 的 java 版本

Flutter Serverpod 在示例项目上返回 400 错误

在 flutter 中自定义 agora 视频通话 UI

如何在flutter中共享容器和gridview之间的滚动条?