くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Flutterでスプラッシュ画面を追加する(flutter_native_splash)

flutter_native_splashパッケージを使ういい感じにできるっぽい。
対応しているのは、Android/iOS/Web。

flavorにも対応しているけど、Desktop系は非対応。

Flutter公式のドキュメントはこのあたり。

使い方

まずはインストール

# インストール
$ fvm flutter pub add flutter_native_splash

flutter_native_splash.yamlを用意し、
各種コマンドを実行すればOK

# スプラッシュ画面の作成
$ fvm flutter pub run flutter_native_splash:create

# スプラッシュ画面の削除
$ fvm flutter pub run flutter_native_splash:remove

設定ファイル

$ touch flutter_native_splash.yaml
flutter_native_splash:
  # 必須: 背景の色
  color: "#ffffff"
  # 必須: 中央のアプリアイコンの画像
  image: assets/logo.png
  # 下のブランディング画像
  branding: assets/branding.png
  # ダークテーマ時の設定
  color_dark: "#121212"
  image_dark: assets/logo.png
  branding_dark: assets/branding.png

  # Android12以降用の設定
  android_12:
    image: assets/logo.png
    icon_background_color: "#ffffff"
    branding: assets/branding.png
    image_dark: assets/logo.png
    icon_background_color_dark: "#121212"
    branding_dark: assets/branding.png

アイコンのサイズ

書かれているアイコンサイズはこんな感じ。

  • Android12以降(アダプティブアイコンと同じ)
    • icon backgroundなし: 1152×1152px(セーフエリア: 768px)
    • icon backgroundあり: 960×960px(セーフエリア: 640px)

また、exampleの画像サイズはこんな感じだった。

  • image: ... 550x1000(px/png/縦長)
  • branding: ... 360x189(px/png/横長)
  • android_12.image ... 960x960(px/png)

ソースはここを参照。

スプラッシュ画面を任意のタイミグで閉じる

デフォルトだと、自動的にスプラッシュ画面が閉じられるが、
初期化処理などの後までは残しておきたいときもある。

preserve()remove()を使うと、好きなタイミングにできるよう。

import 'package:flutter_native_splash/flutter_native_splash.dart';

void main() {
  WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
  FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
  runApp(const MyApp());
}

// whenever your initialization is completed, remove the splash screen:
    FlutterNativeSplash.remove();

flavor対応

flavorにも対応してるけど、ちょっと設定が必要。。
flavorの設定がされている前提。

設定ファイルはflutter_native_splash-<flavor>.yamlを用意。

# 設定画面の作成
$ touch flutter_native_splash-{dev,stag,prod}.yaml

# スプラッシュ画面の作成: flavor
$ fvm flutter pub run flutter_native_splash:create --flavor dev
# 一括作成
$ fvm flutter pub run flutter_native_splash:create --flavors dev,stag,prod

Androidは追加の設定は不要。

iOSの場合は、Xcodeを開いて追加設定が必要になる。

flutter_native_splash:create --flavor devを実行すると、
以下のファイルが作成される。

  • ios/Runner/Base.lproj/LaunchScreenDev.storyboard
  • ios/Runner/Assets.xcassets/LaunchBackgroundDev.imageset/
  • ios/Runner/Assets.xcassets/LaunchImageDev.imageset/

作成直後だと、LaunchScreenDev.storyboardが認識されていないので、

  • xed iosXcodeを開き、
  • LaunchScreen.storyboardと同じRunner/ディレクトリに
  • LaunchScreenDev.storyboardをDrag&Dropする
    • Copy items if neededをON

次にios/Runnser/Info.plistを開いて、
LaunchScreen.storyboardを切り替えられるように変更する。

  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
  <dict>
    <key>UILaunchStoryboardName</key>
-   <string>LaunchScreen</string>
+   <string>$(LAUNCH_SCREEN_STORYBOARD)</string>
  </dict>
  </plist>

最後に、LAUNCH_SCREEN_STORYBOARDを各構成ファイルに追加しておけばOK。

devDebug.xcconfigの場合、

  #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"
  #include "Generated.xcconfig"

+ LAUNCH_SCREEN_STORYBOARD=LaunchScreenDev.storyboard

<flavor>Debug.xcconfigの場合、

  #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"
  #include "Generated.xcconfig"

+ LAUNCH_SCREEN_STORYBOARD=LaunchScreen.storyboard

READMEでは、Build SettingsAdd User-Defined Settingで設定しているけど、
個人的には構成ファイルにまとめるほうが、見通しが良さそう。

また、Debug.xcconfigを参照する形でもよいかも。

  #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
  #include "Generated.xcconfig"

+ LAUNCH_SCREEN_STORYBOARD=LaunchScreen.storyboard

<flavor>Debug.xcconfigの場合、

  #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug-stag.xcconfig"
  #include "Generated.xcconfig"
+ #include "Debug.xcconfig"

注意点

READMEにいくつか注意書きが書かれてた。

  • Android12以降の設定
    • API31では表示されない場合がある。(API32以降では解決されるよう)
    • Google以外のランチャーから起動すると、正しく表示されない場合がある
    • 通知から起動した場合は、表示されない
  • iOS
    • スプラッシュ画面が更新されない場合がある
      • キャッシュが残っているので、再起動や再インストールを試す
      • flutter cleanを試したりするとよい

以上!!

参考にしたサイトさま