Open12

flutter Tips集

takummatakumma

エミュレータ起動時のエラー

java.lang.RuntimeException: Unable to create Debug Bridge: Unable to start adb server: Process did not terminate within specified timeout, killing it
'C:\Users\[username]\AppData\Local\Android\Sdk\platform-tools\adb.exe start-server' failed -- run manually if necessary

原因

タスクマネージャを開くとabd.exeが複数実行されているのが原因だった。

解決法

adb.exeをタスクマネージャですべて閉じるか、再起動してもう一度エミュレータを起動したら、無事起動できた。

takummatakumma

実行時のエラー(Platform)

Failed to find Platform SDK with path: platforms;android-29

原因

コンパイルする対象のSDKバージョンが実行するエミュレータなどの環境のSDKバージョンより低いのが原因。

解決法1

android/app/build.gradleの以下の部分を適当なSDKバージョンに変更する。

android/app/build.gradle
android {
    compileSdkVersion 30

    defaultConfig {
        targetSdkVersion 30
    }
}

解決法2

android/build.gradle に以下を追加する

android/build.gradle
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"

    project.evaluationDependsOn(':app')

+    afterEvaluate {project ->
+        if (project.hasProperty("android") && project.property("android").compileSdkVersion.equals("android-29")) {
+            android {
+                compileSdkVersion 30
+            }
+        }
+    }
}
takummatakumma

Android Studioでコードを整形する

ショートカット: ctrl + Alt + L

うまく整形できないときは、カンマ,が各プロパティの末尾に入っているか確認する。

RaisedButton(
    child: Text("OK"), // <- カンマが必要
), // <- カンマが必要
takummatakumma

[Web] Github Actions で GitHub Pages に自動デプロイ

name: deploy

on:
  workflow_dispatch:
  push:
    branches:
      - main

jobs:
  build:
    name: Flutter Web Deploy
    runs-on: ubuntu-18.04

    steps:
    - name: Checkout
      uses: actions/checkout@v2
    
    - name: Setup Flutter
      uses: subosito/flutter-action@v1
      with:
        channel: 'beta'

    - name: Setting for Web
      run: flutter config --enable-web

    - name: Install
      run: flutter pub get

    - name: Build
      run: flutter build web
    
    - name: Deploy
      uses: peaceiris/actions-gh-pages@v3
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        publish_branch: gh-pages
        publish_dir: ./build/web
takummatakumma

[Web] GitHubPages でデプロイ時の404エラー

デプロイしたサイトにアクセスしたときの以下のようなエラー(サイトは表示されず真っ白)

Failed to load resource: the server responded with a status of 404 ()

原因

index.html で base URL が / に指定されている ->
https://github.com/{username}/{reponame} ではなく https://github.com/{username}/ が指定されてしまっている。

index.html
<base href="/">

解決法

index.html での <base> の部分を削除する。

index.html
+ 
- <base href="/">
takummatakumma

Android エミュレータで日本語対応 & 日本語入力

日本語対応

Setting > System > Languages & imput >Languages > Add a language > 日本語を選択 > 右のアイコンを上にドラッグして、日本語を 1 にする

日本語入力

設定 > システム > 言語 & 入力 > 画面キーボード > 画面キーボードを管理 > Gboard > 言語 で日本語を追加する

takummatakumma

showDialog の builder でのエラー

ソースコード例
onPressed: () => showDialog(
  context: context,
  builder: (BuildContext context) => AlertDialog(
    title: Text(_todoItems[index]),
  ),
),
エラー
BuildContext isn't a type.

原因

不明

解決法

BuildContext を削除することで一時的に解決することはできた。

解決法
- builder: (BuildContext context) => AlertDialog(
+ builder: (context) => AlertDialog(
takummatakumma

Hot Reload と Hot Restart の違い

Hot Reload

Hot Reload は、アプリの状態を保持したままコードの変更を取り込みます。

Hot Restart

Hot Restart は、変更を取り込んでアプリを再実行します。再実行するのでアプリの状態は失われます。

sample
-   List<String> _todoItems = [...];
+   List<Todo> _todoItems = [...];

このように変更してホットリロードをすると、_todoItemsList<Todo> に変更されますが、配列の要素(文字列)は保持されるのでエラーが起こります。
しかしホットリスタートすれば、配列の要素も一度削除されるので、エラーは起こらずに変更が取り込まれます。

参考

https://flutter.dev/docs/development/tools/hot-reload

takummatakumma

アンダースコア

変数名や関数名の前にアンダースコアをつけると、その変数や関数は private になります。

example
const foo = 5; // public
const _bar = "bar"; // private
takummatakumma

関数の引数をオブジェクトにする({}をつける)と、使う際にプロパティを指定するので、可読性が上がる。

定義するとき
void func({String hoge, double fuga}) {}
呼び出すとき
func(hoge: "hoge", fuga: 3.14)