你如何为Flutter应用添加启动屏?它应该在任何其他内容加载之前就能够加载和显示。目前,Scaffold(home:X)小部件加载之前会有短暂的闪烁。
你如何为Flutter应用添加启动屏?它应该在任何其他内容加载之前就能够加载和显示。目前,Scaffold(home:X)小部件加载之前会有短暂的闪烁。
我想更详细地介绍在Flutter中实现启动屏幕的方法。
我跟踪了一下这里,发现Flutter的启动屏幕并不是那么糟糕。
也许大多数开发人员(像我一样)认为Flutter默认没有启动屏幕,他们需要做些什么。实际上已经有一个启动屏幕,但它的背景是白色的,没有人能够理解iOS和Android默认已经有了启动屏幕。
开发者唯一需要做的就是将品牌标志放在正确的位置,启动屏幕就会开始工作。
以下是逐步操作的具体方法:
首先是Android(因为我最喜欢它 :))
在Flutter项目中找到“android”文件夹。
浏览到app -> src -> main -> res文件夹,并将所有品牌标志图片的变体放置在相应的文件夹中。例如:
因为Android文件夹中默认没有drawable-mdpi、drawable-hdpi等文件夹,但是我们可以自己创建。因此,图片需要放在mipmap文件夹中。同时,启动屏幕的默认XML代码(在Android中)将使用@mipmap,而不是@drawable资源(如果您愿意,可以更改它)。
在Android上的最后一步是取消注释drawable/launch_background.xml文件中的某些XML代码。浏览到app -> src -> main -> res-> drawable并打开launch_background.xml。在这个文件中,你会看到为什么Slash屏幕的背景是白色的。为了应用我们在第2步中放置的品牌标志,我们必须取消注释launch_background.xml文件中的一些XML代码。更改后,代码应该像这样:
<!--<item android:drawable="@android:color/white" />-->
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/your_image_name" />
</item>
请注意,我们注释掉了白色背景的XML代码并取消注释关于mipmap图像的代码。如有兴趣,launch_background.xml文件用于styles.xml文件中。在iOS上,您需要在Flutter项目中的“ios”文件夹中找到Runner -> Assets.xcassets -> LaunchImage.imageset。这里应该有LaunchImage.png,LaunchImage@2x.png等。现在,您需要使用您的品牌形象变体替换这些图像。例如:密度为1的图像需要替换LaunchImage.png,密度为2的图像需要替换LaunchImage@2x.png,密度为3的图像需要替换LaunchImage@3x.png,密度为4的图像需要替换LaunchImage@4x.png。如果我没有记错,LaunchImage@4x.png默认不存在,但您可以轻松创建它。如果LaunchImage@4x.png不存在,则还必须在与图像位于同一目录中的Contents.json文件中声明它。更改后,我的Contents.json文件如下:{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@4x.png",
"scale" : "4x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
这应该是你所需要的全部内容了。下次在 Android 或 iOS 上运行应用程序时,你应该会看到你添加的品牌图像作为正确的启动画面。
谢谢
在flutter中添加启动屏幕最简单的方法是使用以下包: https://pub.dev/packages/flutter_native_splash
将您的设置添加到项目的pubspec.yaml文件中或在根项目文件夹中创建一个名为flutter_native_splash.yaml的文件,并在其中添加您的设置。
flutter_native_splash:
image: assets/images/splash.png
color: "42a5f5"
图片必须是PNG文件。
您也可以在颜色中使用#。 颜色:“#42a5f5” 如果您不想为特定平台创建启动画面,则还可以将android或ios设置为false。
flutter_native_splash:
image: assets/images/splash.png
color: "42a5f5"
android: false
如果您的图像需要使用整个屏幕(宽度和高度),则可以使用填充属性。
flutter_native_splash:
image: assets/images/splash.png
color: "42a5f5"
fill: true
注意:fill属性尚未为iOS启动屏幕实现。flutter_native_splash:
image: assets/images/splash.png
color: "42a5f5"
android_disable_fullscreen: true
在添加设置后,使用以下命令运行该软件包:
flutter pub run flutter_native_splash:create
当软件包运行完成时,您的启动画面即可就绪。
pubspec.yaml
文件中添加ios_content_mode:scaleToFill
,然后重新运行flutter pub run flutter_native_splash:create
。 - Mahmoud FarahatFlutter实际上为我们的应用程序添加启动画面提供了更简单的方法。 我们首先需要像设计其他应用程序屏幕一样设计一个基本页面。您需要将其制作为一个StatefulWidget,因为它的状态将在几秒钟内发生变化。
import 'dart:async';
import 'package:flutter/material.dart';
import 'home.dart';
class SplashScreen extends StatefulWidget {
@override
_SplashScreenState createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
@override
void initState() {
super.initState();
Timer(
Duration(seconds: 3),
() => Navigator.of(context).pushReplacement(MaterialPageRoute(
builder: (BuildContext context) => HomeScreen())));
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: Center(
child: Image.asset('assets/splash.png'),
),
);
}
}
在initState()中,按照您的意愿调用一个持续时间为3秒的Timer(),完成后将导航器推送到我们应用程序的主屏幕。目前还没有一个好的例子,但你可以使用每个平台的本地工具自己实现:
iOS: https://docs.nativescript.org/tooling/publishing/creating-launch-screens-ios
Android: https://www.bignerdranch.com/blog/splash-screens-the-right-way/
订阅问题8147以获取关于闪屏页面示例代码的更新。如果iOS上启动页和应用程序之间出现黑色闪烁问题,请订阅问题8127以获取更新。
编辑:截至2017年8月31日,新项目模板中已提供改进的闪屏支持。请参见#11505。
对于Android,前往android > app > src > main > res > drawable > launcher_background.xml
现在取消此注释,并将@mipmap/launch_image替换为您的图像位置。
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item>
您可以在这里更改屏幕的颜色 -
<item android:drawable="@android:color/white" />
如果您在应用验证答案后遇到“图像未找到”等错误,请确保添加的是@mipmap/ic_launcher而不是@mipmap/ic_launcher.png
这是在Flutter中添加动态启动画面的无误且最佳方式。
MAIN.DART
import 'package:flutter/material.dart';
import 'constant.dart';
void main() => runApp(MaterialApp(
title: 'GridView Demo',
home: SplashScreen(),
theme: ThemeData(
primarySwatch: Colors.red,
accentColor: Color(0xFF761322),
),
routes: <String, WidgetBuilder>{
SPLASH_SCREEN: (BuildContext context) => SplashScreen(),
HOME_SCREEN: (BuildContext context) => BasicTable(),
//GRID_ITEM_DETAILS_SCREEN: (BuildContext context) => GridItemDetails(),
},
));
SPLASHSCREEN.DART
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:app_example/constants.dart';
class SplashScreen extends StatefulWidget {
@override
SplashScreenState createState() => new SplashScreenState();
}
class SplashScreenState extends State<SplashScreen>
with SingleTickerProviderStateMixin {
var _visible = true;
AnimationController animationController;
Animation<double> animation;
startTime() async {
var _duration = new Duration(seconds: 3);
return new Timer(_duration, navigationPage);
}
void navigationPage() {
Navigator.of(context).pushReplacementNamed(HOME_SCREEN);
}
@override
dispose() {
animationController.dispose();
super.dispose();
}
@override
void initState() {
super.initState();
animationController = new AnimationController(
vsync: this,
duration: new Duration(seconds: 2),
);
animation =
new CurvedAnimation(parent: animationController, curve: Curves.easeOut);
animation.addListener(() => this.setState(() {}));
animationController.forward();
setState(() {
_visible = !_visible;
});
startTime();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
fit: StackFit.expand,
children: <Widget>[
new Column(
mainAxisAlignment: MainAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
padding: EdgeInsets.only(bottom: 30.0),
child: new Image.asset(
'assets/images/powered_by.png',
height: 25.0,
fit: BoxFit.scaleDown,
),
)
],
),
new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Image.asset(
'assets/images/logo.png',
width: animation.value * 250,
height: animation.value * 250,
),
],
),
],
),
);
}
}
CONSTANTS.DART
:常量文件的Dart实现。String SPLASH_SCREEN='SPLASH_SCREEN';
String HOME_SCREEN='HOME_SCREEN';
HOMESCREEN.DARTimport 'package:flutter/material.dart';
class BasicTable extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Table Widget")),
body: Center(child: Text("Table Widget")),
);
}
}
你可以尝试以下代码,对我有效
import 'dart:async';
import 'package:attendance/components/appbar.dart';
import 'package:attendance/homepage.dart';
import 'package:flutter/material.dart';
class _SplashScreenState extends State<SplashScreen>
with SingleTickerProviderStateMixin {
void handleTimeout() {
Navigator.of(context).pushReplacement(new MaterialPageRoute(
builder: (BuildContext context) => new MyHomePage()));
}
startTimeout() async {
var duration = const Duration(seconds: 3);
return new Timer(duration, handleTimeout);
}
@override
void initState() {
// TODO: implement initState
super.initState();
_iconAnimationController = new AnimationController(
vsync: this, duration: new Duration(milliseconds: 2000));
_iconAnimation = new CurvedAnimation(
parent: _iconAnimationController, curve: Curves.easeIn);
_iconAnimation.addListener(() => this.setState(() {}));
_iconAnimationController.forward();
startTimeout();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Scaffold(
body: new Center(
child: new Image(
image: new AssetImage("images/logo.png"),
width: _iconAnimation.value * 100,
height: _iconAnimation.value * 100,
)),
),
);
}
}
Android平台
在Android中,当您的Android应用程序初始化时,会显示启动屏幕。让我们通过以下3个步骤设置此启动屏幕:
第1步:打开android/app/src/main/res/drawable/launch_background.xml文件。
第2步:在第4行,您可以选择所需的颜色:
<item android:drawable="@android:color/white" />
第三步:在第10行,你可以更改图片:
android:src="@mipmap/launch_image"
完成了,你做得很好!编程愉快 :)