firebase - SetState为String会返回null,使用Flutter进行Firestore

标签 firebase flutter dart google-cloud-firestore

我有一个初始屏幕,我想控制跟随:
1.如果用户已注销,请将该用户带到OnBoardingScreen。
2.如果用户已登录,但Firestore中没有数据。将用户带到SetupAccountPage
3.如果用户已登录并且有数据可转到主页。
我的问题是字符串值(_controller)返回null。当用户注销时,并且在用户登录时工作正常。我很困惑。我给了代码一些加载时间,但没有帮助。

请为任何有想法的人提供帮助。
下面是我的代码

import 'dart:async';

import 'package:app/model/user.dart';
import 'package:app/pages/HomePage.dart';
import 'package:app/pages/SetupAccountPage.dart';
import 'package:app/screens/home/home.dart';
import 'package:app/screens/onboarding.dart';
import 'package:app/screens/setup_profile.dart';
import 'package:app/shared/loading.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class Wrapper extends StatefulWidget {
  @override
  _WrapperState createState() => _WrapperState();
}

class _WrapperState extends State<Wrapper> {
  //FirebaseUser user;
  String onlineUserId;
  String _controller;

  @override
  void initState() {
    super.initState();
    _checkUser();
    Timer(Duration(seconds: 5), () {
      print('done');
      if (_controller == 'out') {
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => OnBoardingScreen(),
          ),
        );
      } else if (_controller == 'info') {
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => SetupAccountPage(),
          ),
        );
      } else if (_controller == 'home') {
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => HomePage(),
          ),
        );
      }
      ;
    });
  }

  _checkUser() async {
    final FirebaseUser user = await FirebaseAuth.instance.currentUser();
    final uid = user.uid;

    if (await FirebaseAuth.instance.currentUser() == null) {
      setState(() {
        _controller = 'out';
      });
    } else {
      final snapShot =
          await Firestore.instance.collection('Users').document(user.uid).get();
      if (snapShot.exists) {
        setState(() {
          _controller = 'home';
        });
        // Document with id == docId doesn't exist.
      } else {
        setState(() {
          _controller = 'info';
        });
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        fit: StackFit.expand,
        children: <Widget>[
          Container(
            decoration: BoxDecoration(color: Colors.redAccent),
          ),
          Column(
            mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              Expanded(
                flex: 2,
                child: Container(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      CircleAvatar(
                        backgroundColor: Colors.white,
                        radius: 50.0,
                        child: Icon(
                          Icons.shopping_cart,
                          color: Colors.greenAccent,
                          size: 50.0,
                        ),
                      ),
                      Padding(
                        padding: EdgeInsets.only(top: 10.0),
                      ),
                      Text(
                        'this is a name',
                        style: TextStyle(
                            color: Colors.white,
                            fontWeight: FontWeight.bold,
                            fontSize: 24.0),
                      )
                    ],
                  ),
                ),
              ),
              Expanded(
                flex: 1,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    CircularProgressIndicator(),
                    Padding(
                      padding: EdgeInsets.only(top: 20.0),
                    ),
                    Text(
                      'another name',
                      softWrap: true,
                      textAlign: TextAlign.center,
                      style: TextStyle(
                          fontWeight: FontWeight.bold,
                          fontSize: 18.0,
                          color: Colors.white),
                    )
                  ],
                ),
              )
            ],
          )
        ],
      ),
    );
  }
}

最佳答案

我终于找到了答案。原因是让用户返回了 future ,这是缺少的代码。

Future<FirebaseUser> getUser() async {
    return await _auth.currentUser();
  }

关于firebase - SetState为String会返回null,使用Flutter进行Firestore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61176846/

相关文章:

android - Firebase Cloud Messaging 为一个主题订阅多个 token

android - FirebaseAuth Admin 中的这一点是什么意思?

java - 查询数据库以确保新用户不会使用已有的用户名进行注册

flutter - 快照错误类型 'int' 不是类型 'String' 的子类型

asp.net - Dart可以使用WCF服务吗?

javascript - 无效查询。您不能使用多个 'in' 过滤器

dart - 崩溃的ListView.builder

dart - 在 Flutter 中获取 BuildContext 以进行本地化

dart - 如何使用传感器 flutter 包开发计步器?

flutter - 无法使用来自 Future 函数中的参数的数据