StreamProvider 在 AsyncValue 更新时不重建小部件树

时间:2021-01-21 15:11:15

标签: flutter dart state-management riverpod

我要监听 firebase AuthStateChanges 流并为流提供 streamProvider 以根据流值更改视图。我这样做了:

class AuthService {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  Stream get currentUser => _auth.authStateChanges();
}

final userStream = StreamProvider.autoDispose((ref) => AuthService().currentUser);

class AuthenticationWrapper extends ConsumerWidget {
  @override
  Widget build(BuildContext context, ScopedReader watch) {
    final user = watch(userStream);
    print('AutenticationWrapper build method got called');
    return user.when(
      data: (data) {
        if (data?.uid == null) {
          print('I am currently Logged out ?');
          return LogInPage();
        } else {
          print('I am logged in user?');
          return HomePage();
        }
      },
      loading: () => CircularProgressIndicator(),
      error: (e, s) => Text('Oops'),
    );
  }
}

我希望在更改 AsyncValuestreamProvider 时呈现登录页面。上面的代码没有按预期工作;实际上,它会打印消息,但不会返回它应该返回的 Widget。但是,当我热重启应用程序时,它会根据流值呈现正确的 Widget。

为什么 build 方法在此:final user = watch(userStream); 收到更新时不重新呈现?

1 个答案:

答案 0 :(得分:0)

我认为您可能应该在流本身更新时收到通知 watch(userStream.stream)。不过我没怎么玩过 StreamProvider,所以我可能是错的。