![](/img/trans.png)
[英]Flutter - losing state when pressing back button to android home screen
[英]Flutter: Home screen will only appear when back button is press after login successfully
提供者代码
Future<void> login(String email, String password) async {
}
try {
final response = await http.post(
url,
body: json.encode(
{
'email': email,
'password': password,
'returnSecureToken': true,
},
),
);
final responseData = json.decode(response.body);
if (responseData['error'] != null) {
throw HttpException(responseData['error']['message']);
}
_token = responseData['idToken'];
_userId = responseData['localId'];
_expiryDate = DateTime.now().add(
Duration(
seconds: int.parse(
responseData['expiresIn'],
),
),
);
notifyListeners();
} catch (error) {
throw error;
}
主要的
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (ctx) => Auth(),
),
],
child: Consumer<Auth>(
builder: (ctx, auth, _) => MaterialApp(
title: 'Medicare',
theme: ThemeData(
primaryColor: kPrimaryColor,
scaffoldBackgroundColor: Colors.white,
appBarTheme: AppBarTheme(backgroundColor: Colors.white),
),
home: auth.isAuth ? HomeScreen() : WelcomePage(),
routes: {
AuthScreen.routeName: (ctx) => AuthScreen(),
},
),
),
);
}
}
欢迎屏幕
认证屏幕
主屏幕
当用户成功登录时,我对我的逻辑中缺少的内容感到困惑,除非我按下模拟器/真实设备的后退按钮,否则不会出现主屏幕。 我正在使用 state 管理和 firebase 后端的提供程序。
编辑:这是我的 function,用于带有错误处理程序的登录/注册用户。
try {
if (_authMode == AuthMode.Login) {
// Login User
await Provider.of<Auth>(context, listen: false).login(
_authData['email'],
_authData['password'],
);
} else {
// Sign Up User
await Provider.of<Auth>(context, listen: false).signup(
_authData['email'],
_authData['password'],
);
}
} on HttpException catch (error) {
var errorMessage = 'Authentication failed';
if (error.toString().contains('EMAIL_EXISTS')) {
errorMessage = 'This email address is already in use.';
} else if (error.toString().contains('INVALID_EMAIL')) {
errorMessage = 'This is not a valid email address';
} else if (error.toString().contains('WEAK_PASSWORD')) {
errorMessage = 'This password is too weak';
} else if (error.toString().contains('EMAIL_NOT_FOUND')) {
errorMessage = 'Could not find a user with that email';
} else if (error.toString().contains('INVALID_PASSWORD')) {
errorMessage = 'Invalid Password.';
}
_showErrorDialog(errorMessage);
} catch (error) {
const errorMessage =
'Coult not authenticate you. Please try again later.';
_showErrorDialog(errorMessage);
}
我怀疑由于我所做的 httpexception,我无法推送一个上下文。
我没有深入了解 go 但我在大括号级别的代码中发现了错误。
在提供程序代码中 function 未来登录,以空括号结束!
检查您的代码
Future<void> login(String email, String password) async {
// empty
// empty
// empty
// empty
}
try {
final response = await http.post(
url,
body: json.encode(
{
'email': email,
'password': password,
'returnSecureToken': true,
},
),
);
final responseData = json.decode(response.body);
if (responseData['error'] != null) {
throw HttpException(responseData['error']['message']);
}
_token = responseData['idToken'];
_userId = responseData['localId'];
_expiryDate = DateTime.now().add(
Duration(
seconds: int.parse(
responseData['expiresIn'],
),
),
);
notifyListeners();
} catch (error) {
throw error;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.