Proper Riverpod Provider for Wrapping TextEditingController #2680
-
I have a scenario where I need to wrap TextEditingController() with a Riverpod provider. I think the reason is that TextEditingController() inherits from ChangeNotifier.
However, Riverpod does not recommend the use of ChangeNotifierProvider. Given this, what is the correct Riverpod provider to use with TextEditingController? Below is the sample code I am working with: final textFieldControllerProvider = Provider<TextEditingController>(
(ref) => TextEditingController(),
);
final textFieldControllerStateProvider = StateProvider<TextEditingController>(
(ref) => TextEditingController(),
);
final textFieldControllerFutureProvider = FutureProvider<TextEditingController>(
(ref) => TextEditingController(),
);
final textFieldControllerStreamProvider = StreamProvider<TextEditingController>(
(ref) => Stream.value(TextEditingController()),
);
final textFieldControllerStateNotifierProvider =
StateNotifierProvider<TextFieldController, TextEditingController>(
(ref) => TextFieldController());
final textFieldControllerChangeNotifierProvider =
ChangeNotifierProvider<TextEditingController>(
(ref) => TextEditingController(),
);
class TextFieldController extends StateNotifier<TextEditingController> {
TextFieldController() : super(TextEditingController());
}
class MyWidget extends ConsumerWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
print('#build MyWidget');
final controllerProvider = ref.watch(textFieldControllerProvider);
final controllerStateProvider = ref.watch(textFieldControllerStateProvider);
final controllerFutureProvider =
ref.watch(textFieldControllerFutureProvider);
final controllerStreamProvider =
ref.watch(textFieldControllerStreamProvider);
final textFieldControllerStateNotifier =
ref.watch(textFieldControllerStateNotifierProvider);
final controllerChangeNotifierProvider =
ref.watch(textFieldControllerChangeNotifierProvider);
return Scaffold(
appBar: AppBar(
title: const Text("Riverpod example"),
),
body: Column(
children: [
const Text('Provider'),
TextFormField(
controller: controllerProvider,
),
Text(controllerProvider.text),
const Text('StateProvider'),
TextFormField(
controller: controllerStateProvider,
),
Text(controllerStateProvider.text),
const Text('FutureProvider'),
TextFormField(
controller: controllerFutureProvider.value,
),
Text(controllerFutureProvider.value?.text ?? ''),
const Text('StreamProvider'),
TextFormField(
controller: controllerStreamProvider.value,
),
Text(controllerStreamProvider.value?.text ?? ''),
const Text('StateNotifierProvider'),
TextFormField(
controller: textFieldControllerStateNotifier,
),
Text(textFieldControllerStateNotifier.text),
const Text('ChangeNotifierProvider'),
TextFormField(
controller: controllerChangeNotifierProvider,
),
Text(controllerChangeNotifierProvider.text),
],
),
);
}
} |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 8 replies
-
Riverpod doesn't recommend using providers to store TextControllers. They belong to the local widget state. So either use a StatefulWidget or flutter_hooks Using a provider means that if two screens use the same provider, they will share their controller state. This is undesired. |
Beta Was this translation helpful? Give feedback.
Riverpod doesn't recommend using providers to store TextControllers. They belong to the local widget state. So either use a StatefulWidget or flutter_hooks
Using a provider means that if two screens use the same provider, they will share their controller state. This is undesired.