使用Riverpod提供程序运行后台逻辑的最佳方式



我有一个StreamProvider来公开用户。我想在后台运行基于提供程序的逻辑。我不想使用我的Widget树中的提供者。我感兴趣的是:

  • 在哪里初始化逻辑-main.dart合适吗
  • 如果逻辑与ConsumerWidget无关,我将在哪里访问我的WidgetRef
  • 我应该如何封装我的逻辑?我应该使用哪些类或方法
final currentUserProvider = StreamProvider<User?>((ref){
return CurrentUserStream(); // The details don't matter
});

下面我有几个简化的用例。

用例1:在某个地方应用我的userId

我想确保userId用于我的分析服务

final User? user = ref.watch(currentUserProvider);
if (user != null) {
// Update analytics to track the userId
}

用例2:为用户管理流

在这种情况下,在用户更改后,我有一个dispose方法来整理是至关重要的。如果用户注销/切换帐户,则会触发此操作。

final User? user = ref.watch(currentUserProvider);
/// Streams related to the user
List<StreamSubscription> userStreamSubscriptions;
if (user != null) {
// The details don't matter
}
/// Cancels the user Streams when the user changes
@override
void dispose() {
for (var subscription in userStreamSubscriptions) {
subscription.cancel();
}
super.dispose();
}

我不知道这能对你有帮助吗,也不会对你有实际意义,但无论如何,经过一点研究,我明白了一种方法。对于后台逻辑,我使用了ConsumerStatefulWidget和他的状态。在state类中,我们需要在initState方法中声明login,因为state类有一个ref字段。我的示例应用程序(加上fluft_hooks,但不多(https://github.com/nicourrrn/flutter-state-managment

最新更新