Flutter 中基本的 Riverpod Provider 有什么意义?

What is the point of a basic Riverpod Provider in Flutter?

我是 Flutter 的新手,现在正在实施 Riverpod。我研究了许多指南和教程,它们似乎都以相同的简单示例开始——要么是提供“Hello World”的基本提供程序,要么是一个整数,如下所示:

final countProvider = Provider<Int>((ref) => 0);

final hellowWorldProvider = Provider<String>((ref) => "Hello world");

然后在 StatelessWidget 中有一个 Consumer 对象,它调用此提供者的 watch() 来获取值。

我的问题是,这样做有什么意义?我发现的教程中没有一个显示了修改提供者返回的值的方法,因此它总是相同的。在这里使用提供者有什么优势?为什么在一个不变的值上调用 watch() ?您可以在 Widget 中对值进行硬编码,或者如果不赞成这样做,请使用常量文件或等效文件。

请告诉我这里缺少什么,谢谢!

这里有 2 个用例。

1.知道用户是否注销

基本 Provider 的一个简单 use-case 是知道用户是否登录而不直接依赖 userProvider

看看这个模型和供应商:

class UserModel {
  final String fullName;
  final String email;

  UserModel(this.fullName, this.email);
}

final userProvider = StateProvider<UserModel?>((ref) {
  return UserModel("Person User", "person@whosebug.com");
});

final isLoggedInProvider = Provider<bool>((ref) {
  bool isLoggedIn = ref.watch(userProvider) != null;
  return isLoggedIn;
});

假设我们有一个将 userProvider 状态值设置为 null 的注销方法:

void logout(WidgetRef ref) {
  ref.read(userProvider.state).state = null;
}

立即注销被调用,每个监听isLoggedInProvider的消费者都会对用户的“注销”状态做出反应。

2。依赖注入

假设我们有一个基本的 Provider,它提供了一个像这样的存储库:

final dataRepositoryProvider = Provider<DataRepository>((ref) {
  return DataRepository();
});

class DataRepository {
  List<String> _data = [];
  List<String> getSortedData() {
    _data.sort();
    return _data;
  }
}

还有一个 StateNotifierProvider 依赖于 DataRepository - 如果我们不想继续创建 DataRepository 的新对象,它可以像这样注入:

final dataStateNotifierProvider = StateNotifierProvider<DataStateNotifier, List<String>>((ref) {
  var repo = ref.read(dataRepositoryProvider);
  return DataStateNotifier(repo);
});

class DataStateNotifier extends StateNotifier<List<String>> {
  final DataRepository _dataRepository;
  DataStateNotifier(this._dataRepository) : super([]);

  void getData(){
    state = _dataRepository.getSortedData();
  }
}

希望对您有所帮助。