不能使用未来的字符串来确定 initalRoute

Can't use a future string to determine initalRoute

我的代码是这样的

class MyApp extends StatelessWidget {
  MyApp({Key? key}) : super(key: key);

  Future<String> validation() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    bool isWTdone = prefs.getBool('WT') ?? false;
    bool isLoggedIn = prefs.getString('email') == null ? false : true;

    if(isWTdone){
      if(isLoggedIn)
      {
        return '/home';
      }
        return '/login';
    }
      return '/';
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorObservers: [
        locator<AnalyticsService>().getanalyticsObserver(),
      ],
      //iswalkthrough and islogin
      initialRoute: validation(),
      routes: appRoutes,
    );
  }
}

在 initalRoute 行中它给我这个错误:

The argument type 'Future' can't be assigned to the parameter type 'String?'.

谁能知道我该如何解决这个问题?我的目标是从 SharedPreference

的输出中确定 initalRoute

尝试将 MaterialApp 包装到 FutureBuilder 或在调用 runApp 之前在 main.dart 中执行异步代码。您可以通过构造函数将所需的值传递给 MyApp。

是的,那是因为方法 validation 是一个 future 并且要使用它你必须写 await validation() 并且不能 直接 在小部件树, 我建议的解决方案;

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final prefs = await SharedPreferences.getInstance();
  bool isWTdone = prefs.getBool('WT') ?? false;
  bool isLoggedIn = prefs.getString('email') == null ? false : true;
  late final initialRoute;

  if (isWTdone) {
    if (isLoggedIn)
      initialRoute = '/home';
    else
      initialRoute = '/login';
  } else
    initialRoute = '/';

  return runApp(MyApp(initialRoute: initialRoute));
}

class MyApp extends StatelessWidget {
  final String initialRoute;

  const MyApp({Key? key, required this.initialRoute}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorObservers: [
        locator<AnalyticsService>().getanalyticsObserver(),
      ],
      //iswalkthrough and islogin
      initialRoute: validation(),
      routes: appRoutes,
    );
  }
}

我在这里所做的是在 runApp 之前初始化 initialRoute 并传递给 MyApp Stateless Widget

将 initialRoute 设置为启动画面的路由。在该屏幕内,您应该在 initState 内调用 validation() 函数,并根据您的输出导航到您想要的任何屏幕。我认为不鼓励在您的 MaterialApp 小部件中使用异步方法,因此请尝试在启动画面中实现它,您会没事的。