将“ Future <bool>”更改为静态类型“ bool”以获取条件

时间:2019-10-17 06:24:23

标签: flutter dart sharedpreferences

这个问题确实非常相似,类似于this one。我遵循了公认的答案,但没有任何反应。

我尝试修改main.dartHomePage()上的第一个OnBoardingPage()登陆页面。我正在从“共享首选项”中获取数据(布尔),然后首先进行检查。

如您所见,OnBoardingPage()只是一个一次性事件的屏幕。

代码在这里:

class MyApp extends StatelessWidget {
  SharedPrefs prefs = SharedPrefs();

  Future<bool> _initBro() async {
    var redirect = await prefs.read("onboard") ?? false;
    print("main => $redirect");
    return redirect;
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        fontFamily: 'CM Sans Serif',
        platform: TargetPlatform.android,
      ),
      home: (_initBro().then(val => val == true)) ? HomePage() : OnBoardingPage(),
      // home: HomePage(),
      debugShowCheckedModeBanner: false,
    );
  }
}

问题出在home:行。

main.dart

我不太明白为什么它仍然给我这样的错误。 我已经等待更改了代码,但似乎给我带来了更多麻烦。我也对它做了如下修改:

home: _initBro().then((val) {
  return (val) ? HomePage() : OnBoardingPage();
}),

但是仍然没有希望。

我是Flutter的新手,也绝对是Dart的新手。任何帮助将不胜感激。

非常感谢您的关注。

1 个答案:

答案 0 :(得分:2)

您可以使用FutureBuilder

class MyApp extends StatelessWidget {
  SharedPrefs prefs = SharedPrefs();

  Future<bool> _initBro() async {
    var redirect = await prefs.read("onboard") ?? false;
    print("main => $redirect");
    return redirect;
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        fontFamily: 'CM Sans Serif',
        platform: TargetPlatform.android,
      ),
      home: FutureBuilder(builder: (context, AsyncSnapshot<bool> snapshot) {
        if (snapshot.hasData)
          return snapshot.data ? HomePage() : OnBoardingPage();
        else
          return Container();
      },
      future: _initBro(),);
    }
      debugShowCheckedModeBanner: false,
    );
  }
}

它同步返回小部件。如果尚无数据-它返回空的Container,并且当_initBro()返回值时-此方法将返回所需的小部件