我有一个关于 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;
}
}