Flutter: Macのデスクトップアプリで、TextFieldのテキストを右から左に選択するとRangeErrorになる

※当サイトは、アフィリエイト広告を利用しています

結論:カーソルの開始・終了位置を大小比較して補正する

2022/3/7 Flutter エラー・バグ日記

 

TextField内のテキスト選択部分を抽出するために、以下のコードを入れていた。

 

controller.text.substring(controller.selection.baseOffset, controller.selection.extentOffset)
※「controller」は、TextEditingControllerのインスタンス

 

これをMacのデスクトップアプリとしてビルドし、テキストを右から左に向かって選択したら、以下のエラーが出た。

 

本記事はライトな日記思考で書いているので、詳細説明はしておらず、基本、テキストのみで画像とかは載せておりません。。m(_ _)m

解説記事ではないため、解決していない内容や、その時々の間違った解釈を述べてしまっている可能性が大いにありますので、何卒、ご了承ください。

 

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の基礎文法を素早くインプットできる/


Dart入門 - Dartの要点をつかむためのクイックツアー

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