

### 前提・実現したいこと

現在、Flutter+Firebaseを利用してアプリ開発について学習を行っています。  
ログイン機能の一貫として以下の機能を実装したいと考えています。

  * 初回ログイン時のみ、ログインページに遷移しログインを行う
  * ログアウトしない限り、アプリを終了した後にアプリを開いてもログインページに遷移しない

自分なりにいくつか調べ、それらを試したのですがそもそもログインページに遷移しませんでした。  
試したコードは以下mainコードです。

具体的な方法としてどのように行うことで以上の機能を実装することができるのでしょうか？  
また、現在FirebaseのEmailとPasswordを利用した機能を実装しているのですが、GoogleログインやFacebookログインの場合でも以上の機能を実装する際には共通の方法なのでしょうか？

Flutter初学者なのでわからないことだらけですがご教授いただけると幸いです。

### 現在実装しているもの

  * FirebaseAuthを利用したログイン機能
  * FirebaseCloudStoreを利用したデータベース

### 試したこと

  * FirebaseAuthのCurrentUserを利用したログイン状態の確認

### 補足情報（FW/ツールのバージョンなど）

**使用したもの**

  * FirebaseAuth
  * FirebaseCloudStore

[code]

    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
    
      final UserState user = UserState();
    
      @override
      Widget build(BuildContext context) {
        return ChangeNotifierProvider<UserState>.value(
            value: user,
            child: MaterialApp(
              //デバックラベル非表示
              debugShowCheckedModeBanner: false,
              title: 'Flutter Demo',
              theme: ThemeData(
                primarySwatch: Colors.blue,
                visualDensity: VisualDensity.adaptivePlatformDensity,
              ),
              home: LoginPage(),
              initialRoute: "/",
              routes:<String, WidgetBuilder>{
    //            "/": (BuildContext context) => LoginPage(),
                AddRecord.routeName: (BuildContext context) => AddRecord(),
                "/login":(BuildContext context) => LoginPage(),
                "/home":(BuildContext context) => PageManager()
              },
            )
        );
      }
    }
    
    class LoginCheck extends StatefulWidget{
      LoginCheck({Key key}) : super(key: key);
    
      @override
      _LoginCheckState createState() => _LoginCheckState();
    
    }
    
    class _LoginCheckState extends State<LoginCheck>{
    
      @override
      void initState(){
        super.initState();
        checkUser();
    
        // TODO: implement initState
    
    
      }
      void checkUser() async{
        final UserState userState = Provider.of<UserState>(context);
        final currentUser = await FirebaseAuth.instance.currentUser();
        print(currentUser);
        if(currentUser == null){
          Navigator.pushReplacementNamed(context,"/login");
        }else{
          userState.setUser(currentUser);
          Navigator.pushReplacementNamed(context, "/home");
        }
      }
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        return Scaffold(
          body: Center(
            child: Container(
              child: Text("Loading..."),
            ),
          ),
        );
      }
    }
    
[/code]


CC BY-SA 4.0
2020-08-11T06:14:27.060
69444
2023-07-02T05:03:00.300
2020-08-11T11:05:07.220
41461
41461
question
firebase flutter dart
Flutterでログイン状態を保持する方法


そもそも、Firebaseのイニシャライズは行っていますか？  
FirebaseSDKを使用する場合、アプリ起動時に Firebase.initializeする必要があります

[code]

        import 'package:flutter/material.dart';
    
    // Import the firebase_core plugin
    import 'package:firebase_core/firebase_core.dart';
    
    void main() {
      WidgetsFlutterBinding.ensureInitialized();
      runApp(App());
    }
    
    class App extends StatelessWidget {
      // Create the initialization Future outside of `build`:
      final Future<FirebaseApp> _initialization = Firebase.initializeApp();
    
      @override
      Widget build(BuildContext context) {
        return FutureBuilder(
          // Initialize FlutterFire:
          future: _initialization,
          builder: (context, snapshot) {
            // Check for errors
            if (snapshot.hasError) {
              return SomethingWentWrong(); //エラーページ
            }
    
            // Once complete, show your application
            if (snapshot.connectionState == ConnectionState.done) {
            //ここに、アプリの本体をおく
              return MyAwesomeApp();
            }
    
            // Otherwise, show something whilst waiting for initialization to complete
            return Loading(); //プログレスインディケーター
          },
        );
      }
    }
    
[/code]

<https://firebase.flutter.dev/docs/overview>  
⇨こちらで、詳細が記載されています

以下は、CurrentUserの判定の例です

[code]

        FirebaseAuth.instance
      .authStateChanges()
      .listen((User user) {
        if (user == null) {
          print('User is currently signed out!');
        } else {
          print('User is signed in!');
        }
      });
    
[/code]

> ログアウトしない限り、アプリを終了した後にアプリを開いてもログインページに遷移しない

⇨FirebseSDKが自動的に、ログインの永続化を行ってくれます


CC BY-SA 4.0
2021-05-06T09:10:15.327
75697
2021-05-06T09:10:15.327
45153
69444
answer