嗨,人们...我在Flutter上的SplashScreen遇到了麻烦...我的应用程序已安装并打开,但它卡在了初始屏幕徽标中...没有进一步...我为您提供我的代码,需要帮助...
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.manish.hotel">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<application
android:name=".Application"
android:label="Hotel App"
android:icon="@mipmap/ic_launcher">
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@mipmap/ic_notification" />
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- This keeps the window background of the activity showing
until Flutter renders its first frame. It can be removed if
there is no splash screen (such as the default splash screen
defined in @style/LaunchTheme). -->
<meta-data
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="FLUTTER_NOTIFICATION_CLICK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
SplashScreen.dart
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:mvc_pattern/mvc_pattern.dart';
import 'package:manish_hotel_ui/generated/i18n.dart';
import 'package:manish_hotel_ui/src/controllers/controller.dart';
import 'package:manish_hotel_ui/src/repository/user_repository.dart';
class SplashScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return SplashScreenState();
}
}
class SplashScreenState extends StateMVC<SplashScreen> {
Controller _con;
SplashScreenState() : super(Controller()) {
_con = controller;
}
@override
void initState() {
super.initState();
loadData();
}
Future<Timer> loadData() async {
return new Timer(Duration(seconds: 5), onDoneLoading);
}
onDoneLoading() async {
SchedulerBinding.instance.addPostFrameCallback((_) {
if (currentUser.apiToken == null) {
Navigator.of(context).pushReplacementNamed('/login');
} else {
Navigator.of(context).pushReplacementNamed('/pages', arguments: 2);
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: _con.scaffoldKey,
body: Container(
decoration: BoxDecoration(
color: Theme.of(context).accentColor,
),
child: Center(
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(
Icons.hotel_menu,
size: 90,
color: Theme.of(context).scaffoldBackgroundColor,
),
Text(
S.of(context).hotel,
style: Theme.of(context)
.textTheme
.display1
.merge(TextStyle(color: Theme.of(context).scaffoldBackgroundColor)),
),
SizedBox(height: 50),
CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(Theme.of(context).scaffoldBackgroundColor),
),
],
),
),
),
);
}
}
Styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
</resources>
launch_background
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/ic_launcher" />
</item>
</layer-list>
需要帮助的人,已经花了2个月的时间才弄清楚,仍然无法解决...
答案 0 :(得分:0)
我认为问题在于您在启动后5秒钟内注册了PostFrameCallback
,因此该小部件已经构建并且从未执行过回调。只需尝试删除它:
SchedulerBinding.instance.addPostFrameCallback((_) {
// Extract the code inside
});