2

Flutter/Dart は初めてで、基本認証サービスを作成しようとしています。私の単純なことは、認証アクションが行われたときにユーザーを発行するストリームをメインアプリケーションにリッスンさせることです。これは、多くの Firebase の例がどのように機能するかです。唯一の違いは、独自の API に直接接続したいということです。

これを行うために、AuthService を作成しましたが、実際には機能していないようです。

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Provider<AuthService>(
      create: (_) => AuthService(),
      child: MaterialApp(
        home: AuthWidget()
      )
    );
  }
}

class AuthWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    final authService = Provider.of<AuthService>(context);
    authService.getUser();

    // wrap the application in a Stream that watches for the authentication state
    // to change. On authentication state change,
    return StreamBuilder<User>(
        stream: authService.onAuthStateChanged,
        builder: (context, snapshot) {
          
          // check to ensure that the connectionState is active
          if (snapshot.connectionState == ConnectionState.active) {
            final user = snapshot.data;
            return user == null ? Login() : Home();
          }

          return Login();
        }
    );
  }
}


class AuthService {

  User currentUser;

  Future<User> getUser() {
    return Future.value(currentUser);
  }

  void login(User user) {
    currentUser = user;
  }

  void logout() {
    currentUser = null;
  }

  Stream<User> get onAuthStateChanged {
    return Stream.fromFuture(getUser());
  }
}

達成したいこと

トップレベルMyAppでは、AuthProvider を使用して認証の変更をリッスンできるようにしたいと考えています。どこからでも認証プロバイダーにアクセスできる必要があります。

final auth = Provider.of<AuthService>(context, listen: false);

// log the user in
auth.login(user);

// log the user out
auth.logout(user);

// get the current authenticated user
auth.getUser();

そして、これを使用してアプリケーションを管理します。私が既存のコードで抱えている問題は、ストリームのステータスが即座に完了としてマークされるため、onAuthStateChanged. 実際には、AuthWidgetログイン/ログアウト イベントに応答し、それに応じて UI を変更できるように、アプリケーションの存続期間中ずっとリッスンし続ける必要があります。

どんな助けでも大歓迎です!

4

1 に答える 1