【问题标题】:Stateless Widget not Updating with StreamProvider无状态小部件未使用 StreamProvider 进行更新
【发布时间】:2020-09-01 08:19:52
【问题描述】:

我正在尝试使用 StreamProvider 让我的应用在用户登录时显示 Features 小部件。这是我的代码:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'auth/auth.dart';
import 'features/features.dart';

void main() => runApp(
      StreamProvider<FirebaseUser>(
          create: (context) => FirebaseAuth.instance.onAuthStateChanged,
          child: MaterialApp(home: MyApp()),
          updateShouldNotify: (_, __) => true),
    );

class MyApp extends StatelessWidget {
  static reload(BuildContext context) {
    Navigator.pushAndRemoveUntil(
      context,
      MaterialPageRoute(builder: (context) => MyApp()),
      (Route<dynamic> route) => false,
    );
  }

  @override
  Widget build(BuildContext context) {
    var _user = Provider.of<FirebaseUser>(context);
    print('USER ISSUED: ' + _user.toString());
    if (_user == null) return SignInPage();
    if (_user != null) return Features();
  }
}

我必须创建reload() 方法,该方法由嵌套在SignInPage 下方的各种身份验证小部件(google、facebook、密码)调用,以更新MyApp 的显示。我原以为Provider.of&lt;FirebaseUser&gt; 会自动重建我的应用程序,而无需调用reload()Provider 确实有效。每当 FirebaseAuth 更新用户时,它都会打印 USER ISSUED: some_user...。为什么在user == null时不执行后面两行代码返回我的SignInPage,在用户登录成功时不返回Features页面?

我是 FlutterFire 的新手,但来自 AngularFire,我希望它能够顺利运行。

【问题讨论】:

    标签: firebase flutter firebase-authentication flutter-provider


    【解决方案1】:

    我认为你应该使用:

    // (firebase_auth 0.9.0)
    
    StreamProvider.value(
        value: FirebaseAuth.instance.onAuthStateChanged,
        child: MaterialApp(home: MyApp()),
      ),
    
    

    因为根据docsStreamProvider.value 监听value 并将其公开给所有StreamProvider 后代。

    但是,这里应该首选使用StreamBuilder,因为您可能想检查是否建立了连接,否则每次应用打开时它可能会显示登录屏幕的一瞥,然后适度自动转到主屏幕网络条件,如果缓存了用户身份验证。

    // (fireabse_auth 0.18.4)
    
    StreamBuilder(
        stream: FirebaseAuth.instance.authStateChanges(),
        builder: (_, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return Loading();
          }
          if (snapshot.data is User && snapshot.data != null) {
            return Home();
          }
          return Authenticate();
        })
    

    还有,

    我原以为 Provider.of 会自动重建我的应用程序

    StreamProvider 负责监听流,将其暴露给后代并更新消费者的状态,而不是 Provider.of&lt;T&gt;(context)Provider.of&lt;T&gt;(context) 只是尝试从T 的最近父提供者访问T 类型的数据。

    【讨论】:

      猜你喜欢
      • 2019-12-13
      • 2021-06-11
      • 2018-09-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2021-01-08
      相关资源
      最近更新 更多