颤振-如何从登录屏幕切换到主页并返回?后端工作,但如果不手动刷新就无法显示屏幕



1.这是主条目

void main()  {
WidgetsFlutterBinding.ensureInitialized();
StorageUtil.getInstance();
runApp(MaterialApp(home: MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Wrapper(),
);
}
}
  1. 这是包装器。除非我手动热重载应用程序,否则不会显示登录表单或主页。 我已经尝试了一切,但我被卡住了。请帮忙。
class Wrapper extends StatefulWidget {
@override
_WrapperState createState() => _WrapperState();
}
class _WrapperState extends State<Wrapper> {
User _user = User();
@override
Widget build(BuildContext context) {
_user.uId = StorageUtil.getString('access_token');
if(_user.uId != null && _user.uId != ""){
print('filled ${_user.uId}');
return Home();
}else{
print('empty ${_user.uId}');
return Authenticate();
}
}
}

我认为您的 StorageUtil 为您提供了将数据返回给您的承诺,但您不会在应用程序首次加载时等待它。你可以尝试等待 StorageUtil.getInstance((;在主块中。

void main() async {
WidgetsFlutterBinding.ensureInitialized();
await StorageUtil.getInstance();
runApp(MaterialApp(home: MyApp()));
}

您需要监视实例。现在,您正在抓取实例以获取值,但您没有订阅值本身,这意味着当值更改时,在您刷新页面之前不会发生任何事情。我建议订阅确定登录屏幕与主屏幕的值(access_token(。

Flutter 有一些内置的功能,可以简化一些功能,例如流和/或更快的小部件,如 ValueListenerBuilder。让我们看看我们是否可以用StorageUtil做到这一点。

void main() async {
WidgetsFlutterBinding.ensureInitialized();
await StorageUtil.getInstance();
runApp(MaterialApp(home: MyApp()));
}
class Wrapper extends StatefulWidget {
@override
_WrapperState createState() => _WrapperState();
}
class _WrapperState extends State<Wrapper> {
User _user = User();
@override
Widget build(BuildContext context) {

return ValueListenableBuilder(
valueListenable: StorageUtil.getString('access_token');,
builder: (BuildContext context, String value, _) {
if(value != null && value != ""){
print('filled ${_user.uId}');
return Home();
} else {
print('empty ${_user.uId}');
return Authenticate();
}
},
),
}
}

这很粗糙,但它应该完成工作!我建议找到一种更简化的方式来存储您的状态,而不仅仅是 StorageUtil,随着应用程序的增长,它可以更好地扩展。

相关内容

最新更新