@lekasnet
Студент РТУ МИРЭА - фуллстек, Flutter разработчик

Как из асинхронной функции вернуть не Future объект?

class MyApp extends StatelessWidget {
	@override
	Widget build(BuildContext context) {
	return MaterialApp(
		title: 'MY APP',
		debugShowCheckedModeBanner: false,
		scrollBehavior: MyCustomScrollBehavior(),
		theme: ThemeData(
		primarySwatch: Colors.blue,
		),
		home: Scaffold(
		body: SingleChildScrollView(
				child: globals.checkLoggedIn()
		),
		),
	);
	}
}

Это главный файл main.dart, который вызывает первое состояние приложения, НО
мне нужно вернуть из функции checkLoggedIn():
checkLoggedIn() async {
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  bool? isLoggedIn = prefs.getBool('isLogin');
  if (isLoggedIn != null) {
    if (isLoggedIn) {
      return Main();
    }
    else {
      return Login();
    }
  }
  return OpenScreen();
}

одно из состояний по результатам, входил ли пользователь в приложение или нет, для этого я использую sharedPreferences, но функция тогда должна быть асинхронной, но тогда в main.dart возвращается значение Future<Widget>, а метод child может принимать только Widget, сделать функцию не асинхронной я не могу, также как и класс асинхронным (т.к. build возвращает только Widget). Вопрос: как совместить возвращение значения из SharedPreferences (или есть какая-то альтернатива) и исходный код main.dart (или поменять его так, чтобы это не повлияло на работу остальной программы), если что, я не очень умный, про FutureBuilder я знаю, но вообще не понял как этим пользоваться...
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
RomReed
@RomReed
JavaScript, Flutter, ReactNative, Redux, Firebase
class MyApp extends StatefulWidget {
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool? isLoggedIn;

  Future<void> checkLoggedIn() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    bool? isLoggedIn = prefs.getBool('isLogin');

    this.setState(() {
      isLoggedIn = isLoggedIn;
    });
  }

  @override
  void initState() {
    super.initState();
    Future.microtask(() async => await checkLoggedIn());
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MY APP',
      debugShowCheckedModeBanner: false,
      scrollBehavior: MyCustomScrollBehavior(),
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        body: SingleChildScrollView(child:
            isLoggedIn != null?
                    isLoggedIn! 
                        ? Main()
                        : Login()
                    : OpenScreen()
        ),
      ),
    );
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Neonoviiwolf
Flutter developer
FutureBuilder(
    future: Future<void>.delayed(const Duration(seconds: 1)),
    builder: (context, snapshot) {
         return SizedBox();
     },
 ),


FutureBuilder принимает как раз Future и ждёт возвращения результата, состояние можно узнать из snapshot, пока происходит получение даных, показывать загрузку, а как придёт результат, выполнить соответсвенно код. Через Future.microtask для такой задачи использовать не стоит, почитайте что такое microtask в Event Loop In Dart
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы