【问题标题】:Unable to navigate based on auth state in flutter-firebase无法根据flutter-firebase中的身份验证状态导航
【发布时间】:2019-01-14 13:45:40
【问题描述】:

我在我的 android 应用程序中使用 firebase 作为后端服务。如果用户未登录,我正在尝试将用户导航到登录屏幕。我正在检查 ma​​in.dart 文件中的身份验证状态. 当应用程序启动时,我在我的 logcat 窗口中得到了一些东西,比如:

E/FirebaseInstanceId(10239): Failed to resolve target intent service, skipping classname enforcement
E/FirebaseInstanceId(10239): Error while delivering the message: ServiceIntent not found.

下面是我的代码:

ma​​in.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
import './home.dart';
import './orders.dart';
import './account.dart';
import './login.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

@override
Widget build(BuildContext context) {
return MaterialApp(
  home: MyTabs(),
  debugShowCheckedModeBanner: false,
  routes: <String,WidgetBuilder>{
    '/login':(BuildContext context) => Login()
  },
  theme: ThemeData(
    primaryColor: Colors.white,
    primaryColorDark: Colors.grey,
    accentColor: Colors.green
   ),
  );
 }
}

class MyTabs extends StatefulWidget {

@override
_MyTabsState createState() => _MyTabsState();
}


class _MyTabsState extends State<MyTabs> {

FirebaseAuth auth = FirebaseAuth.instance;

int selectedIndex = 0;
final pages = [Home(),Orders(),Account()];

void choosePage(int index){

setState(() {

    selectedIndex = index;
  });
}

@override
void initState() {
super.initState();

  if(auth.currentUser() == null){

     Navigator.of(context).pushReplacementNamed("/login");
  }
}

 @override
 Widget build(BuildContext context) {
 return Scaffold(
     appBar: AppBar(
       title: Text("Tiffino")
     ),
     body: pages[selectedIndex],
     bottomNavigationBar: BottomNavigationBar(
      currentIndex: selectedIndex,
      fixedColor: Colors.black,
      onTap: choosePage,
      items: [
        BottomNavigationBarItem(
           icon: Icon(Icons.home),
           title: Text("Home")
        ),
        BottomNavigationBarItem(
           icon: Icon(Icons.list),
           title: Text("Orders")
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.person),
          title: Text("Account")
         )
        ]
      )      
    );
  }
}

如果我在上面的代码中做错了,请有人纠正我。

谢谢

【问题讨论】:

    标签: android firebase flutter firebase-authentication


    【解决方案1】:

    auth.currentUser() 方法返回一个 Future,这意味着您应该使用 then() 方法来解析它,或者在异步方法中使用 await 运算符,而不是立即检查它是否为空。## 标题 ##

    用异步调用试试这个,而不是使用 then 和 catchError,这会导致调用更多的方法:

    @override
    void initState() {
        super.initState();
        _getCurrentUser();
    }
    
    /// Checks if the user is logged in
    _getCurrentUser() async {
        //Notice here the await operator, instead of using then() etc.
        FirebaseUser mCurrentUser = await auth.currentUser();
        if(mCurrentUser != null){
          authSuccess(mCurrentUser);
        } else {
          // not logged in
          Navigator.of(context).pushReplacementNamed("/login");
        }
    }
    
    void authSuccess(FirebaseUser user){
        // User is logged in, do something if needed
    }
    

    【讨论】:

    • 用户登录后如何获取firebase uid。
    • @Digvijay 使用您获得的user 变量,当前用户,使用user.uid。另外,如果这个答案适合你,请点击投票按钮下方的绿色对勾接受它。
    • 当我尝试 mCurrentUser = await auth.currentUser();它显示未定义名称 mCurrentUser 的错误。
    • 得到它实际上是它的 FirebaseUser mCurrentUser,无论如何感谢兄弟帮助它工作正常。
    • @Digvijay 是的,对不起!我没有注意到变量是在外部范围内声明的。我修复了它以确保它适用于其他人。很高兴为您提供帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-08-15
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多