Flutter 앱에 스플래시 화면을 추가하는 방법은 무엇입니까? 다른 내용보다 먼저로드하여 표시해야합니다. 현재 Scaffold (home : X) 위젯이로드되기 전에 짧은 색상의 플래시가 있습니다.
답변
Flutter에서 스플래시 화면을 실제로 수행하는 방법에 대해 더 많은 정보를 얻고 싶습니다.
나는 여기에서 약간의 흔적을 따랐고 Flutter의 Splash Screen에 대해 상황이 그렇게 나쁘지 않은 것을 보았습니다.
어쩌면 대부분의 개발자 (예 : 나와 같은)는 Flutter에 기본적으로 스플래시 화면이 없으며 그것에 대해 무언가를해야한다고 생각합니다. 스플래시 화면이 있지만 흰색 배경으로 기본적으로 이미 iOS 및 Android 용 스플래시 화면이 있다는 것을 아무도 알 수 없습니다.
개발자가해야 할 유일한 일은 브랜딩 이미지를 올바른 위치에 놓는 것입니다. 그러면 스플래시 화면이 그대로 작동하기 시작합니다.
단계별로 수행하는 방법은 다음과 같습니다.
안드로이드에서 첫 번째 (내가 가장 좋아하는 플랫폼이기 때문에) 🙂
-
Flutter 프로젝트에서 “android”폴더를 찾으십시오.
-
앱-> src-> main-> res 폴더로 이동하여 브랜딩 이미지의 모든 변형을 해당 폴더에 배치하십시오. 예를 들면 다음과 같습니다.
- 밀도가 1 인 이미지는 밉맵 -mdpi에 배치해야합니다.
- 밀도가 1.5 인 이미지는 밉맵 -hdpi에 배치해야합니다.
- 밀도가 2 인 이미지는 밉맵 -xdpi에 배치해야합니다.
- 밀도가 3 인 이미지는 밉맵 -xxdpi에 배치해야합니다.
- 밀도가 4 인 이미지는 밉맵 -xxxdpi에 배치해야합니다.
기본적으로 안드로이드 폴더에는 drawable-mdpi, drawable-hdpi 등이 없지만 원하는 경우 만들 수 있습니다. 이 때문에 이미지는 밉맵 폴더에 배치해야합니다. 또한 스플래시 화면 (Android)에 대한 기본 XML 코드는 @drawable 리소스 대신 @mipmap을 사용합니다 (원하는 경우 변경할 수 있음).
-
Android의 마지막 단계는 drawable / launch_background.xml 파일에서 일부 XML 코드의 주석 처리를 제거하는 것입니다. app-> src-> main-> res-> drawable을 찾아 launch_background.xml을여십시오. 이 파일 안에 슬래시 화면 배경이 흰색 인 이유를 알 수 있습니다. 2 단계에서 배치 한 브랜딩 이미지를 적용하려면 launch_background.xml 파일에서 일부 XML 코드의 주석 처리를 제거해야합니다. 변경 후 코드는 다음과 같아야합니다.
<!--<item android:drawable="@android:color/white" />--> <item> <bitmap android:gravity="center" android:src="@mipmap/your_image_name" /> </item>
흰색 배경의 XML 코드를 주석 처리하고 밉맵 이미지에 대한 코드의 주석 처리를 제거하십시오. 누군가 관심이 있다면 launch_background.xml 파일이 styles.xml 파일에 사용됩니다.
iOS에서 두 번째 :
-
Flutter 프로젝트에서 “ios”폴더를 찾으십시오.
-
러너-> 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"
}
}
다음에 앱을 실행할 때 필요한 모든 것이 안드로이드 또는 iOS에서 추가 한 브랜딩 이미지가 포함 된 올바른 스플래시 화면이 있어야합니다.
감사
답변
당신이 경우 flutter create
프로젝트를 개발, 당신은 단계를 수행 할 수 https://flutter.io/assets-and-images/#updating-the-launch-screen을 .
답변
Flutter는 실제로 응용 프로그램에 스플래시 화면을 추가하는 더 간단한 방법을 제공합니다. 다른 앱 화면을 디자인 할 때 먼저 기본 페이지를 디자인해야합니다. 몇 초 후에 상태가 변경되므로 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 ()
내부에서 원하는 기간 으로 Timer () 를 호출 합니다. 원하는대로 탐색기를 응용 프로그램의 홈 화면으로 푸시하면 3 초가 걸립니다.
참고 : 응용 프로그램은 스플래시 화면을 한 번만 표시해야하며 사용자는 뒤로 버튼을 눌러도 다시 스플래시 화면으로 돌아 가지 않아야합니다. 이를 위해 Navigator.pushReplacement ()를 사용 합니다. 새 화면으로 이동하고 탐색 기록 스택에서 이전 화면을 제거합니다.
더 잘 이해하려면 Flutter : 자신 만의 스플래시 화면 디자인을 방문하십시오 .
답변
이에 대한 좋은 예는 아직 없지만 각 플랫폼의 기본 도구를 사용하여 직접 수행 할 수 있습니다.
iOS : https://docs.nativescript.org/publishing/creating-launch-screens-ios
안드로이드 : 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" />
답변
flutter에 스플래시 화면을 추가하는 가장 쉬운 방법은이 패키지를 imho하는 것입니다 :
https://pub.dev/packages/flutter_native_splash
설치 안내서 (패키지 작성자) :
1. 스플래시 화면 설정
프로젝트의 pubspec.yaml 파일에 설정을 추가하거나 루트 프로젝트 폴더에 flutter_native_splash.yaml이라는 파일을 설정으로 만듭니다.
flutter_native_splash:
image: assets/images/splash.png
color: "42a5f5"
이미지는 png 파일이어야합니다.
#을 컬러로도 사용할 수 있습니다. color : “# 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 스플래시 화면에 구현되지 않았습니다.
Android에서 전체 화면 스플래시 화면을 사용하지 않으려면 android_disable_fullscreen 속성을 사용할 수 있습니다.
flutter_native_splash:
image: assets/images/splash.png
color: "42a5f5"
android_disable_fullscreen: true
2. 패키지를 실행
설정을 추가 한 후 다음을 사용하여 패키지를 실행하십시오.
flutter pub pub run flutter_native_splash:create
패키지 실행이 완료되면 스플래시 화면이 준비됩니다.
답변
아래 코드를 시도하고 나를 위해 일했습니다.
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,
)),
),
);
}
}