Flutterアプリ開発時のトラブルシューティング

私がアプリ開発を進めていくなかで出会ったトラブルとその対処法についてつらつらと書いています。

エディタ右上の「Get dependencies」が失敗する

Android Studioのエディタ右上に出てくる「Get dependencies」をクリックした時、「Could not resolve URL “https://pub.dartlang.org”.」が出ている場合、ネットワークに接続されていないかプロキシ設定の問題があります。

Android Studioでプロキシの設定をしていたとしても、エディタの右上に出てくる各種コマンドはその設定を参照してくれません。

解決策としては以下があります。

  • いったん非プロキシ環境下に戻して実行
    • この場合、Android Studioのプロキシ設定を外さないといけませんが、一番楽だと思います
  • 自分でコマンドを実行
    • Android Studioの下部にある「Terminal」を開きます
    • プロキシ設定コマンドを実行します(以下はWindowsでの例)
      • set HTTP_PROXY=http://ユーザ名:パスワード@プロキシサーバ名:ポート番号
      • set HTTPS_PROXY=http://ユーザ名:パスワード@プロキシサーバ名:ポート番号
        • パスワードに記号が入る場合はURLエンコードしてください
    • コマンドを実行
      • flutter pub get
  • ずっとプロキシ環境下で開発するなら、flutter.batにプロキシ設定コマンドを入れてしまう手も
    • flutterのインストール先がC:\flutterなら、C:\flutter\bin\flutter.batをテキストエディタで開き、上記のプロキシ設定コマンドを追記します
      • @ECHO offの次の行あたり

「Dart SDK is not configured」または「not applicable for the main.dart configuration」が表示される

他のユーザーが作ったプロジェクトを開いたりしたタイミングで起きたことがありました。

Android Studioのメニュー「File」→「Settings」から設定画面を開き、「Language & Frameworks」→「Flutter」と選択すると、「Flutter SDK path」がブランクになっていると思います。

その場合、Flutterをインストールしたフォルダを指定することで解消されます。(例:C:\flutter)

デバッグ実行時に修正したコードが反映されていない

原因は不明ですが、何かがきっかけになってホットリロードが無効になったと思われます。

いったんデバッグを中止して再度デバッグ実行するとほとんどの場合で元に戻ります。

プロキシ環境下でException attempting to connect to the VM Service: WebSocketException…が出まくる

環境変数に「NO_PROXY=127.0.0.1」を追加することで解消しました。

エミュレータ起動時に「Unable to locate adb」が出る

Android SDKの設定が効いていないか無効なために出るようです。

以下の解決方法がありました。

  • 方法1
    • Android Studioのメニュー「Tools」→「SDK Manager」から設定画面を開きます
    • 設定画面の「Appearance & Behavior」→「System Settings」→「Android SDK」を見つけます
    • 「Android SDK Location」が設定されていて正しい場合、その右にある「Edit」リンクを押し、何もせずにNextボタン・Finishボタンをクリック
    • OKボタンで設定画面を閉じます
  • 方法2
    • Android Studioのメニュー「File」→「Prooject Structure」を開きます
    • 「Project Settings」→「Project」を選択し、「Project SDK」が「<NO SDK>」になっている場合、インストールしたSDKを選択します

ビルド時にエラー「e: Incompatible classes were found in dependencies」が出る

kotlinのバージョンが古いとこのエラーになるようです。

Android Studioのメニュー「File」→「Settings」→「Language & Frameworks」→「Kotlin」を開き、バージョンをメモします。

android/build.gradleのkotlinのバージョンを修正します。

buildscript {
    :
    ext.kotlin_version = '1.7.10' // NOTE: ここをメモしたバージョンで置換
    :
}

デバッグ実行時に「Waiting for a connection from Flutter on Android SDK built for x86…」エラーのままになる

adbがエミュレーターとうまく繋がっていないため、エラーが続いてしまうようです。

adbコマンドで対処できました。

C:\Users\xxx>cd %APPDATA%\..\Local\Android\Sdk\platform-tools
C:\Users\xxx>adb kill-server
C:\Users\xxx>adb start-server

上記のコマンドでもエラーが出続ける場合、PC再起動で対処できると思います

デバッグ開始時にワーニング「Warning: Mapping new ns」が出る

ビルドツールのバージョンが古かったりすると出るワーニングのようです。

build.gradleにbuildToolVersionを追記します。(SDKのバージョンと合わせる)

:
android {
   :
   buildToolsVersion "30.0.2"
   :
}
:
  • エディタの右上に表示される「Open for editing in Android Studio」をクリック、New Windowで開きます
  • ダウンロード(長い)が実行され、右下に「Porject update recommended~」が表示されたら「Upgraded」をクリック
  • ダイアログの「Begin Upgrade」をクリック
  • 下に出てくるボタン「Run selected steps」をクリック
  • Androidプロジェクトをクローズし、再度Flutterプロジェクトを開きデバッグを実行するとワーニングが出なくなっていました

flutter doctorで「X cmdline-tools component is missing」が出る

Android SDK Command-line Tools (latest)をインストールすればいいようです。

  • Android Studioでメニュー「File」→「Settings」→「Appearance & Behavior」→「System Settings」→「Android SDK」→「SDK Tools」→「Android SDK Command-line Tools (latest)」をチェックして、OKボタンクリックでインストールされます

WebViewでエラー「net::ERR_CLEARTEXT_NOT_PERMITTED」が出る

Android9(APIレベル28)からTLS通信がデフォルトとなり、HTTPプロトコルは許可されなくなったようです。

しかしながら、ローカルPCに立てたWebサーバーと通信させたい/システムの要件でHTTPでしか通信できないケースでは、マニフェストファイルへの追記で対応が可能でした。

<manifest ...>
  <application ...>
    :
    android:usesCleartextTraffic="true"
    :
  >
</manifest>

全ての通信でHTTPを許可するのではなく、特定ドメイン等で許可させたい場合は以下のような設定で対応可能そうです

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config>
    <domain includeSubdomains="true">secure.example.com</domain>
    <domain includeSubdomains="true">cdn.example.com</domain>
    <trust-anchors>
      <certificates src="@raw/trusted_roots"/>
    </trust-anchors>
  </domain-config>
</network-security-config>

音声入力speech_to_textパッケージで「PlatformException(recognizerNotAvailable, Speech recognition not available on this device, , null)」エラーが出る

そのAndroid端末にGoogleアプリがインストールされていないか無効になっているために出ています。

Googleアプリが持つ音声入力機能を使っているそうなので、アプリをインストールするか有効にする必要があります。

複数行の入力設定にしたTextFieldで改行が入力できない

そのTextFieldがInkWellの子要素になっている場合に発生するそうです。(Enter/return key on a TextField with InkWell doesn’t work on the Samsung devices #74041

Flutter SDKが2.xの時に再現していたので最新版だと改善されている模様です。

Row内のTextで日本語/アルファベットの高さが合わない

日本語とアルファベットが混在する場合、Androidとしては、日本語は端末にインストールされているフォントを、アルファベットはRobotoフォントが使われるそうです。

日本語/アルファベットが同じRow内で混在すると、両者の使用フォントの違いが高さの違いに影響していました。

Textウィジェットでフォントを指定して回避しました。

プロキシ環境下でRunning Gradle task ‘assembleDebug’…時にホスト不明エラーが出る

Gradleのプロキシ設定がされていないために起きる現象です。

Gradleの設定ファイルにプロキシ設定をすることで解消できます。

systemProp.http.proxyHost={プロキシサーバー}
systemProp.http.proxyPort={ポート}
systemProp.http.proxyUser={アカウント}
systemProp.http.proxyPassword={パスワード}
systemProp.https.proxyHost={プロキシサーバー}
systemProp.https.proxyPort={ポート}
systemProp.https.proxyUser={アカウント}
systemProp.https.proxyPassword={パスワード}
systemProp.jdk.http.auth.tunneling.disabledSchemes=""