#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.