[flutter] Flutter 앱에 스플래시 화면 추가

Flutter 앱에 스플래시 화면을 추가하는 방법은 무엇입니까? 다른 내용보다 먼저로드하여 표시해야합니다. 현재 Scaffold (home : X) 위젯이로드되기 전에 짧은 색상의 플래시가 있습니다.



답변

Flutter에서 스플래시 화면을 실제로 수행하는 방법에 대해 더 많은 정보를 얻고 싶습니다.

나는 여기에서 약간의 흔적을 따랐고 Flutter의 Splash Screen에 대해 상황이 그렇게 나쁘지 않은 것을 보았습니다.

어쩌면 대부분의 개발자 (예 : 나와 같은)는 Flutter에 기본적으로 스플래시 화면이 없으며 그것에 대해 무언가를해야한다고 생각합니다. 스플래시 화면이 있지만 흰색 배경으로 기본적으로 이미 iOS 및 Android 용 스플래시 화면이 있다는 것을 아무도 알 수 없습니다.

개발자가해야 할 유일한 일은 브랜딩 이미지를 올바른 위치에 놓는 것입니다. 그러면 스플래시 화면이 그대로 작동하기 시작합니다.

단계별로 수행하는 방법은 다음과 같습니다.

안드로이드에서 첫 번째 (내가 가장 좋아하는 플랫폼이기 때문에) 🙂

  1. Flutter 프로젝트에서 “android”폴더를 찾으십시오.

  2. 앱-> src-> main-> res 폴더로 이동하여 브랜딩 이미지의 모든 변형을 해당 폴더에 배치하십시오. 예를 들면 다음과 같습니다.

  • 밀도가 1 인 이미지는 밉맵 -mdpi에 배치해야합니다.
  • 밀도가 1.5 인 이미지는 밉맵 -hdpi에 배치해야합니다.
  • 밀도가 2 인 이미지는 밉맵 -xdpi에 배치해야합니다.
  • 밀도가 3 인 이미지는 밉맵 -xxdpi에 배치해야합니다.
  • 밀도가 4 인 이미지는 밉맵 -xxxdpi에 배치해야합니다.

기본적으로 안드로이드 폴더에는 drawable-mdpi, drawable-hdpi 등이 없지만 원하는 경우 만들 수 있습니다. 이 때문에 이미지는 밉맵 폴더에 배치해야합니다. 또한 스플래시 화면 (Android)에 대한 기본 XML 코드는 @drawable 리소스 대신 @mipmap을 사용합니다 (원하는 경우 변경할 수 있음).

  1. 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에서 두 번째 :

  1. Flutter 프로젝트에서 “ios”폴더를 찾으십시오.

  2. 러너-> 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,
      )),
    ),
  );
}
}