1.这是主条目
void main() {
WidgetsFlutterBinding.ensureInitialized();
StorageUtil.getInstance();
runApp(MaterialApp(home: MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Wrapper(),
);
}
}
- 这是包装器。除非我手动热重载应用程序,否则不会显示登录表单或主页。 我已经尝试了一切,但我被卡住了。请帮忙。
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,随着应用程序的增长,它可以更好地扩展。