Navigator.push() loses my provider on Firebase Login

…衆ロ難τιáo~ 提交于 2020-01-25 06:41:07

问题


I have having some issues in a Firebase login. I'm trying to make with Provider.The problem is that my login is not refreshing the UI, even thought the data changes and when i hit hot restart it shows me the new UI. Doing some experiments I got into the conclusion that the problem is on a Navigator.push i use to show an animation. I don't wanna lose this animation it gives a pretty cool style to my an app. Is there any way the main provider can can work after a new page is push?

Main.dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:lyric_hero/app_localizations.dart';
import 'package:lyric_hero/blocs/unlogged_bloc.dart';
import 'package:lyric_hero/blocs/userrepository_bloc.dart';
import 'package:lyric_hero/pages/LoggedPage.dart';
import 'package:lyric_hero/pages/SplashScreenPage.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:lyric_hero/pages/UnloggedPage.dart';
import 'package:lyric_hero/widgets/Unlogged/LoginForm.dart';
import 'package:provider/provider.dart';

void main() {
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
      systemNavigationBarColor: Colors.black,
      statusBarColor: Colors.transparent,
      statusBarIconBrightness: Brightness.dark));
  return runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Lyric Hero',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(),
      supportedLocales: [
        Locale('en', 'US'),
        Locale('es', 'ES'),
        Locale('pt', 'BR')
      ],
      localizationsDelegates: [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate
      ],
      localeResolutionCallback: (locale, supportedLocales) {
        for (var supportedLocale in supportedLocales) {
          if (supportedLocale.languageCode == locale?.languageCode) {
            return supportedLocale;
          }
        }
        return supportedLocales.first;
      },
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => UserRepository.instance(),
      child: Consumer(
        builder: (context, UserRepository user, _) {
          switch (user.status) {
            case Status.Uninitialized:
              return SplashScreenPage();
            case Status.Unauthenticated:
            case Status.Authenticating:
              return UnloggedPage();
            case Status.Authenticated:
              return LoggedPage();
          }
        },
      ),
    );
  }
}

UnloggedPage.dart

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:lyric_hero/blocs/userrepository_bloc.dart';
import 'package:lyric_hero/widgets/AppTitle.dart';
import 'package:lyric_hero/widgets/Unlogged/BottomMessage.dart';
import 'package:lyric_hero/widgets/Unlogged/LoginForm.dart';
import 'package:lyric_hero/widgets/Unlogged/RegisterForm.dart';
import 'package:lyric_hero/widgets/gradients/BluePurpleGradient.dart';
import 'package:provider/provider.dart';
import 'package:responsive_widgets/responsive_widgets.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:page_transition/page_transition.dart';

class UnloggedPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _UnloggedPageState();
  }
}

class _UnloggedPageState extends State<UnloggedPage> {
  @override
  void initState() {
    new Timer(Duration(seconds: 1), () {
      Navigator.push(
          context,
          PageTransition(
              type: PageTransitionType.rightToLeft, child: UnloggedForms()));
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    ResponsiveWidgets().init(context,
        referenceHeight: 1920, // Optional
        referenceWidth: 1080, // Optional
        referenceShortestSide: 411 // Optional, default = 360
        );

    return Scaffold(
      body: BlueGreenGradient(
        child: Center(
          child: AppTitle(
            type: 'white',
          ),
        ),
      ),
    );
  }
}

class UnloggedForms extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _UnloggedFormsState();
  }
}

class _UnloggedFormsState extends State<UnloggedForms> {
  Widget _root = LoginForm();
  Alignment _alignment = Alignment.center;
  double _paddingbottom = 40;
  double _paddingtop = 0;
  bool _show = false;
  bool _login = true;

  Widget horizontalLine() => Padding(
        padding: EdgeInsets.symmetric(horizontal: 16.0),
        child: Container(
          width: ScreenUtil.getInstance().setWidth(120),
          height: 1.0,
          color: Colors.black26.withOpacity(.2),
        ),
      );

  @override
  Widget build(BuildContext context) {
    Timer(Duration(seconds: 2), () {
      setState(() {
        _paddingbottom = 50;
        _paddingtop = 50;
        _alignment = Alignment.topCenter;
      });
      /*
      unloggedBloc.setPaddingBottom(50);
      unloggedBloc.setPaddingTop(50);
      unloggedBloc.setAlignment(Alignment.topCenter);*/
    });

    ResponsiveWidgets().init(context,
        referenceHeight: 1920, // Optional
        referenceWidth: 1080, // Optional
        referenceShortestSide: 411 // Optional, default = 360
        );

    return Container(
        color: Colors.white,
        child: SafeArea(
            child: Scaffold(
                body: Container(
                    color: Colors.white,
                    child: AnimatedContainer(
                        duration: Duration(milliseconds: 400),
                        onEnd: () {
                          Timer(Duration(milliseconds: 400), () {
                            setState(() {
                              _show = true;
                            });
                            //unloggedBloc.setShow();
                          });
                        },
                        alignment: _alignment,
                        child: SingleChildScrollView(
                            padding: EdgeInsetsResponsive.only(
                                top: _paddingtop, bottom: _paddingbottom),
                            child: Column(children: <Widget>[
                              AppTitle(
                                type: 'main-gradient',
                              ),
                              Visibility(
                                  visible: _show,
                                  child: Column(
                                    children: <Widget>[
                                      _root,
                                      BottomMessagge(
                                        login: _login,
                                        action: () {
                                          if (_login) {
                                            setState(() {
                                              _root = RegisterForm();
                                            });
                                            /*unloggedBloc
                                                .setRoot(RegisterForm());*/
                                          } else {
                                            setState(() {
                                              _root = LoginForm();
                                            });
                                            //unloggedBloc.setRoot(LoginForm());
                                          }
                                          setState(() {
                                            _login = !_login;
                                          });
                                          //unloggedBloc.setLogin();
                                        },
                                      )
                                    ],
                                  ))
                            ])))))));
  }
}

LoginForm.dart

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:lyric_hero/app_localizations.dart';
import 'package:lyric_hero/blocs/userrepository_bloc.dart';
import 'package:lyric_hero/widgets/CustomizedButton.dart';
import 'package:provider/provider.dart';
import 'package:responsive_widgets/responsive_widgets.dart';
import 'package:gradient_widgets/gradient_widgets.dart';
import 'package:responsive_widgets/responsive_widgets.dart';
import 'package:flutter_signin_button/flutter_signin_button.dart';

class LoginForm extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _LoginFormState();
  }
}

class _LoginFormState extends State<LoginForm> {
  TextEditingController _email;
  TextEditingController _password;
  double _formheight = 550.0;
  final _formKey = GlobalKey<FormState>();

  Widget horizontalLine() => Padding(
        padding: EdgeInsets.symmetric(horizontal: 16.0),
        child: Container(
          width: ScreenUtil.getInstance().setWidth(120),
          height: 1.0,
          color: Colors.black26.withOpacity(.2),
        ),
      );

  @override
  void initState() {
    _email = TextEditingController(text: "");
    _password = TextEditingController(text: "");
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final user = Provider.of<UserRepository>(context);
    ResponsiveWidgets().init(context,
        referenceHeight: 1920, // Optional
        referenceWidth: 1080, // Optional
        referenceShortestSide: 411 // Optional, default = 360
        );
    ScreenUtil.instance = ScreenUtil.getInstance()..init(context);
    ScreenUtil.instance =
        ScreenUtil(width: 750, height: 1334, allowFontScaling: true);
    return Padding(
        padding: EdgeInsetsResponsive.only(top: 30, right: 20, left: 20),
        child: Column(children: <Widget>[
          ContainerResponsive(
            width: double.infinity,
            height: _formheight,
            decoration: BoxDecoration(
                color: Colors.white,
                borderRadius: BorderRadius.circular(8.0),
                boxShadow: [
                  BoxShadow(
                      color: Colors.black12,
                      offset: Offset(0.0, 15.0),
                      blurRadius: 15.0),
                  BoxShadow(
                      color: Colors.black12,
                      offset: Offset(0.0, -10.0),
                      blurRadius: 10.0),
                ]),
            child: Padding(
              padding: EdgeInsets.only(left: 16.0, right: 16.0, top: 16.0),
              child: Form(
                key: _formKey,
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Text(AppLocalizations.of(context).translate('signin-title'),
                        style: TextStyle(
                            fontSize: ScreenUtil.getInstance().setSp(45),
                            fontFamily: "Poppins-Bold",
                            letterSpacing: .6)),
                    SizedBox(
                      height: ScreenUtil.getInstance().setHeight(30),
                    ),
                    Text(AppLocalizations.of(context).translate('email'),
                        style: TextStyle(
                            fontFamily: "Poppins-Medium",
                            fontSize: ScreenUtil.getInstance().setSp(26))),
                    TextFormField(
                      controller: _email,
                      keyboardType: TextInputType.emailAddress,
                      validator: (value) {
                        if (value.isEmpty) {
                          setState(() {
                            _formheight = 620;
                          });
                          return AppLocalizations.of(context)
                              .translate('email_empty');
                        }

                        return null;
                      },
                      decoration: InputDecoration(
                          hintText: AppLocalizations.of(context)
                              .translate('email')
                              .toLowerCase(),
                          hintStyle: TextStyle(
                              color: Colors.grey,
                              fontSize: ScreenUtil.getInstance().setSp(23))),
                    ),
                    SizedBox(
                      height: ScreenUtil.getInstance().setHeight(30),
                    ),
                    Text(AppLocalizations.of(context).translate('password'),
                        style: TextStyle(
                            fontFamily: "Poppins-Medium",
                            fontSize: ScreenUtil.getInstance().setSp(26))),
                    TextFormField(
                      controller: _password,
                      obscureText: true,
                      validator: (value) {
                        if (value.isEmpty) {
                          setState(() {
                            _formheight = 620;
                          });
                          return AppLocalizations.of(context)
                              .translate('password_empty');
                        }
                        return null;
                      },
                      decoration: InputDecoration(
                          hintText: AppLocalizations.of(context)
                              .translate('password')
                              .toLowerCase(),
                          hintStyle: TextStyle(
                              color: Colors.grey,
                              fontSize: ScreenUtil.getInstance().setSp(23))),
                    ),
                    SizedBox(
                      height: ScreenUtil.getInstance().setHeight(35),
                    ),
                    Row(
                      mainAxisAlignment: MainAxisAlignment.end,
                      children: <Widget>[
                        Text(
                          AppLocalizations.of(context).translate('forgot-btn'),
                          style: TextStyle(
                              color: Colors.blue,
                              fontFamily: "Poppins-Medium",
                              fontSize: ScreenUtil.getInstance().setSp(28)),
                        )
                      ],
                    ),
                    user.status == Status.Authenticating
                        ? Center(
                            child: Padding(
                            padding: EdgeInsetsResponsive.only(top: 40),
                            child: CircularProgressIndicator(),
                          ))
                        : CustomizedButton(
                            width: 700,
                            height: 100,
                            color1: Color(0xFF17ead9),
                            color2: Color(0xFF6078ea),
                            text: AppLocalizations.of(context)
                                .translate('signin-btn'),
                            action: () async {
                              print("EMAIL: " + _email.text.toString());
                              print("PASSWORD: " + _password.text.toString());

                              if (_formKey.currentState.validate()) {
                                setState(() {
                                  _formheight = 550;
                                });
                                if (!await user.signIn(
                                    _email.text, _password.text)) {
                                  print(Text("something is wrong"));
                                }
                                /*_key.currentState.showSnackBar(SnackBar(
                                  content: Text("Something is wrong"),
                                ));()
                                */
                              }
                            })
                  ],
                ),
              ),
            ),
          ),
          Padding(
            padding: EdgeInsetsResponsive.only(top: 20, bottom: 10),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                horizontalLine(),
                Text(AppLocalizations.of(context).translate('social-title'),
                    style: TextStyle(
                        fontSize: ScreenUtil.getInstance().setSp(35),
                        fontFamily: "Poppins-Medium")),
                horizontalLine()
              ],
            ),
          ),
          SignInButton(
            Buttons.Facebook,
            mini: false,
            text: AppLocalizations.of(context).translate('fb-login-btn'),
            onPressed: () {},
          ),
          SignInButton(
            Buttons.Google,
            mini: false,
            text: AppLocalizations.of(context).translate('go-login-btn'),
            onPressed: () {},
          ),
        ]));
  }

  @override
  void dispose() {
    _email.dispose();
    _password.dispose();
    super.dispose();
  }
}

Unlogged_bloc

import 'package:flutter/material.dart';
import 'package:lyric_hero/widgets/Unlogged/LoginForm.dart';
import 'package:responsive_widgets/models/responsive_widgets_model.dart';

class UnloggedBloc extends ChangeNotifier {
  Widget _root = LoginForm();
  Alignment _alignment = Alignment.center;
  double _paddingbottom = 40;
  double _paddingtop = 0;
  bool _show = false;
  bool _login = true;

  Widget get root => _root;
  Alignment get alignment => _alignment;
  double get paddingbottom => _paddingbottom;
  double get paddingtop => _paddingtop;
  bool get show => _show;
  bool get login => _login;

  void setRoot(Widget widget) {
    _root = widget;
    notifyListeners();
  }

  void setAlignment(Alignment align) {
    _alignment = align;
    notifyListeners();
  }

  void setPaddingBottom(double d) {
    _paddingbottom = d;
    notifyListeners();
  }

  void setPaddingTop(double d) {
    _paddingtop = d;
    notifyListeners();
  }

  void setLogin() {
    _login = !_login;
    notifyListeners();
  }

  void setShow() {
    _show = !_show;
    notifyListeners();
  }
}

来源:https://stackoverflow.com/questions/59833201/navigator-push-loses-my-provider-on-firebase-login

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!