Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何设置主页异步和有条件?_Flutter_Dart - Fatal编程技术网

Flutter 如何设置主页异步和有条件?

Flutter 如何设置主页异步和有条件?,flutter,dart,Flutter,Dart,我的应用程序有一个登录页面,并使用访问令牌登录用户。在应用程序开始时,如果用户仍然拥有令牌(这意味着自上次登录后未注销),则主页为X,但如果用户没有令牌,则主页为登录页面。没有问题,因为我使用SharedReferences来存储令牌,但我决定使用Flatter_secure_存储包。它的功能是异步工作的。所以问题是,在我将SharedReferences更改为Flatter_secure_storage之后,如果用户没有令牌并启动应用程序,则会显示X页几秒钟,然后出现登录页。我对所有flatt

我的应用程序有一个登录页面,并使用访问令牌登录用户。在应用程序开始时,如果用户仍然拥有令牌(这意味着自上次登录后未注销),则主页为X,但如果用户没有令牌,则主页为登录页面。没有问题,因为我使用SharedReferences来存储令牌,但我决定使用Flatter_secure_存储包。它的功能是异步工作的。所以问题是,在我将SharedReferences更改为Flatter_secure_storage之后,如果用户没有令牌并启动应用程序,则会显示X页几秒钟,然后出现登录页。我对所有flatter\u secure\u存储变量使用了异步/等待函数,但不能将其用于主页。我认为这是因为我不能让应用程序等待令牌检查,它开始构建页面X,然后意识到令牌为空,然后构建登录页面。这可能不是真的,只是我的想法。我的家庭代码是

home: Constants.storage.read(key: "token") !=
                null 
            ? ChangeNotifierProvider(
                create: (context) => BooksPageViewModel(),
                child: BooksView(),
              )
            : ChangeNotifierProvider(
                create: (context) => LoginPageViewModel(),
                child: LoginPage(),
              ));
我试图创建一个未来函数,但无法将其分配给home:。。。 我试着回家:。。。异步但没有发生。
如何将主页设置为等待令牌检查?提前感谢。

因此,如果我理解正确,.storage.read函数是异步的,必须等待才能使令牌不为空。 在这种情况下,我要么使用Futurebuilder,要么事先执行Constants.storage.read函数,如下所示:

var token = await Constants.storage.read(key: "token");
如果您遇到必须使主方法异步的问题,那么只需调用
WidgetsFlutterBinding.ensureInitialized()在main的开头,它将工作。

我将main转到

Future main() async {
正如@MaxTromp所说,我添加了
WidgetsFlutterBinding.ensureInitialized()
然后我为我的令牌向常量添加了一个
静态字符串
,并调用
Constants.token=wait Constants.storage.read(key:“token”)内部主。
那么我的家是什么

home: Constants.token !=
                null 
            ? ChangeNotifierProvider(
                create: (context) => BooksPageViewModel(),
                child: BooksView(),
              )
            : ChangeNotifierProvider(
                create: (context) => LoginPageViewModel(),
                child: LoginPage(),
              ));

现在,它可以完美地工作。

您可以使用
FutureBuilder
显示启动屏幕(或加载指示器),直到您的未来返回一个值,然后使用该值决定显示哪个页面。