Flutter Riverpod - 使用异步值初始化
Flutter Riverpod - Initialize with async values
我正在尝试学习 Riverpod,我有一个 ChangeNotifierProvider
,其中有一些字段需要使用从异步操作返回的值进行初始化。这可能吗,据我所知,我无法异步创建 ChangeNotifierProvider
?
示例ChangeNotifierProvider
class SomeState extends ChangeNotifier {
String email = '';
// needs to be set to value returned from
// shared preferences upon init
}
如果不可能,知道我想将其值初始化为从异步方法返回的值,是否有其他提供程序可以更好地工作?
是的,作为Abion47的评论是可能的。让我在下面的代码中显示更多细节
class EmailNotifier extends ChangeNotifier {
String email = '';
void load() {
functionReturnFuture.then(value) {
setEmail(value);
}
}
void setEmail(String value) {
// email loaded but not changed, so no need to notify the listeners
if(value == email) return;
// email has loaded and change then we notify listeners
email = value;
notifyListeners();
}
}
var emailNotifier = ChangeNotifierProvider<EmailNotifier>((ref) {
var notifier = EmailNotifier();
// load the email asynchronously, once it is loaded then the EmailNotifier will trigger the UI update with notifyListeners
notifier.load();
return notifier;
});
由于我们独立于 Flutter UI 管理状态,因此没有什么可以阻止您使用 运行 代码来触发状态更改,例如在我们的案例中 notifier.load().
在 notifier.load() 并设置电子邮件后,提供商将使用 notifyListeners()[=22 触发 UI 更改=].
您可以使用 FutureProvider 获得类似的结果。
我正在尝试学习 Riverpod,我有一个 ChangeNotifierProvider
,其中有一些字段需要使用从异步操作返回的值进行初始化。这可能吗,据我所知,我无法异步创建 ChangeNotifierProvider
?
示例ChangeNotifierProvider
class SomeState extends ChangeNotifier {
String email = '';
// needs to be set to value returned from
// shared preferences upon init
}
如果不可能,知道我想将其值初始化为从异步方法返回的值,是否有其他提供程序可以更好地工作?
是的,作为Abion47的评论是可能的。让我在下面的代码中显示更多细节
class EmailNotifier extends ChangeNotifier {
String email = '';
void load() {
functionReturnFuture.then(value) {
setEmail(value);
}
}
void setEmail(String value) {
// email loaded but not changed, so no need to notify the listeners
if(value == email) return;
// email has loaded and change then we notify listeners
email = value;
notifyListeners();
}
}
var emailNotifier = ChangeNotifierProvider<EmailNotifier>((ref) {
var notifier = EmailNotifier();
// load the email asynchronously, once it is loaded then the EmailNotifier will trigger the UI update with notifyListeners
notifier.load();
return notifier;
});
由于我们独立于 Flutter UI 管理状态,因此没有什么可以阻止您使用 运行 代码来触发状态更改,例如在我们的案例中 notifier.load().
在 notifier.load() 并设置电子邮件后,提供商将使用 notifyListeners()[=22 触发 UI 更改=].
您可以使用 FutureProvider 获得类似的结果。