Value Provider 首次返回 null

Posted

技术标签:

【中文标题】Value Provider 首次返回 null【英文标题】:Value Provider returns null for the first time 【发布时间】:2020-12-11 09:19:28 【问题描述】:

我有以下应用程序,我使用MultiProvider 提供FirebaseUser 流。

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 值如果值未知?

【问题讨论】:

如果用户登录,您可以使用共享首选项来存储布尔值。查看pub.dev/packages/shared_preferences 【参考方案1】:

我在使用 multiprovider 和 Provider.of&lt;FirebaseUser&gt;(). 时也看到了类似的问题 第一次 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;
      );
    
  

【讨论】:

以上是关于Value Provider 首次返回 null的主要内容,如果未能解决你的问题,请参考以下文章

除了 value 道具之外的任何道具都可以在 Context.Provider 中工作吗

无法取消引用插入到向量中的类对象指针

NETWORK_PROVIDER 和 GPS_PROVIDER 在片段中返回 null

Provider.of 总是返回 null Flutter

为啥在 android 中使用 NETWORK_PROVIDER 时 location.getSpeed() 总是返回 0?

Flutter之跨组件状态共享Provider剖析