防止更新 TextField (Riverpod)

Prevent Updating TextField (Riverpod)

使用 Riverpod 在下面的代码中。 我不希望通过重建更新 textField 值 只是我想第一时间从状态中获取值,我需要不断地监听状态来更新其他东西。

如果用户更新了字段然后重新构建了小部件,我需要在不刷新的情况下保留用户的值。

class Example extends ConsumerWidget {
  const Example({
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final state = ref.watch(myStateProvider);
    return TextFormField(
      controller: TextEditingController(text: state.firstName.value),
      textInputAction: TextInputAction.next,
      decoration: InputDecoration(
          labelText: 'First Name', errorText: state.firstName.errorMessage),
    );
  }
}

不使用onChange

您可以使用 ConsumerStatefulWidget:

class Example extends ConsumerStatefulWidget {
  const Example({
    Key? key,
  }) : super(key: key);

  @override
  _ExampleState createState() => _ExampleState();

}

class _ExampleState extends ConsumerState<Example> {
  final _textEditingController = TextEditingController();
  
  @override
  void initState() {
    super.initState()
    _textEditingController.text = ref.read(myStateProvider).firstName.value;
  }
  
  @override
  void dispose() {
    _textEditingController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final state = ref.watch(myStateProvider);
    return TextFormField(
      controller: _textEditingController,
      textInputAction: TextInputAction.next,
      decoration: InputDecoration(
          labelText: 'First Name', errorText: state.firstName.errorMessage),
    );
  }
}