防止更新 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),
);
}
}
使用 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),
);
}
}