价值提供者首次返回null

问题描述

我有以下应用,其中我使用FirebaseUser提供了MultiProvider的流。

void main() => runApp(App());

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        StreamProvider<Position>(
          create: (_) => LocationService().location,),StreamProvider<FirebaseUser>(
          create: (_) => AuthenticationService().user,],child: MaterialApp(
        debugShowCheckedModeBanner: false,title: "title",theme: ThemeData(
          primarySwatch: Colors.indigo,accentColor: Colors.indigoAccent,home: HomeScreen(),);
  }
}

流的生成如下:

class AuthenticationService {
    Stream<FirebaseUser> get user {
        return FirebaseAuth.instance.onAuthStateChanged;
    }
}

用户使用Firebase登录并在HomeScreen中访问流时,我第一次获得的值为null。从第二次开始,它运行良好。

class HomeScreenState extends State<HomeScreen> {
  FirebaseUser u;

  @override
  void initState() {
    u = Provider.of<FirebaseUser>(context,listen: false);
    print(u);
    super.initState();
  }
}

如何确保Provider.of返回一个有效值(即,仅当用户实际上未登录时才返回null,而在登录时返回一个non-null值)或某个值undefined值的种类(如果尚不知道)?

解决方法

在使用multiprovider和Provider.of<FirebaseUser>().时,我也遇到了类似的问题 首次provider.of返回null,然后如果用户已登录,则返回有效用户。

作为一种解决方法,我在下面做

  @override
  void initState() {
    _initialiseFirebase();
    super.initState();
  }

  Future _initialiseFirebase() async {
    try {
      await Firebase.initializeApp();
      sub = FirebaseAuth.instance.authStateChanges().listen((user) {
        //  listener is called on registered. So we need to skip calling viewmodel for first time.
        if (_authListenerRegistered) _viewmodel.verifyAuth(user);
        _authListenerRegistered = true;
      });
    } catch (e) {
      setState(() {
        _error = true;
      });
    }
  }