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();
}
}
希望对您有所帮助。
我是 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();
}
}
希望对您有所帮助。