在 flutter/firebase 中登录后屏幕不更新

问题描述

我是 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"),)