Изменение 'Future <bool>' на статический тип 'bool' для условия - PullRequest
0 голосов
/ 17 октября 2019

Этот вопрос действительно очень похож на этот . Я следовал принятому ответу, но ничего не произошло.

Я пытаюсь изменить свою первую целевую страницу на main.dart, будь то HomePage() или OnBoardingPage(). Я получаю данные (bool) из общих настроек и выполняю проверку в первую очередь.

Как видите, 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

Я не совсем понимаю, почемудо сих пор дает мне такую ​​ошибку. Я изменил код с await, но, кажется, это доставляет мне гораздо больше проблем. Также я изменил это немного так:

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

Но все еще нет надежды.

Я новичок с Флаттером, а также с Дартом. Любая помощь будет очень признательна.

Большое спасибо за внимание, ребята.

1 Ответ

2 голосов
/ 17 октября 2019

Вы можете использовать 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() возвращает значение - этот метод вернет необходимый виджет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...