Flutter 检查约束并相应地返回实体

Flutter 检查约束并相应地返回实体,flutter,dart,Flutter,Dart,我只想在用户第一次打开应用程序时显示onboarding屏幕,因此在onboarding屏幕的最后一页,我将OnBoardingStatus值设置为“完成”,并移到主屏幕。但是,当用户下次打开应用程序时,此代码将在入职屏幕上闪烁几毫秒,然后打开主屏幕 这是我的密码 class App2 extends StatefulWidget { App2({Key key}) : super(key: key); @override _App2State createState() =>

我只想在用户第一次打开应用程序时显示onboarding屏幕,因此在onboarding屏幕的最后一页,我将OnBoardingStatus值设置为“完成”,并移到主屏幕。但是,当用户下次打开应用程序时,此代码将在入职屏幕上闪烁几毫秒,然后打开主屏幕

这是我的密码


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,或者只返回一个空容器。