🔴

FlutterのGetXでNullableなRx変数を宣言する方法

2023/03/01に公開

Flutterの状態管理ライブラリGetXで宣言した値を監視したい時、RxIntなどのrx変数を使いますが、intではなくint?を監視したいケースがあります。例えば、選択肢にnullが含まれるセレクトボックスのインデックスを監視したい時などが考えられます。そんな時はRxInt?ではなくRxnIntを宣言しましょう。

プリミティブ型の場合

間違った例

RxInt? selectedIndex;

selectedIndex!.listen((value) {
  // selectedIndexが変更されると呼びたい処理
  // しかし、selectedIndexにnullが入るとエラーになる
});

正しい例

final RxnInt selectedIndex = RxnInt();

selectedIndex.listen((value) {
  // selectedIndexが変更されると呼びたい処理
  // valueの型がint?で受け取れる
});

RxInt, RxDouble, RxStringなどのプリミティブ型のrx変数はGetXに用意されていますが、自身が定義したオブジェクトやDateTimeなどプリミティブ型でない変数をrx変数として扱いたい場合は、以下のように定義することができます。

プリミティブ型以外の型の場合

間違った例

Rx<DateTime>? nullableDateTime;

nullableDateTime!.listen((value) {
  // nullableDateTimeが変更されると呼びたい処理
  // nullableDateTimeにnullが入るとエラー
});

正しい例

// null状態で初期化かつ監視が有効
final Rxn<DateTime> nullableDateTime = Rxn<DateTime>();

nullableDateTime.listen((value) {
  // nullableDateTimeが変更されると呼びたい処理
  // valueの型がDateTime?で受け取れる
});

Rx変数をNullableだけどnull以外で初期化したい場合(おまけ)

// DateTime.now()として初期化かつ監視が有効
final Rxn<DateTime> nullableDateTime = Rxn<DateTime>(DateTime.now());

Discussion