🙄

FlutterでDialogにProviderを伝達する方法

に公開

備忘録

Providerを利用しているとき、ChangeNotifierProviderの子はすべて指定したインスタンスを共有できるが、Dialogが親子関係を無視してrootに生成されるため例外。

対処法として、以下のようにする。

// 設定ダイアログ表示
void showSettingDialog(BuildContext context) {
  final logic = Provider.of<VirtualMouseLogic>(context, listen: true);

  showDialog(
    context: context,
    builder: (_) {
      // ダイアログにProviderを適応させる場合はChangeNotifierProvider.valueを使う
      return ChangeNotifierProvider.value(value: logic, child: const SettingDialog());
    }
  );
}

Providerで通常と同じくインスタンスを取得してから、ChangeNotifierProvider.valueを使ってラッピングする。
Dialogの中では普通にProviderが使えるようになっている。

Discussion