Open11

[Flutter] アプリ開発のための備忘録

sho5sho5

[Flutter] URLを開く時に「ブラウザ」ではなく「アプリ」で開く手順 (iOS) | 220310

  • 使用プラグイン:url_launcher
  • Androidは自動でアプリが開くが、iOSはデフォルトがブラウザのために設定が必要?
  • 状態:未確認
参考ページ
sho5sho5

[Flutter] 特定のバージョンを指定する方法 | 220307

ターミナル
$ cd /Users/~ Flutter大元フォルダのパス //個別プロジェクトではない事に注意
$ git checkout 2.10.2 //ここでバージョン指定)
FVMを使う場合
sho5sho5

[Flutter] GoogleマップのAPIキーを秘匿 (flutter_dotenv) | 220309

.env
MAP_API_KEY="xxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
.gitignore
//.gitignoreに追加し、管理対象から外す
*.env 
// Dartで読み込み
String apiKey = dotenv.env['MAP_API_KEY']!;

▼iOSでの処理(Xcode)

ios/Runner/AppDelegate.swift
import UIKit
import Flutter
+import GoogleMaps

  @UIApplicationMain
  @objc class AppDelegate: FlutterAppDelegate {
    override func application(
      _ application: UIApplication,
      didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
+    let mapAPIKey = Bundle.main.object(forInfoDictionaryKey: "MapAPIKey") as! String
+        GMSServices.provideAPIKey(mapAPIKey)
      GeneratedPluginRegistrant.register(with: self)
      return super.application(application, didFinishLaunchingWithOptions: launchOptions)
ios/Runner/Info.plist
+ <!-- Google Maps API Key -->
+ <key>MapAPIKey</key>
+ <string></string>

+ <key>NSLocationWhenInUseUsageDescription</key>
+ <string>ここに位置情報アクセスに関する理由を記載</string>
使用パッケージ (flutter_dotenv)
ネイティブ側 (iOS, Android) で読み込む手順

AppDelegate.swiftに以下記述を忘れずに

import GoogleMaps
sho5sho5

[Flutter] Firebase Hostingで「利用規約」や「プライバシーポリシー」のWebページを作成 | 210821

ターミナル
$ firebase login
$ cd (作ったフォルダのパス)
$ firebase deploy
  • エラーが出る場合は$ firebase logout($ firebase init も必要?)
参考リンク
sho5sho5

[Flutter] MainActivity.javaのファイルが存在しない

・「MainActivity.kt」が代わりにある

これが発生したため
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Warning
──────────────────────────────────────────────────────────────────────────────
Your Flutter application is created using an older version of the Android
embedding. It is being deprecated in favor of Android embedding v2. Follow the
steps at

https://flutter.dev/go/android-project-migration

to migrate your project. You may also pass the --ignore-deprecation flag to
ignore this check and continue with the deprecated v1 embedding. However,
the v1 Android embedding will be removed in future versions of Flutter.
解答例

Solution

(訳)クラスファイルMainActivity.javaをJavaのコードで作成し、Kotlinのものを削除。それで上手くいくはずです。

※補足:android/app/src/main/java/com<domain>/android/<project_name>

public class MainActivity extends FlutterActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);
  }
}
sho5sho5

[Flutter] Widget外でDateFormatを使うとエラーが生じる

// Widget外にこれを追加すると
DateFormat('yyMMdd', "ja_JP").format(DateTime.now());

// A.例外が発生
// LocaleDataException (LocaleDataException: Locale data has not been initialized, call initializeDateFormatting(<locale>).)

// エラーメッセージに従い以下を追加
initializeDateFormatting("ja_Jp");

// B.別の例外が発生する
// UnsupportedError (Unsupported operation: Cannot modify unmodifiable map)

原因

// 1. Aに関して、以下言語設定より親部分で上記を実行していた
// 2. Bに関して、以下言語設定と競合していた
return MaterialApp(
  // 多言語対応のための処理
  localizationsDelegates: [
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate, // ペーストできない問題で2行追加
    DefaultCupertinoLocalizations.delegate
  ],
  home: Test(),
);
sho5sho5

【Flutter】iOSのSimulatorが「File name too long」で突然起動しなくなる

flutter run --debug --dart-define=FLAVOR=dev
Launching lib/main.dart on iPhone 12 in debug mode...

Xcode build done.                                           332.8s

Unable to install /Users/XXXX/Developer/YYYY/build/ios/iphonesimulator/Runner.app on 4C94954A-8CE8-408B-9006-8A85523DAD2C. This is sometimes caused by a malformed plist file:
ProcessException: Process exited abnormally:
An error was encountered processing the command (domain=NSPOSIXErrorDomain, code=63):
copyfile of file:///Users/XXXX/Developer/YYYY/build/ios/iphonesimulator/Runner.app/ to file:///Users/XXXX/Library/Developer/CoreSimulator/Devices/4C94954A-8CE8-408B-9006-8A85523DAD2C/data/Containers/Shared/SystemGroup/systemgroup.com.apple.installcoordinationd/Library/InstallCoordination/PromiseStaging/734B870A-DB0D-4CA6-A3E6-D6DC9D0CDF70/Runner.app failed: File name too long
Unhandled error domain NSPOSIXErrorDomain, code 63
  Command: xcrun simctl install 4C94954A-8CE8-408B-9006-8A85523DAD2C /Users/XXXX/Developer/YYYY/build/ios/iphonesimulator/Runner.app

Error launching application on iPhone 12.

Exited (sigterm)
過程
  1. ダメ↓

Found a fix for this error. what i did was to reset the simulator (Device -> Erase All Content and Settings), and then run $ flutter clean after that rebuild your app.

https://stackoverflow.com/questions/64458425/flutter-app-cant-run-on-ios-simulator-with-cycle-inside-runner-and-domain-nspo

直接的な解決策かは不明だけど、Androidも起動できなくなっており、最終的にこちらで解決↓↓
https://zenn.dev/link/comments/52a38e84e32f9a