TextFormFieldのonChangedにクラス引数としてメソッドを渡す方法

コード

class _TextForm extends StatelessWidget {
  const _TextForm({
    required this.textEditingController,
    required this.onChanged,
  });

  final TextEditingController textEditingController;
  final void Function(String text) onChanged; //👈ここ

  @override
  Widget build(BuildContext context) {
    return TextFormField(
      controller: textEditingController,
      onChanged: onChanged, //👈ここ
    );
  }
}

呼び出し側

_TextForm(
   textEditingController: textEditingController,
   onChanged: (text) =>
      ref.read(_textProvider.notifier).state = text, //👈ここ
),

コード全文

final _textProvider = StateProvider.autoDispose((ref) => '');

class HomeScreen extends StatelessWidget {
  const HomeScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return const Scaffold(
      appBar: MyAppBar(title: 'Home'),
      body: _Body(),
    );
  }
}

class _Body extends HookConsumerWidget {
  const _Body();

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final textEditingController = useTextEditingController();

    return Center(
      child: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 20),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            _TextForm(
              textEditingController: textEditingController,
              onChanged: (text) =>
                  ref.read(_textProvider.notifier).state = text,
            ),
          ],
        ),
      ),
    );
  }
}

class _TextForm extends StatelessWidget {
  const _TextForm({
    required this.textEditingController,
    required this.onChanged,
  });

  final TextEditingController textEditingController;
  final void Function(String text) onChanged;

  @override
  Widget build(BuildContext context) {
    return TextFormField(
      controller: textEditingController,
      onChanged: onChanged,
    );
  }
}

関連記事


この記事が気に入ったらサポートをしてみませんか?