проблема с исключением flutter firebaseauth

#flutter

#флаттер

Вопрос:

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

это из моего класса authservice

 Future loginWithEmailpasswd(String email, String password) async {
    try {
      return await _auth.signInWithEmailAndPassword(
          email: email, password: password);
    } on FirebaseAuthException catch (e) {
      print(e.toString());
      message=e.toString();

    }

  

когда я нажимаю кнопку входа в систему и передаю значение классу authservice, если есть какое-либо исключение, я хочу получить сообщение от authservice на экране входа в систему

 
class StudentLoginScreen extends StatefulWidget {
  final Function toggleView;
  StudentLoginScreen({this.toggleView});

  @override
  _StudentLoginScreenState createState() => _StudentLoginScreenState();
}

final _formkey = GlobalKey<FormState>();

class _StudentLoginScreenState extends State<StudentLoginScreen> {
  String email = '';
  String password = '';
  String message = '';
  final AuthService _authService = AuthService();
  //SharedPreferences usertype;
  @override
  Widget build(BuildContext context) {
    Size size = MediaQuery.of(context).size;

    return Scaffold(
      backgroundColor: HexColor(studentPrimaryColour),
      body: SafeArea(
        child: SingleChildScrollView(
          child: Form(
            key: _formkey,
            child: Column(
              children: <Widget>[
                showAlert(),
                SizedBox(
                  height: 25.0,
                ),
                HeadingText(
                  text: 'Login',
                  size: 60.0,
                  color: Colors.white,
                ),
                SizedBox(
                  height: 25.0,
                ),
                RoundedInputField(
                  hintText: "Email",
                  validator: (val) =>
                      val.isEmpty ? 'Oops! you left this field empty' : null,
                  onChanged: (val) {
                    email = val;
                  },
                ),
                SizedBox(
                  height: 5.0,
                ),
                RoundedInputField(
                  hintText: "Password",
                  validator: (val) =>
                      val.isEmpty ? 'Oops! you left this field empty' : null,
                  boolean: true,
                  onChanged: (val) {
                    password = val;
                  },
                ),
                SizedBox(
                  height: 15.0,
                ),
                Container(
                  margin: EdgeInsets.symmetric(vertical: 10),
                  width: size.width * 0.8,
                  child: ClipRRect(
                    borderRadius: BorderRadius.circular(29),
                    child: FlatButton(
                      padding:
                          EdgeInsets.symmetric(vertical: 20, horizontal: 40),
                      color: Colors.white,
                      onPressed: () async {
                        if (_formkey.currentState.validate()) {
                          dynamic result = await _authService
                              .loginWithEmailpasswd(email, password);
                          print(email);
                          print(password);
                          if (result != null) {
                            print('logged in');
                          } else {
                            print('error logging in');
                            setState(() {
                              message = // initialize value from authservice
                            });
                          }
                        }
                      },
                      child: Text(
                        'login',
                        style: GoogleFonts.montserrat(
                            color: HexColor(studentPrimaryColour),
                            fontSize: 20),
                      ),
                    ),
                  ),
                ),
                SizedBox(
                  height: 15.0,
                ),
                InkWell(
                  onTap: () {
                    widget.toggleView();
                  },
                  child: HeadingText(
                    text: 'register?',
                    color: Colors.white,
                    size: 10,
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }

  Widget showAlert() {
    if (_message != null) {
      return Container(
        color: Colors.amber,
        padding: EdgeInsets.all(8.0),
        child: Row(
          children: <Widget>[
            Icon(Icons.error_outline_rounded),
            Expanded(
                child: AutoSizeText(
              _message,
              maxLines: 3,
            ))
          ],
        ),
      );
    }
    return SizedBox(
      height: 0,
    );
  }
}


  

есть ли какой-либо возможный способ без реализации authservice на моем экране входа в систему?

Комментарии:

1. Где вы вызываете loginWithEmailpasswd метод? Пожалуйста, отредактируйте свой вопрос с помощью этой части кода.

2. @Naslausky сделал это, есть ли способ?

3. Если вы хотите разбить приложение на службы, вы должны создать классы, чтобы сохранить их состояние. И вы должны внедрить эти классы в свое приложение. Для этого вы можете использовать любой пакет управления состоянием. Например: пакеты поставщика или блока.

Ответ №1:

Правильный и самый элегантный способ сделать это, как указано в комментариях. Чтобы разбить ваше приложение на службы и модели. Вы можете использовать эти модели вместе с любым подходом к управлению состоянием.

Вы можете задать класс модели, который может иметь результат проверки подлинности или ошибку, которую он предоставил. Это должно быть то, что возвращается оболочкой соединения.

Но поучительным и простым предложением (и никоим образом не элегантным) было бы повторно создать исключение и снова перехватить его снаружи:

 Future loginWithEmailpasswd(String email, String password) async {
    try {
      return await _auth.signInWithEmailAndPassword(
          email: email, password: password);
    } on FirebaseAuthException catch (e) {
      print(e.toString());
      rethrow;
    }

  

И, нажав кнопку обратного вызова:

 [...]
Try{
    dynamic result = await _authService
                              .loginWithEmailpasswd(email, password);    
    print('logged in');
}on FirebaseAuthException catch (e) {
      setState(() {
          message = e.toString();
      });
    }
}
[...]
  

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