Flutter Web Firebase 身份验证 URL 重定向

时间:2021-03-08 09:19:24

标签: firebase flutter dart firebase-authentication flutter-web

我有一个关于 Flutter 导航与 Firebase 身份验证相结合的问题。 在我的代码中有一个 AuthenticationWrapper 来检查用户是否已登录。 如果用户已登录,则导航到主页;如果用户未登录,则导航到登录页面。

问题是当我更改网页的 URL 时

来自:http://localhost/

到:http://localhost/home。

它会在没有登录的情况下进入主页。 我想要的是重定向到登录页面。

我怎样才能做到这一点? 我很想听听您对这个问题的意见。提前致谢!

Main.dart:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:rsm/Screens/screen2.dart';
import 'package:rsm/Screens/sign_in_page.dart';
import 'package:rsm/Screens/home_page.dart';
import 'package:rsm/Auth/authentication_service.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter/widgets.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
        providers: [
          Provider<AuthenticationService>(
            create: (_) => AuthenticationService(FirebaseAuth.instance),
          ),
          StreamProvider(
            create: (context) =>
                context.read<AuthenticationService>().authStateChanges,
            initialData: null,
          ),
        ],
        child: MaterialApp(
          title: 'name',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          routes: {
            // When navigating to the "/" route, build the FirstScreen widget.
            '/signin': (context) => SignInPage(),
            // When navigating to the "/second" route, build the SecondScreen widget.
            '/home': (context) => HomePage(),
            '/screen2': (context) => Screen2(),
          },
          home: AuthenticationWrapper(),
        ));
  }
}

class AuthenticationWrapper extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final firebaseUser = context.watch<User?>();
    if (firebaseUser != null) {
      //print(firebaseUser);
      // Page after loggin in
      return HomePage();
    }
    // Sign in page
    return SignInPage();
  }
}

AuthenticationService.dart:

import 'package:firebase_auth/firebase_auth.dart';

class AuthenticationService {
  final FirebaseAuth _firebaseAuth;

  AuthenticationService(this._firebaseAuth);

  Stream<User?> get authStateChanges => _firebaseAuth.idTokenChanges();

  Future<void> signOut() async {
    await _firebaseAuth.signOut();
  }

  Future<String?> signIn(
      {required String email, required String password}) async {
    try {
      await _firebaseAuth.signInWithEmailAndPassword(
          email: email, password: password);
      return "Signed in";
    } on FirebaseAuthException catch (e) {
      return e.message;
    }
  }

  Future<String?> signUp(
      {required String email, required String password}) async {
    try {
      await _firebaseAuth.createUserWithEmailAndPassword(
          email: email, password: password);
      return "Signed up";
    } on FirebaseAuthException catch (e) {
      return e.message;
    }
  }

  Future<void> sendPasswordResetMail(String email) async {
    await _firebaseAuth.sendPasswordResetEmail(email: email);
    return null;
  }
}

0 个答案:

没有答案