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

Cannot retrieve text from textfield with 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");
      },
    );
  }
}