フラッタのシンプルなログインフロー、それからFirebase


フラッタにおける簡単なfirebaseログインフロー


次のコンポーネントを使用して簡単なアプリケーションを作成します
  • デフォルトのメインアプリケーションエントリポイント
  • 利用FutureBuilder Widget UIをレンダリングする前にデータを待つには、コンセプトは、アプリケーション全体で使用される
  • ログインページ
  • のホームページ
  • 認証サービス
  • Flutterドキュメンテーションでここで議論されるようにプロバイダーの使用を実証してくださいSimple App State Management
  • Flickrの設定についての詳細な例がたくさんありますので、基本的にウォーキングの代わりにコードにジャンプします.

    See Google CodeLabs Flutter for Firebase for step by step instructions for setting up you project on iOS or Android


    Firebaseでテストユーザーを作成する


    我々はアプリケーションを構築しているので、今すぐアプリケーションでユーザーを作成するための機能性がないので、FireBaseコンソールにログインして、プロジェクトにユーザーを追加してください.必ずFireBaseコンソールでプロジェクトを更新するときに電子メール認証を有効にしてください.

    デフォルトフラッタープロジェクトの浄化


    プロジェクトの作成
    flutter create simple_firebase_auth
    
    プロジェクトをクリーンアップし、プロジェクトを開き、既存のHomePage and HomePageState ファイルからのウィジェットmain.dart .
    変更するhome プロパティMaterialApp ウィジェットを指すウィジェットLoginPage ウィジェットは次のセクションで作成します
    ファイルが完了すると、このファイルは似ているはずです
    import 'package:flutter/material.dart';
    import 'package:simple_firebase_auth/login_page.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: LoginPage(),
        );
      }
    }
    

    LoginPageウィジェットを作成する


    の創造を通して歩くLoginPage 申し込み.我々はキャプチャする必要がありますemailpassword 通じるAuthService ログイン関数を呼び出します.
    必要に応じて簡単なページを作りますTextFormField ウィジェットと1つRaisedButton クリックすると、ログインが起こります.
  • エディタを開き、新しいファイルを作成しますlib ディレクトリ名login_page.dart
  • 下記の内容をファイルに貼り付けますlogin_page.dart
  • import 'package:flutter/material.dart';
    
    class LoginPage extends StatefulWidget {
      @override
      _LoginPageState createState() => _LoginPageState();
    }
    
    class _LoginPageState extends State<LoginPage> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("Login Page Flutter Firebase"),
          ),
          body: Center(
            child: Text('Login Page Flutter Firebase  Content'),
          ),
        );
      }
    }
    
    
    あなたは、スクリーンが現在どのように見えるかについてコードを実行することができなければなりません.デフォルトルートを変更してくださいhome プロパティmain.dart ウィジェットLoginPage 私たちはあなたがライブリロードとの変更を見ることができるので、UIを介して動作中

    スタイルとテキストフィールドの追加


    ページの本文を中心にするColumn コラムの子供たちが主にTextFormFieldRaisedButtonフォームフィールドとボタンを保持する中心のコンテナー
        body: Container(
          padding: EdgeInsets.all(20.0),
          child: Column()
        )
    
    次に、実際のフォームフィールドウィジェットとボタンをColumn ウィジェット.我々は、これが容認できるように、フォームフィールドのいくつかの基本的なスタイルを行います.詳細はFlutterドキュメンテーションを見てくださいTextFormFields
      body: Container(
        padding: EdgeInsets.all(20.0),
        child: Column(
          children: <Widget>[
            Text(
              'Login Information',
              style: TextStyle(fontSize: 20),
            ),
            TextFormField(
                keyboardType: TextInputType.emailAddress,
                decoration: InputDecoration(labelText: "Email Address")),
            TextFormField(
                obscureText: true,
                decoration: InputDecoration(labelText: "Password")),
            RaisedButton(child: Text("LOGIN"), onPressed: () {}),
          ],
        ),
      ),
    
    列の中のフィールドの間にいくつかの間隔を追加します.我々は、使用するつもりですSizedBox ウィジェットと設定height アプリケーションのいくつかの間隔を取得するプロパティ.置換するchildren プロパティColumn 必要な間隔を得るウィジェット
      children: <Widget>[
        SizedBox(height: 20.0),    // <= NEW
        Text(
          'Login Information',
          style: TextStyle(fontSize: 20),
        ),
        SizedBox(height: 20.0),   // <= NEW
        TextFormField(
            keyboardType: TextInputType.emailAddress,
            decoration: InputDecoration(labelText: "Email Address")),
        TextFormField(
            obscureText: true,
            decoration: InputDecoration(labelText: "Password")),
        SizedBox(height: 20.0),  // <= NEW
        RaisedButton(child: Text("LOGIN"), onPressed: () {}),
      ],
    

    フォームフィールドからテキスト値を取得する


    私たちはAを使用するつもりですForm ウィジェットとGlobalKey , これらの概念に関する追加情報は、フラッター料理セクションで見つかりますBuilding a form with validation
    でフォームキーを追加するLoginPage ウィジェット
    class _LoginPageState extends State<LoginPage> {
      final _formKey = GlobalKey<FormState>();
    
    次に、認証のためにFireBaseに送信する必要があるメールアドレスとパスワードの値を保持する2つの新しいフィールドを追加します
    class _LoginPageState extends State<LoginPage> {
      final _formKey = GlobalKey<FormState>();
      String _password;
      String _email;
    
    次にプロパティを追加しますonSavedTextFormFields 我々は、電子メールとパスワードを持っているときsave メソッドをフォームに呼び出すと、保存されているメソッドのすべてのウィジェットがローカル変数を更新するために呼び出されます.
      TextFormField(
          onSaved: (value) => _email = value,    // <= NEW
          keyboardType: TextInputType.emailAddress,
          decoration: InputDecoration(labelText: "Email Address")),
      TextFormField(
          onSaved: (value) => _password = value, // <= NEW
          obscureText: true,
          decoration: InputDecoration(labelText: "Password")),
    
    ラップするColumn 新しいウィジェットForm ウィジェットは、コードは次のようになります
          body: Container(
            padding: EdgeInsets.all(20.0),
            child: Form(          // <= NEW
              key: _formKey,      // <= NEW
              child: Column(
                children: <Widget>[
                ....
                ],
              ),
            ),
          ),            
    
    フィールドが設定されましたTextFormField 更新され、我々は_formKey 提供するフィールドを検証するだけでなく、save メソッド.
    コードをRaisedButton onPressed 以下のメソッドを使用すると、アウトウィジェットのメールアドレスとパスワードの値が得られます.我々は現在、これらの値をAuthService これは、firebase signin機能をラップします.
        // save the fields..
        final form = _formKey.currentState;
        form.save();
    
        // Validate will return true if is valid, or false if invalid.
        if (form.validate()) {
          print("$_email $_password");
        }
    

    ホームページウィジェットを作成する


    今のところ、我々はちょうどどのように流れが動作を実証しようとしているので、我々はホームページを簡単に保つでしょう.コメントアウトを無視するLogoutButton ウィジェットについては、チュートリアルの後のセクションで説明します.
  • エディタを開き、新しいファイルを作成しますlib ディレクトリ名home_page.dart
  • 下記の内容をファイルに貼り付けますhome_page.dart
  • import 'package:flutter/material.dart';
    
    class HomePage extends StatefulWidget {
      @override
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
      @override
      Widget build(BuildContext context) {
        return  Scaffold(
          appBar: AppBar(
            title: Text("Home Flutter Firebase"),
            //actions: <Widget>[LogoutButton()],
          ),
          body: Center(
            child: Text('Home Page Flutter Firebase  Content'),
          ),
        );
      }
    }
    
  • オープンmain.dart 次のインポート文を追加します
  • import 'home_page.dart';
    
  • 変更するhome プロパティー:
  • home: HomePage(title: 'Flutter Demo Home Page'),
    
    これによりページが正しく動作していることを確認できます
    home: HomePage(),
    

    認証サービスのテンプレートを作成する


    ここでは、FireBaseとは別の認証サービスを構築し、すべての動作を検証し、FireBaseを統合します.
    このサービスでは、私たちはChangeNotifier と方法notifyListeners これにより、このサービスを使用しているウィジェットがメソッドが呼び出されたときに更新されます.電話しているnotifyListeners 我々が更新するときcurrentUser ユーザーがログインしているか、ログアウトしたか、ユーザーの状態に基づいてアプリケーションを更新したいということです.

    More information on Provider and State Management can be found here in the Flutter Documentation


    ベースラインとして必要なのは次のとおりです.
    import 'dart:async';
    import 'package:flutter/material.dart';
    
    class AuthService with ChangeNotifier {
      var currentUser;
    
      AuthService() {
        print("new AuthService");
      }
    
      Future getUser() {
        return Future.value(currentUser);
      }
    
      // wrappinhg the firebase calls
      Future logout() {
        this.currentUser = null;
        notifyListeners();
        return Future.value(currentUser);
      }
    
      // wrapping the firebase calls
      Future createUser(
          {String firstName,
          String lastName,
          String email,
          String password}) async {}
    
      // logs in the user if password matches
      Future loginUser({String email, String password}) {
        if (password == 'password123') {
          this.currentUser = {'email': email};
          notifyListeners();
          return Future.value(currentUser);
        } else {
          this.currentUser = null;
          return Future.value(null);
        }
      }
    }
    
    我々は、サービスの呼び出しでローカルプロパティを維持しますcurrentUser ユーザがユーザを呼び出すオブジェクトをlogin パスワードを設定しますcurrentUser そして、ユーザはログインします.これは、現在の呼び出し時にユーザーが提供されますgetUser メソッド.ユーザをログ出力するには、currentUser プロパティがNULLになったことを示します.

    アプリケーション起動時のユーザー状態の決定


    最初の課題は、アプリケーションとの作業を開くときに、アプリケーションを起動するページを決定することです.ここで何をしたいかは、ユーザがいるかどうかを決定することです.私たちはAuthService 我々は、上記と組み合わせて作成されますFutureBuilder フラッタからのウィジェットは、いずれかの正しい最初のページをレンダリングするHomePage またはLoginPage

    プロバイダーの使用


    インmain.dart デフォルトを更新する必要がありますmain このように見える我々は、アプリケーション全体をラップしているChangeNotifierProvider ウィジェットツリーをスキャンして、型のオブジェクトを見つける能力を得るにはAuthService .
    void main() => runApp(
          ChangeNotifierProvider<AuthService>(
            child: MyApp(),
            builder: (BuildContext context) {
              return AuthService();
            },
          ),
        );
    

    MyAppウィジェットの変更


    に入るmain.dart を返します.MyApp ウィジェットは、ルートを設定します.このウィジェットは、アプリケーションがHomePage ウィジェットLoginPage ウィジェットは、アプリケーションが起動されます.
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(primarySwatch: Colors.blue),
          home: FutureBuilder(
            // get the Provider, and call the getUser method
            future: Provider.of<AuthService>(context).getUser(),
            // wait for the future to resolve and render the appropriate
            // widget for HomePage or LoginPage
            builder: (context, AsyncSnapshot snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                return snapshot.hasData ? HomePage() : LoginPage();
              } else {
                return Container(color: Colors.white);
              }
            },
          ),
        );
      }
    }
    

    パート1の終わり


    この時点では、パスワードをPassword 123として提供する場合は、ユーザーが正常にログインされる基本的なログインフローを使用してアプリケーションを持つ必要があります
    何らかのエラーが発生した場合、ダイアログボックスにエラーメッセージを表示する少し余分な機能を追加しました.

    アーロンフンダース / Simplechen FirebaseRain Auth


    フラッタにおける簡単なfirebaseログインフロー


    フラッタにおける簡単なfirebaseログインフロー


    ステップバイステップバイステップ

  • Documentation for Simple Firebase Login Flow in Flutter - Part One ソースコードはbranch

  • Documentation for Simple Firebase Login Flow in Flutter - Part Two ソースコードはhead
  • There is a more complete example with login and account creation available here


    始める


    このプロジェクトはフラッターアプリケーションの出発点です.
    あなたが最初のフラッタープロジェクトであるならば、あなたを得るいくつかの資源は、始まりました:
  • Lab: Write your first Flutter app
  • Cookbook: Useful Flutter samples
  • Flutterで始まるヘルプのために
    online documentation , チュートリアルを提供します.
    サンプル、モバイル開発のガイダンス、および完全なAPI参照.
    View on GitHub
    アーロン・サンダース — CEO明らかに革新的なIncは、チェックアントアントレプレナー、Chenhn開発者