スマホ実機でTextFieldにフォーカスすると起きるひどい画面ずれ – 開発日記(103)

2024/06/09 ~ 06/12

ログイン・ログアウト周りの処理を改善をしながら、スマホのブラウザでアイディアレーンがどの程度動くのかを確認していた。

そのなかでスマホ実機で動作確認をしていたところ、ひどい不具合に遭遇している。

事象としては、TextFieldにフォーカスをあててキーボードが出てくると画面下部に謎の空間が入りこむというもの。

下記画像はTextFieldにフォーカスが当たりキーボードが表示され、画面全体が押し上げられている状態。
(色が派手なのは気にしないで下さい。フォーカスされたTextFieldeは画面外に消えています)

この時点で、なんか画面全体がごそっと上に行ってしまっている状態。

そしてフォーカスがオフになりスクリーンキーボードが消えたあと、キーボードが消えた部分には謎の白い領域が残っている。

この白い領域、なんと何も制御出来なくてずっと残り続ける

え?なにこれ!?

これはPCでは発生せず、iPhoneのChromeからアクセスしたときに発生した。
AndroidやiOS用のビルドでもおそらく発生しない。Flutter Webかつスマホ実機からのアクセスのみの事象。

最初は自分の制御の問題なのか?と思って相当色々な回避策を探した。
もちろんScaffoldのresizeToAvoidBottomInsetの値を変えたりもした。

しかし調べてみるとflutterのTextField (EditableText) 自体が引き起こす問題のようだ。
GitHubのIssue:Keyboard issue on mobile Web platform #124205

これは対処が難しい。しかも1年以上治っていない。

やっかいなのが、Webにデプロイしてかつスマホ実機からアクセスしないと、不具合の再現が出来ないこと。
つまりデバッグも出来ない。
対処方法も不明。
これは困った……。

仕方がなくdartpadでテストしていたら、自分の予想していた更に外側に空欄が発生した。

え?dartpadのページ丸ごと上に行っちゃった???つまり「Flutter描画領域のさらに下」に空白が出現するということなのかも。

そりゃ制御出来ないわけだ……。

ということでflutterの不具合で大変時間を無駄にしているこの頃。
flutter Web、特にTextField周りは、こういった結構致命的な事象が長期間放置されていて辛い。

再現用のflutterサンプルコード

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    builder: (context, child) => const MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  
  State<StatefulWidget> createState() {
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp> {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          color: Colors.blueAccent,
          child: Column(
            children: [
              const Spacer(),
              Text(
                'Media query inset vertical ${MediaQuery.of(context).viewInsets.vertical}',
                style: const TextStyle(fontSize: 14, color: Colors.black),
              ),
              Padding(
                padding: EdgeInsets.only(
                    bottom: MediaQuery.of(context).viewInsets.vertical),
                child: Container(
                  padding: const EdgeInsets.all(16),
                  color: Colors.indigo,
                  child: TextField(
                    controller: TextEditingController(),
                    focusNode: FocusNode(),
                    style: const TextStyle(fontSize: 14, color: Colors.black),
                    cursorColor: Colors.white,
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

補足:
この問題は回避策を模索しながらずっと悩まされ続け、2025年1月現在も解決していません
必ず起きるわけではなくスマホの機種とブラウザの組み合わせによって起きるようです。

idea Laneはスマホでも利用可能ですが、こういった未解決課題があるためログイン画面で下記のように表記しています


※開発日記は当時の記録をもとに作成し、必要に応じて加筆・補足しています

この記事はアイディア整理ソフト「idea Lane」の開発記録です

どなたでも、ユーザ登録だけで無料ですぐに使えます
テキストベースの思考整理ツール「idea Lane」


0

コメント / Comment

タイトルとURLをコピーしました