Флаттер: Сброс пароля возвращает меня на домашнюю страницу, а не обратно на страницу входа - PullRequest
0 голосов
/ 24 октября 2019

Я новичок во Flutter, когда я нажимаю Отправить при сбросе пароля, отправляется электронное письмо с сообщением о сбросе, однако я перехожу на мою домашнюю страницу, а не обратно на страницу входа. Что я делаю не так.

Код указан ниже:

import 'package:flutter/material.dart';
import 'stacked_icons.dart';
import 'auth.dart';

class LoginPage extends StatefulWidget {
LoginPage({this.auth, this.onSignedIn});
final BaseAuth auth;
final VoidCallback onSignedIn;

@override
State<StatefulWidget> createState() => _LoginPage();
}

enum FormType {
login,
register,
reset
}

class _LoginPage extends State<LoginPage> {
final formKey = new GlobalKey<FormState>();

String _email;
String _password;
String _name;
FormType _formType = FormType.login;


bool validateAndSave() {
final form = formKey.currentState;
if (form.validate()) {
  form.save();
  return true;
}
return false;
}

void validateAndSubmit() async {
if (validateAndSave()) {
  try {
    if (_formType == FormType.login) {
      String userId = await widget.auth.singInWithEmailAndPassword(_email, _password);
    print('Signed in: $userId');
    } else if (_formType == FormType.reset){
      await widget.auth.sendPasswordResetEmail(_email);
      print("Password reset email sent");
      //Navigator.of(context).pushReplacementNamed ('moveToReset');
      setState(() {
       _formType = FormType.login; 
      }); 
    } else if (_formType == FormType.register){
      String userId = await widget.auth.createUserWithEmailAndPassword(_email, _password, _name);
    print('Registered user: $userId');
    setState(() {
     _formType = FormType.login; 
    });
    }
    widget.onSignedIn();
  } catch (e) {
    print('Error: $e');
    showDialog(
      context: context,
      builder: (context){
        return AlertDialog(
          title: Text('Sign in failed'),
        content: Text(e.toString()),
        actions: [
          FlatButton(
            child: Text('OK'),
            onPressed: () => Navigator.of(context).pop(),
          ),  
        ],
        );
      }
    );
  }
}
}

void moveToRegister(){
formKey.currentState.reset();
setState(() {
_formType = FormType.register;  
});
}

void moveToLogin(){
formKey.currentState.reset();
setState(() {
_formType = FormType.login;  
});
}

void moveToReset(){
formKey.currentState.reset();
setState(() {
_formType = FormType.reset;  
});
}

Ниже приведен фрагмент кнопки Отправить

 else if (_formType == FormType.reset){
  return [
  new Row(
            children: <Widget>[
              Expanded(
                child: Padding(
                  padding: const EdgeInsets.only(
                      left: 20.0, right: 20.0, top: 10.0),
                  child: GestureDetector(
                    onTap: () {
                      validateAndSubmit();
                    },
                    child: new Container(
                      alignment: Alignment.center,
                      height: 60.0,
                      decoration: new BoxDecoration(
                          color: Color(0xFF18D191),
                          borderRadius: BorderRadius.circular(10.0)),
                      child: new Text(
                        "Submit",
                        style: new TextStyle(
                            fontSize: 20.0, color: Colors.white),
                      ),
                    ),
                  ),
                ),
              ),
            ],
          ),

Пожалуйста, отправьте правильный код, чтобы перейти обратно для входа в системупосле сброса.

Я пробовал Navigator.pushReplacementNamed, однако я не знаю, как реализовать строку.

Я также пробовал Navigator.pop, и при нажатии я получаю сообщение об ошибкемоя кнопка отправки.

Я предполагал, что setState выполнит эту работу, но я вижу, что она не работает или, возможно, я ее не правильно вставил.

Как указано выше, я все ещеновичок во Флаттере и пытаюсь выяснить, где я иду не так.

1 Ответ

0 голосов
/ 24 октября 2019

Вы неправильно обрабатываете ваш сброс настроек в соответствии с вашим вариантом использования. Существует закомментированный навигационный код, который приведет вас на страницу moveToReset.

//Navigator.of(context).pushReplacementNamed ('moveToReset');

Я предлагаю использовать ваш метод moveToLogin() и изменить его логику, чтобы включить навигацию к реальной странице входа. Имя этого метода вводит в заблуждение текущую логику, которую он содержит.

https://flutter.dev/docs/cookbook/navigation/named-routes

Возможные решения:

  1. Определить виджет ResetPage и маршрут кЭто. Добавьте следующее к вашему validateOnSubmit в else if(_formType == FormType.reset)

    Navigator.pushNamed (context, '/ yourResetPageRoute');

Таким образом, вы будете использовать Маршрутизатор иновая страница.

Еще одна возможность просто отобразить форму сброса - это ваше запущенное приложение во втором фрагменте кода. Там вы возвращаете виджет (строку), к которому вы можете добавить форму сброса. Это не отдельная страница и не использует маршрутизацию.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...