问题描述
我的代码
class _GenericTextFieldState extends State<GenericTextField> {
@override
Widget build(BuildContext context) {
return CupertinoTextField(
controller: textFieldController,padding: EdgeInsets.all(8),prefix: Icon(Icons.email_outlined),placeholder: widget.hint,);
}
}
final textFieldController = TextEditingController();
final textFieldProvider = Provider<String> ( (_) => textFieldController.text);
textFieldController 正在向 textFieldProvider 提供字符串。
class LoadingButton extends ConsumerWidget {
LoadingButton(this.buttonName);
final String buttonName;
@override
Widget build(BuildContext context,ScopedReader watch) {
String textInput = watch(textFieldProvider);
return RoundedLoadingButton(
successColor: mainColor,errorColor: Colors.orange,height: 40,color: mainColor,child: Text(buttonName,style: TextStyle(color: Colors.white)),controller: _btnController,onpressed: (){
mLog("Input from provider username: $textInput");
},);
}
}
然而,textInput
变量始终为空。
我错过了什么。
解决方法
您可以将 onChanged 与 StateProvider 一起使用 像这样
完整示例
final textFieldProvider = StateProvider<String>((ref) => "");
class Main extends StatelessWidget {
const Main({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return ProviderScope(
child: Scaffold(
appBar: AppBar(
title: Text('Title'),),body: Column(
children: [
Container(),_GenericTextFieldState(),LoadingButton("Test")
],);
}
}
class _GenericTextFieldState extends StatelessWidget {
const _GenericTextFieldState({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return CupertinoTextField(
padding: EdgeInsets.all(8),prefix: Icon(Icons.email_outlined),placeholder: "Input text",onChanged: (text) {
context.read(textFieldProvider).state = text;
},);
}
}
class LoadingButton extends ConsumerWidget {
LoadingButton(this.buttonName);
final String buttonName;
@override
Widget build(BuildContext context,ScopedReader watch) {
String textInput = watch(textFieldProvider).state;
return RaisedButton(
child: Text(buttonName,style: TextStyle(color: Colors.white)),onPressed: () {
print("Input from provider username: $textInput");
},);
}
}