Flutter: Macのデスクトップアプリで、TextFieldのテキストを右から左に選択するとRangeErrorになる
結論:カーソルの開始・終了位置を大小比較して補正する
2022/3/7 Flutter エラー・バグ日記
TextField内のテキスト選択部分を抽出するために、以下のコードを入れていた。
controller.text.substring(controller.selection.baseOffset, controller.selection.extentOffset)
※「controller」は、TextEditingControllerのインスタンス
これをMacのデスクトップアプリとしてビルドし、テキストを右から左に向かって選択したら、以下のエラーが出た。
The following RangeError was thrown during a scheduler callback:
Value not in range: 11
When the exception was thrown, this was the stack:
#0 _StringBase.substring (dart:core-patch/string_patch.dart:402:7)
・・・以下略・・・
Androidアプリや、iOSアプリとしてビルドした時は発生しなかった。
substringメソッドがエラーになっているようなので、print文を入れて、「controller.selection.baseOffset」と「controller.selection.extentOffset」の値を見てみると、左から右に選択した時は、
.baseOffset < .extentOffset
であるが、右から左に選択すると、
.baseOffset > .extentOffset
となってしまい、substringメソッドの引数の条件エラーになるとわかった。
一方、AndroidアプリやiOSアプリの場合を調べると、選択範囲を左に広げても、右に広げても、常に
.baseOffset < .extentOffset
の状態が維持されていた。そのためエラーにならない。
仕方なく、コード内にOS判定による条件分岐を入れ、Macデスクトップの場合は、
.baseOffset > .extentOffset
となったら、substringメソッドの2つの引数を入れ替える修正を行い、無事、解消できた。
やはりiOS用とMac用とでは、微妙な違いがある模様。。
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/