无法使用 Riverpod 从文本字段中检索文本

问题描述

我的代码

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");
      },);
  }
}