Flutter 启动屏幕-AnimationController赢得';在initState上完成异步调用之前,不能启动
我正在尝试为我的Flutter应用程序制作一个启动屏幕。我希望在检查用户是否登录firebase Authentication,然后根据返回值转到相关视图时,我的徽标可以旋转 问题是,在异步调用之前,我的应用程序没有正确构建(我看到了我的背景,但没有看到AnimatedBuilder) 我尝试使用包运行我的Flutter 启动屏幕-AnimationController赢得';在initState上完成异步调用之前,不能启动,flutter,dart,flutter-animation,Flutter,Dart,Flutter Animation,我正在尝试为我的Flutter应用程序制作一个启动屏幕。我希望在检查用户是否登录firebase Authentication,然后根据返回值转到相关视图时,我的徽标可以旋转 问题是,在异步调用之前,我的应用程序没有正确构建(我看到了我的背景,但没有看到AnimatedBuilder) 我尝试使用包运行我的CheckUser(),或使用此函数: WidgetsBinding.instance.addPostFrameCallback((\u)=>yourFunction(context)) 但是
CheckUser()
,或使用此函数:
WidgetsBinding.instance.addPostFrameCallback((\u)=>yourFunction(context))代码>
但是它总是等待CheckUser()
函数完成,所以当它直接导航到其他视图时,我看不到动画
如果您想测试它,下面是我的代码:
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:skull_mobile/connexion/login.dart';
import 'accueil.dart';
class SplashPage extends StatefulWidget {
SplashPage({Key key}) : super(key: key);
@override
_SplashPage createState() => _SplashPage();
}
class _SplashPage extends State<SplashPage>
with SingleTickerProviderStateMixin {
AnimationController animationController;
@override
void initState() {
super.initState();
animationController = new AnimationController(
vsync: this,
duration: new Duration(seconds: 5),
);
animationController.repeat();
checkUser();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.grey[800],
body: Center(
child: Container(
child: new AnimatedBuilder(
animation: animationController,
child: new Container(
height: 150.0,
width: 150.0,
child: new Image.asset('assets/skull.png'),
),
builder: (BuildContext context, Widget _widget) {
return new Transform.rotate(
angle: animationController.value * 6.3,
child: _widget,
);
},
),
),
),
);
}
void checkUser() async {
FirebaseAuth.instance.currentUser().then((currentUser) => {
if (currentUser == null)
{Navigator.pushNamed(context, LoginPage.routeName)}
else
{Navigator.pushNamed(context, AccueilPage.routeName)}
});
}
}
导入'dart:io';
进口“包装:颤振/材料.省道”;
导入“包:firebase_auth/firebase_auth.dart”;
导入“package:skull_mobile/connexion/login.dart”;
输入“精确省道”;
类SplashPage扩展StatefulWidget{
SplashPage({Key}):超级(Key:Key);
@凌驾
_SplashPage createState()=>\u SplashPage();
}
类SplashPage扩展了状态
使用SingleTickerProviderStateMixin{
动画控制器;
@凌驾
void initState(){
super.initState();
animationController=新的animationController(
vsync:这个,,
持续时间:新的持续时间(秒数:5),
);
animationController.repeat();
checkUser();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:颜色。灰色[800],
正文:中(
子:容器(
子对象:新的动画生成器(
动画:animationController,
子容器:新容器(
高度:150.0,
宽度:150.0,
子级:新建Image.asset('assets/skull.png'),
),
生成器:(BuildContext上下文,Widget\u Widget){
返回新的Transform.rotate(
角度:animationController.value*6.3,
child:_widget,
);
},
),
),
),
);
}
void checkUser()异步{
FirebaseAuth.instance.currentUser()。然后((currentUser)=>{
if(currentUser==null)
{Navigator.pushNamed(上下文,LoginPage.routeName)}
其他的
{Navigator.pushNamed(上下文,AccueilPage.routeName)}
});
}
}
在我的评论之后,我在这里分享了我自己的代码片段,以及我如何处理启动屏幕,这里称为“WaitingScreen”,即设备的连接状态,然后根据结果将用户发送到具有不同属性的不同页面:
@override
Widget build(BuildContext context) {
switch (authStatus) {
case AuthStatus.notDetermined:
if(_connectionStatus == ConnectionStatus.connected){
return _buildWaitingScreen();
}else{
return _buildNoConnectionScreen();
}
break;
case AuthStatus.notSignedIn:
return LoginPage(
onSignedIn: _signedIn,
setThemePreference: widget.setThemePreference,
);
case AuthStatus.signedIn:
return MainPage(
onSignedOut: _signedOut,
setThemePreference: widget.setThemePreference,
getThemePreference: widget.getThemePreference,
);
}
return null;
}
首先需要创建屏幕,然后检查任何内容。尝试使用FutureBuilder,因为此firebase函数是未来的功能。并通过FutureBuilder将其从initeState中删除。您是否尝试将其分离为不同的小部件?让您的主应用程序文件加载并显示splash小部件及其动画,同时发出您需要的请求。请求完成后,您可以用要显示的屏幕替换启动小部件,或者导航到另一个视图。