问题描述
我是 Flutter 和 Firebase 的新手,我目前遇到了一个问题,在使用电子邮件和密码登录后,我无法更新屏幕(从登录屏幕到主屏幕),我必须在那里更新重新启动应用程序以查看更新。我们不要忘记注销工作得很好。
在我的例子中,用户必须首先通过“ChooseBox Screen”选择他是客户还是服务提供商,然后他将进入属于所选选项的登录屏幕。
场景::MyApp => Wrapper => chooseBox Screen => Sign in Screen => Home Screen
注意:当我删除场景变成这样的选择框时,登录工作正常并更新到主屏幕:
场景 2:MyApp => Wrapper => 登录屏幕 => 主屏幕 main.dart
import 'package:RemedyBox/Services/authentication.dart';
import 'package:RemedyBox/generatedRoutes.dart';
import 'package:RemedyBox/wrapper.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:Flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:provider/provider.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
Provider<AuthService>(
create: (_) => AuthService(FirebaseAuth.instance),),StreamProvider(
create: (context) => context.read<AuthService>().authStateChange),],child: MaterialApp(
onGenerateRoute: RouteGenerator.generateRoute,debugShowCheckedModeBanner: false,home: wrapper(),);
}
}
Wrapper.dart
import 'package:RemedyBox/Screens/Authentications/chooseBox.dart';
import 'package:RemedyBox/SignPage.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:Flutter/material.dart';
import 'package:provider/provider.dart';
import 'Screens/Home/homeFile.dart';
class wrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = context.watch<User>();
if (user == null) {
return chooseBox();
}
return homeScreen();
}
}
ChooseBox.dart,这是我用来将选择框推送到登录屏幕的小部件
child: OutlinedButton(
onpressed: () {
Navigator.of(context).pushNamed('/SignIn');
},
登录.dart
import 'package:RemedyBox/Services/authentication.dart';
import 'package:Flutter/material.dart';
import 'package:provider/provider.dart';
class SignInPage extends StatelessWidget {
final TextEditingController emailController = TextEditingController();
final TextEditingController passwordController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
margin: MediaQuery.of(context).padding,child: Column(
children: [
TextField(
controller: emailController,decoration: Inputdecoration(
labelText: "Email",TextField(
controller: passwordController,decoration: Inputdecoration(
labelText: "Password",TextButton(
onpressed: () {
context.read<AuthService>().SignIn(
email: emailController.text.trim(),password: passwordController.text.trim(),);
},child: Text("Sign in"),)
],);
}
}
解决方法
事实证明,登录页面不是包装树的一部分,并且无法在登录后显示主页,因为登录页面仍然存在。解决方案是将替换推送到根目录,以便更新状态并显示主页。
登录.dart
TextButton(
onPressed: () async {
await context.read<AuthService>().SignIn(
email: emailController.text.trim(),password: passwordController.text.trim(),);
Navigator.pushReplacement(
context,MaterialPageRoute(builder: (_) => MyApp()));
},child: Text("Sign in"),)