firebase - Flutter web Firebase 身份验证 URL 重定向
问题描述
我有一个关于 Flutter 导航与 Firebase Auth 结合的问题。在我的代码中,有一个 AuthenticationWrapper 来检查用户是否登录。如果用户登录,则导航到主页,当用户未登录时,导航到登录页面。
问题是当我更改网页的 URL 时
来自:http://localhost/
到:http://localhost/home。
它无需登录即可进入主页。我想要的是重定向到登录页面。
我怎样才能做到这一点?我很想听听您对这个问题的意见。提前致谢!
主要飞镖:
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;
}
}
解决方案
推荐阅读
- c# - 带有属性的嵌套列表的反序列化
- javascript - 如何使用javascript从一个日期输入字段中获取日期值并将其放入另一个日期字段?
- javascript - Oninvalid 不起作用
- ios - 无法创建启用了 HealthKit 功能的应用
- entity-framework - 实体框架迁移到多个数据库
- machine-learning - 一类 SVM 无法对训练集进行分类
- sql - SQL 序列中的下 N 个数字
- ios - 图像未在 iPad 上显示
- sql-server - SQL SERVER sp_OACreate 在执行 128 行后抛出错误“ODSOLE 扩展过程”
- javascript - Javascript 将 setTimeOut 链接到 Promise,寻找一个非常示例