不能使用未来的字符串来确定 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 小部件中使用异步方法,因此请尝试在启动画面中实现它,您会没事的。
我的代码是这样的
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 小部件中使用异步方法,因此请尝试在启动画面中实现它,您会没事的。