【问题标题】:Cannot retrieve text from textfield with Riverpod无法使用 Riverpod 从文本字段中检索文本
【发布时间】:2021-07-18 00:57:21
【问题描述】:

我的代码

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 变量始终为空。 我错过了什么。

【问题讨论】:

    标签: flutter riverpod


    【解决方案1】:

    您可以将 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");
          },
        );
      }
    }
    

    【讨论】:

    • 我试过了,textInput 是空白
    • 你用过 String textInput = watch(textFieldProvider).state;而不是 String textInput = watch(textFieldProvider);
    • 是的,我确实在监视功能后使用了 .state
    • 我的错,原来我在看另一个提供商。非常感谢。
    猜你喜欢
    • 2013-08-12
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多