Flutter 提供程序不更新变量值

标签 flutter dart firebase-authentication

上下文:我正在尝试使用 firebase_auth 为我的应用创建身份验证流程,用户可以通过个人资料页面上的按钮注销。

最初,注销按钮位于登录后立即出现的主页(名为 Maps)上。这是由在成功登录时打开 Maps 的包装类调用的。

但是,当用户单击“个人资料”页面中的退出按钮时,他们不会回到登录屏幕,直到他们返回“ map ”页面。

预期结果:

  • 用户登录成功。
  • 身份验证端创建一个流,将数据发送到 Wrapper 类,指示成功登录。
  • 如果流不返回 null,则 Wrapper 返回主屏幕,否则留在登录屏幕上。
  • 用户进入配置文件屏幕。
  • 用户点击退出按钮并返回登录屏幕。这应该通过包装器发生。

  • 实际:
  • 用户登录成功。
  • 身份验证端创建一个流,将数据发送到包装器,指示登录成功。
  • 如果流不返回 null,则 Wrapper 返回主屏幕,否则留在登录屏幕上。
  • 用户进入设置屏幕。
  • 用户点击退出按钮,前端没有任何 react (控制台显示用户已在后端退出。
  • 用户返回主屏幕,然后被发送到登录屏幕。

  • 代码(分步):
  • 用户登录
  • 设置流 + 退出用户的代码(不确定是否相关)

  •  // auth change user stream
      // set up a stream so that everytime someone signs in/out, we get a response
      // down the stream
      Stream<User> get user {
        return _auth.onAuthStateChanged
            .map(_userFromFirebaseUser); // same as line above
      }
    
    // sign out
      Future signOut() async {
        try {
          return await _auth.signOut();
        } catch (e) {
          print(e.toString());
          return null;
        }
      }
    
  • 包装

  • class Wrapper extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        final user = Provider.of<User>(context);
    
        // return either Maps or Login widget
        if (user == null) {
          return Authenticate();
        } else {
          return MapsPage();
        }
      }
    }
    
  • 相关 map 代码(此处不再使用StreamProvider登录)

  • // Function is for when a navigation icon is tapped
      void onTabTapped(int index) {
        setState(() {
          _selectedIndex = index;
        });
    
        if (index == 1) {
          startCamera();
        } else if (index == 2) {
          Navigator.of(context).push(MaterialPageRoute(
              builder: (BuildContext context) => new UserProfile()));
        }
      }
    
    @override
      Widget build(BuildContext context) {
    
        return StreamProvider<QuerySnapshot>.value(
            value: DatabaseService().users,
            child: Scaffold(
                body: // some code here,
    
                bottomNavigationBar: BottomNavigationBar(
                  items: const <BottomNavigationBarItem>[
                    BottomNavigationBarItem(
                      icon: Icon(Icons.map),
                      title: Text('Map'),
                    ),
                    BottomNavigationBarItem(
                      icon: Icon(Icons.camera),
                      title: Text("Camera"),
                    ),
                    BottomNavigationBarItem(
                      icon: Icon(Icons.account_circle),
                      title: Text('Profile'),
                    ),
                  ],
                  currentIndex: _selectedIndex,
                  selectedItemColor: Colors.white,
                  backgroundColor: Color(0xFFFFA600),
                  onTap: onTabTapped,
                )));
      }
    
  • 相关用户资料代码

  • final AuthService _auth = AuthService();
    
    @override
      Widget build(BuildContext context) {
        return StreamProvider<User>.value(
          value: AuthService().user,
          child: Scaffold(
              body: Column(
                children: <Widget>[
                  ButtonTheme(
                    child: FlatButton(
                      child: const Text('Log Out'),
                      onPressed: () async {
                        await _auth.signOut();
                      },
                    ),
                  )
                ],
              ),
              ),
        );
      }
    

    如果需要更多信息,请告诉我,并提前致谢。

    最佳答案

    当我退出我的应用程序时,我通常会执行以下操作:

    onTap: () {
      Navigator.popUntil(context, ModalRoute.withName("/"));
      _auth.signOut();
    },
    

    试试这个,它可能会起作用。

    关于Flutter 提供程序不更新变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61685391/

    相关文章:

    flutter - 用列表<Objects>或List <Map <String,String >>填充多选

    flutter - textDirection != null assert is not null ListTile

    dart - 返回 Map 的 RawChip

    dart - 将参数传递给 Dart Polymer 元素

    reactjs - Firebase grecaptcha 未定义 react

    ios - 如何禁用 Firebase 电话身份验证的限制?

    dart - 从另一个方法内的方法获取当前结果

    android - 运行 flutter 应用程序时出现异常。检索 ro.product.cpu.abi 的设备属性时出错

    javascript - flutter 导航使上一个屏幕在底部可见

    android - com.firebase.ui.auth.FirebaseUiException : Provider error - Firebase-UI Authentication Facebook login not working