从Firebase Auth或sharedpreference获得Flutter更新变量

时间:2019-02-23 20:13:51

标签: flutter firebase-authentication

我几乎已经迷路了几天,我有一个Text()小部件并在其中传递了一个变量,该变量包含Firebase auth的用户名。问题是我想检查用户是否登录。如果用户登录,我可以从Firebase中完成用户名,但是如果未登录,它会崩溃。我尝试使用共享首选项和Firebase当前用户,但仍无法正常工作。 我尝试过的:

    class _HomePageState extends State<HomePage> {

  String username = 'user name';
  String userEmail = 'email address';

  @override
  void initState() {
    super.initState();
    getCurrentUserName().then((value) {
      username = value;
    });
    getLanguage();
  }

  String language;
  var refreshKey = GlobalKey<RefreshIndicatorState>();
  Map data;

  String news;
  String signIn;
  List<Tab> tabs;
  ListView sideBarTabs;

  Future<String> getCurrentUserName() {
    return new Future<String>.delayed(new Duration(milliseconds: 10000),() async {
      //Do a long running task. E.g. Network Call.
      final FirebaseUser currentUser = await _auth.currentUser();
      //assert(user.uid == currentUser.uid);

      username = currentUser.displayName;
      return username;
    });
  }

  Future getLanguage() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    int lang = prefs.getInt('Language');

    setState(() {
      if (lang != 1) {
        language = 'ku';
        news = 'هه‌وا';
        signIn = 'بچۆ ژووره‌وه‌';
        sideBarTabs = ListView(
          children: <Widget>[
            new UserAccountsDrawerHeader(
              accountName: Text(username),
              accountEmail: Text(userEmail),
              currentAccountPicture: GestureDetector(
                child: new CircleAvatar(
                  backgroundColor: Colors.black,
                  child: Icon(Icons.person),
                ),
              ),
              decoration: new BoxDecoration(
                color: Colors.pink,
              ),
            ),
            InkWell(
                onTap: () {
                  var route = new MaterialPageRoute(
                    builder: (BuildContext context) => new HomePage(),
                  );
                  Navigator.of(context).push(route);
                },
                child: ListTile(
                  title: Text(news),
                  leading: Icon(Icons.featured_play_list),
                )),
            InkWell(
                onTap: () {
                  _SignInWithGoogle();
                },
                child: ListTile(
                  title: Text(signIn),
                  leading: Icon(Icons.person),
                )),
          ],
        );
      } else{
        language = 'ar';
        news = 'أخبار';
        signIn = 'تسجيل الدخول';
        sideBarTabs = ListView(
          children: <Widget>[
            new UserAccountsDrawerHeader(
              accountName: Text(username),
              accountEmail: Text(userEmail),
              currentAccountPicture: GestureDetector(
                child: new CircleAvatar(
                  backgroundColor: Colors.black,
                  child: Icon(Icons.person),
                ),
              ),
              decoration: new BoxDecoration(
                color: Colors.pink,
              ),
            ),
            InkWell(
                onTap: () {
                  var route = new MaterialPageRoute(
                    builder: (BuildContext context) => new HomePage(),
                  );
                  Navigator.of(context).push(route);
                },
                child: ListTile(
                  title: Text(news),
                  leading: Icon(Icons.featured_play_list),
                )),
            InkWell(
                onTap: () {
                  _SignInWithGoogle();
                },
                child: ListTile(
                  title: Text(signIn),
                  leading: Icon(Icons.person),
                )),
          ],
        );
      }
    });
  }

  Future<String> _SignInWithGoogle() async {
    final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
    await googleUser.authentication;
    final AuthCredential credential = GoogleAuthProvider.getCredential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    final FirebaseUser user = await _auth.signInWithCredential(credential);
    assert(user.email != null);
    assert(user.displayName != null);
    assert(!user.isAnonymous);
    assert(await user.getIdToken() != null);

    final FirebaseUser currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);

    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setString('username', user.displayName);
    prefs.setString('useremail', user.email);
    //prefs.setString('IdToken', await user.getIdToken());
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: DefaultTabController(
        length: 9,
        child: Scaffold(
        appBar: new AppBar(
        bottom: TabBar(
        labelColor: Colors.black,
        isScrollable: true,
        tabs: tabs,
      ),
      iconTheme: new IconThemeData(color: Colors.black),
      backgroundColor: Colors.white,
      title: Text(
        "App Name",
        style: TextStyle(color: Colors.black),
      ),
    ),
    drawer: new Drawer(
    child: sideBarTabs,
    ),

并且具有sharedpreference:

class _HomePageState extends State<HomePage> {

  String username = 'user name';
  String userEmail = 'email address';

  @override
  void initState() {
    super.initState();
    getCurrentUserName().then((value) {
      username = value;
    });
    getLanguage();
  }

  String language;
  var refreshKey = GlobalKey<RefreshIndicatorState>();
  Map data;

  String news;
  String signIn;
  List<Tab> tabs;
  ListView sideBarTabs;

  Future<String> getCurrentUserName() {
    return new Future<String>(() async{
      //Do a long running task. E.g. Network Call.
      SharedPreferences prefs = await SharedPreferences.getInstance();

      username = prefs.getString('username');
      return username;
    });
  }

  Future getLanguage() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    int lang = prefs.getInt('Language');

    setState(() {
      if (lang != 1) {
        language = 'ku';

        news = 'هه‌وا';
        signIn = 'بچۆ ژووره‌وه‌';

        sideBarTabs = ListView(
          children: <Widget>[
            new UserAccountsDrawerHeader(
              accountName: Text(username),
              accountEmail: Text(userEmail),
              currentAccountPicture: GestureDetector(
                child: new CircleAvatar(
                  backgroundColor: Colors.black,
                  child: Icon(Icons.person),
                ),
              ),
              decoration: new BoxDecoration(
                color: Colors.pink,
              ),
            ),
            InkWell(
                onTap: () {
                  var route = new MaterialPageRoute(
                    builder: (BuildContext context) => new HomePage(),
                  );
                  Navigator.of(context).push(route);
                },
                child: ListTile(
                  title: Text(news),
                  leading: Icon(Icons.featured_play_list),
                )),
            InkWell(
                onTap: () {
                  _SignInWithGoogle();
                },
                child: ListTile(
                  title: Text(signIn),
                  leading: Icon(Icons.person),
                )),
          ],
        );
      } else{
        language = 'ar';
        news = 'أخبار';
        signIn = 'تسجيل الدخول';
        sideBarTabs = ListView(
          children: <Widget>[
            new UserAccountsDrawerHeader(
              accountName: Text(username),
              accountEmail: Text(userEmail),
              currentAccountPicture: GestureDetector(
                child: new CircleAvatar(
                  backgroundColor: Colors.black,
                  child: Icon(Icons.person),
                ),
              ),
              decoration: new BoxDecoration(
                color: Colors.pink,
              ),
            ),
            InkWell(
                onTap: () {
                  var route = new MaterialPageRoute(
                    builder: (BuildContext context) => new HomePage(),
                  );
                  Navigator.of(context).push(route);
                },
                child: ListTile(
                  title: Text(news),
                  leading: Icon(Icons.featured_play_list),
                )),
            InkWell(
                onTap: () {
                  _SignInWithGoogle();
                },
                child: ListTile(
                  title: Text(signIn),
                  leading: Icon(Icons.person),
                )),
          ],
        );
      }
    });
  }

  Future<String> _SignInWithGoogle() async {
    final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
    await googleUser.authentication;
    final AuthCredential credential = GoogleAuthProvider.getCredential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    final FirebaseUser user = await _auth.signInWithCredential(credential);
    assert(user.email != null);
    assert(user.displayName != null);
    assert(!user.isAnonymous);
    assert(await user.getIdToken() != null);

    final FirebaseUser currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);

    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setString('username', user.displayName);
    prefs.setString('useremail', user.email);
    //prefs.setString('IdToken', await user.getIdToken());
  }


  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: DefaultTabController(
        length: 9,
        child: Scaffold(
        appBar: new AppBar(
        bottom: TabBar(
        labelColor: Colors.black,
        isScrollable: true,
        tabs: tabs,
      ),
      iconTheme: new IconThemeData(color: Colors.black),
      backgroundColor: Colors.white,
      title: Text(
        "App Name",
        style: TextStyle(color: Colors.black),
      ),
    ),
    drawer: new Drawer(
    child: sideBarTabs,
    ),

并且:

class _HomePageState extends State<HomePage> {

  String username = 'user name';
  String userEmail = 'email address';

  @override
  void initState() {
    super.initState();
    getCurrentUser();
    getLanguage();
  }

  String language;
  var refreshKey = GlobalKey<RefreshIndicatorState>();
  Map data;

  String news;
  String signIn;
  List<Tab> tabs;
  ListView sideBarTabs;

  Future<void> getCurrentUser() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();

    setState(() {
      if (_auth.currentUser() != null) {
        username = prefs.getString('username');
        userEmail = prefs.getString('useremail');
      } else{
        username = 'App name';
        userEmail = 'test@app.com';
      }
    });
  }

  Future getLanguage() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    int lang = prefs.getInt('Language');

    setState(() {
      if (lang != 1) {
        language = 'ku';
        news = 'هه‌وا';
        signIn = 'بچۆ ژووره‌وه‌';
        sideBarTabs = ListView(
          children: <Widget>[
            new UserAccountsDrawerHeader(
              accountName: Text(username),
              accountEmail: Text(userEmail),
              currentAccountPicture: GestureDetector(
                child: new CircleAvatar(
                  backgroundColor: Colors.black,
                  child: Icon(Icons.person),
                ),
              ),
              decoration: new BoxDecoration(
                color: Colors.pink,
              ),
            ),
            InkWell(
                onTap: () {
                  var route = new MaterialPageRoute(
                    builder: (BuildContext context) => new HomePage(),
                  );
                  Navigator.of(context).push(route);
                },
                child: ListTile(
                  title: Text(news),
                  leading: Icon(Icons.featured_play_list),
                )),
            InkWell(
                onTap: () {
                  _SignInWithGoogle();
                },
                child: ListTile(
                  title: Text(signIn),
                  leading: Icon(Icons.person),
                )),
          ],
        );
      } else{
        language = 'ar';
        news = 'أخبار';
        signIn = 'تسجيل الدخول';
        sideBarTabs = ListView(
          children: <Widget>[
            new UserAccountsDrawerHeader(
              accountName: Text(username),
              accountEmail: Text(userEmail),
              currentAccountPicture: GestureDetector(
                child: new CircleAvatar(
                  backgroundColor: Colors.black,
                  child: Icon(Icons.person),
                ),
              ),
              decoration: new BoxDecoration(
                color: Colors.pink,
              ),
            ),
            InkWell(
                onTap: () {
                  var route = new MaterialPageRoute(
                    builder: (BuildContext context) => new HomePage(),
                  );
                  Navigator.of(context).push(route);
                },
                child: ListTile(
                  title: Text(news),
                  leading: Icon(Icons.featured_play_list),
                )),
            InkWell(
                onTap: () {
                  _SignInWithGoogle();
                },
                child: ListTile(
                  title: Text(signIn),
                  leading: Icon(Icons.person),
                )),
          ],
        );
      }
    });

  }

  Future<String> _SignInWithGoogle() async {
    final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
    await googleUser.authentication;
    final AuthCredential credential = GoogleAuthProvider.getCredential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    final FirebaseUser user = await _auth.signInWithCredential(credential);
    assert(user.email != null);
    assert(user.displayName != null);
    assert(!user.isAnonymous);
    assert(await user.getIdToken() != null);

    final FirebaseUser currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);

    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setString('username', user.displayName);
    prefs.setString('useremail', user.email);
    //prefs.setString('IdToken', await user.getIdToken());
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: DefaultTabController(
        length: 9,
        child: Scaffold(
        appBar: new AppBar(
        bottom: TabBar(
        labelColor: Colors.black,
        isScrollable: true,
        tabs: tabs,
      ),
      iconTheme: new IconThemeData(color: Colors.black),
      backgroundColor: Colors.white,
      title: Text(
        "App Name",
        style: TextStyle(color: Colors.black),
      ),
    ),
    drawer: new Drawer(
    child: sideBarTabs,
    ),

我知道我的代码有点复杂,因为我的选项卡是动态的,这就是问题所在,但是我需要它。问题是应用程序运行时的用户名变量,而无论用户是否登录,或者用户登录时在我上面的某些代码中的应用程序名称都显示了名称,或者如果用户尚未登录,则应用程序崩溃。 / p>

1 个答案:

答案 0 :(得分:0)

您的代码不可读,但是如果您需要知道是否已有用户登录,然后构建UI元素,则应使用FutureBuilder来完成。

摘要为:

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<FirebaseUser>(
      future: FirebaseAuth.instance.currentUser(),
      builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot){
        if (snapshot.hasData){
          //then there is user logged, so you return your layout here..
          var user = snapshot.data; // this returns you logged firebase user

          return MyWidgetForLoggedUsers( user );
        }

        // so there is no user logged
        return Container(
          child: Text("There is no user active"),
        );

      },
    );
  }

在构建器内部,您可以使用snapshot.connectionState进行更精细的控制。另一种选择是使用具有相同原理的StreamBuilder