Flutter 检查约束并相应地返回实体
我只想在用户第一次打开应用程序时显示onboarding屏幕,因此在onboarding屏幕的最后一页,我将OnBoardingStatus值设置为“完成”,并移到主屏幕。但是,当用户下次打开应用程序时,此代码将在入职屏幕上闪烁几毫秒,然后打开主屏幕 这是我的密码Flutter 检查约束并相应地返回实体,flutter,dart,Flutter,Dart,我只想在用户第一次打开应用程序时显示onboarding屏幕,因此在onboarding屏幕的最后一页,我将OnBoardingStatus值设置为“完成”,并移到主屏幕。但是,当用户下次打开应用程序时,此代码将在入职屏幕上闪烁几毫秒,然后打开主屏幕 这是我的密码 class App2 extends StatefulWidget { App2({Key key}) : super(key: key); @override _App2State createState() =>
class App2 extends StatefulWidget {
App2({Key key}) : super(key: key);
@override
_App2State createState() => _App2State();
}
class _App2State extends State<App2> {
String onBoardingStatus;
@override
void initState() {
// TODO: implement initState
getOnBoardingStatus();
super.initState();
}
Future<void> getOnBoardingStatus() async {
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences prefs = await SharedPreferences.getInstance();
var onboardingstatus = prefs.getString('OnBoardingStatus');
setState(() {
onBoardingStatus = onboardingstatus;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: onBoardingStatus != null
? MainScreen()
: OnboardingScreen());
}
}
类App2扩展了StatefulWidget{
App2({Key}):超级(Key:Key);
@凌驾
_App2State createState()=>\u App2State();
}
类App2State扩展了状态{
船上绳索状态;
@凌驾
void initState(){
//TODO:实现initState
getOnBoardingStatus();
super.initState();
}
Future getOnBoardingStatus()异步{
WidgetsFlutterBinding.ensureInitialized();
SharedReferences prefs=等待SharedReferences.getInstance();
var onboardingstatus=prefs.getString('onboardingstatus');
设置状态(){
onBoardingStatus=onBoardingStatus;
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:onBoardingStatus!=null
?主屏幕()
:OnboardingScreen());
}
}
目前您无法知道onBoardingStatus
是否为空,因为尚未检索到SharedReferences
实例,或者因为onBoardingStatus
确实为空。您可以使用FutureBuilder
解决此问题:
class App2 extends StatelessWidget {
App2({Key key}) : super(key: key);
Future<String> getOnBoardingStatus() async =>
(await SharedPreferences.getInstance()).getString('OnBoardingStatus');
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: getOnBoardingStatus(),
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
//TODO: Return a widget that indicates loading
}
return Scaffold(
body: snapshot.data != null
? MainScreen()
: OnboardingScreen());
},
);
}
}
class App2扩展了无状态小部件{
App2({Key}):超级(Key:Key);
Future getOnBoardingStatus()异步=>
(等待SharedReferences.getInstance()).getString('OnBoardingStatus');
@凌驾
小部件构建(构建上下文){
回归未来建设者(
future:getOnBoardingStatus(),
生成器:(上下文,快照){
if(snapshot.connectionState!=connectionState.done){
//TODO:返回指示加载的小部件
}
返回脚手架(
正文:snapshot.data!=null
?主屏幕()
:OnboardingScreen());
},
);
}
}
然而,我不认为这是最好的解决方案。对于初学者来说,
App2
应该从外部源获取状态-这样,如果您决定更改存储解决方案,您就不需要触摸App2
我认为不可能通过这种方式将数据从导航位置传递到此屏幕,因为异步任务需要时间才能完成。否则,您可以使用futurebuilder,直到数据不可用时显示加载屏幕,当数据加载时,然后相应地显示屏幕。嘿@VirenVVarasadiya,您能建议我如何使用futurebuilder吗?再次面临同样的问题。onboarding屏幕会出现几毫秒。您必须在检查connectionState的if语句中返回一些内容,以避免出现这种情况。返回ProgressIndicator,或者只返回一个空容器。