簡體   English   中英

Flutter/FirebaseAuth:如何在應用啟動時自動登錄用戶?

[英]Flutter/FirebaseAuth : How can I autologin a user at app launch?

我有以下方法來查看用戶是否已經登錄,在這種情況下我確實登錄了並且getCurrentUser()函數有效,因為在控制台中它確實返回“USER IS NOT NULL”但主頁小部件仍然為空給我“小部件庫的異常捕獲”,說家不能為空之類的東西。

用戶API.dart

Future<FirebaseUser> getCurrentUser() async {
FirebaseUser user = await FirebaseAuth.instance.currentUser();

if (user != null) {
  return user;
} else {
  return null;
}
}

main.dart

class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
Widget home;

APIs().usersAPI.getCurrentUser().then((u) {
  if (u == null) {
    print('USER IS NULL');
    home = WelcomePage();
  } else {
    print('USER IS NOT NULL');
    home = FeedPage();
  }
});

return MaterialApp(
  title: "Jedi",
  debugShowCheckedModeBanner: false,
  home: home,
  routes: {
    '/login' : (context) => new LoginPage(),
    '/feed' : (context) => new FeedPage(),
  },
);
}
}

需要將 App 設為StatefulWidget並在設置主頁時調用setState

setState(() {
   home = WelcomePage();
});

setState(() {
   home = FeedPage();
});

另外,您可能需要在 API 返回之前將主頁設置為 null 以外的值。

使用FutureBuilder可能是更好的模式。 這樣,您將根據您所處的狀態返回正確的 Widget。

return MaterialApp(
  title: "Jedi",
  debugShowCheckedModeBanner: false,
  home: FutureBuilder<FirebaseUser>(
     future: APIs().usersAPI.getCurrentUser(),
     builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {

        switch (snapshot.connectionState) {
            case ConnectionState.none:
            case ConnectionState.waiting: 
               return CircularProgressIndicator();
            default: 
               if (snapshot.hasError)
                  return Text('Error: ${snapshot.error}');
               else
                 if(snapshot.data == null)
                    return WelcomePage();
                 else 
                    return FeedPage();
        }

     }
  ),
  routes: {
    '/login' : (context) => new LoginPage(),
    '/feed' : (context) => new FeedPage(),
  },
);
}

推進@aqwert 給出的答案,您需要在連接狀態之后檢查用戶是否為空/是否為空。 請參閱下面的工作示例 - 如果用戶不為空,則假定自動登錄。

class LandingPage extends StatelessWidget {//call this class from the main.dart
 @override
 Widget build(BuildContext context) {
  return StreamBuilder<FirebaseUser>(
  stream: FirebaseAuth.instance.onAuthStateChanged,
  builder: (context, snapshot) {
    if (snapshot.connectionState == ConnectionState.active) {
      FirebaseUser user = snapshot.data;//get the user status once the connection is established
      if (user == null) {
        //print("User is NULL::: " + user.toString());
        return LoginScreen();//
      }
      print("User is NOT NULL::: " + user.toString());
      return DefaultScreen();//home screen
    } else {
      return Scaffold(
        body: Center(
          child: CircularProgressIndicator(),//called in case all fails while waiting for connection status
        ),
      );
    }
  },
);

這是我的簡單解決方案,你可以試試這個,首先我們需要一個有狀態的小部件並覆蓋 initState() 中的函數 initState() 我們可以像這樣工作 -

class _MyAppState extends State<MyApp> {
  String initPage;
  final FirebaseAuth auth=FirebaseAuth.instance;
  User currentUser;

  @override
  void initState() {
    super.initState();
    try {
      currentUser = auth.currentUser;
      if(currentUser!=null){
        initPage=Chat.id;
 /*
      here id is static variable which declare as a page name.
       */
      }
      else{
        initPage=Home.id;
      }
    }
    catch(e){
      print(e);
      initPage=Home.id;
    }

  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
 

      initialRoute: initPage,
      routes: {
        Home.id: (context) => Home(),
        Login.id: (context) => Login(),
        Registration.id: (context) => Registration(),
        Chat.id: (context) => Chat(),
      },
    );
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM