Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter NoSuchMethodError:null:';保存';尝试保存TextFormField时_Flutter_Widget_Flutter Web - Fatal编程技术网

Flutter NoSuchMethodError:null:';保存';尝试保存TextFormField时

Flutter NoSuchMethodError:null:';保存';尝试保存TextFormField时,flutter,widget,flutter-web,Flutter,Widget,Flutter Web,我试图将TextFormField的内容保存为字符串,以便将其发送到服务器,但收到此错误 The following JSNoSuchMethodError was thrown while handling a gesture: NoSuchMethodError: invalid member on null: 'save' 我用的是颤振网 代码 服务/发布功能还没有实现,现在它只是用于测试 class _EditViewState extends State<EditView>

我试图将TextFormField的内容保存为字符串,以便将其发送到服务器,但收到此错误

The following JSNoSuchMethodError was thrown while handling a gesture:
NoSuchMethodError: invalid member on null: 'save'
我用的是颤振网

代码 服务/发布功能还没有实现,现在它只是用于测试

class _EditViewState extends State<EditView> {
  final int cardId;
  final _formKey = GlobalKey<FormState>();
  bool _isLoading = false;
  var _card = jsonDecode('{}');
  var _changedCard = '';
  _EditViewState({this.cardId});

// <!--Snip--!>

  @override
  void initState() {
    super.initState();
    loadCard();
  }

  loadCard() async {
    setState(() {
      _isLoading = true;
    });
    _card = await read('http://localhost:8000/edit/' + cardId.toString());
    _card = jsonDecode(_card);
    _card = stripId(_card['content']);
    setState(() {
      _isLoading = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: const Text('Edit Card')),
        body: _isLoading
            ? CircularProgressIndicator()
            : Column(children: [
                TextFormField(
                    key: _formKey,
                    initialValue: _card,
                    maxLines: null,
                    onSaved: (value) {
                      _changedCard = value;
                    }),
                ElevatedButton(
                    child: Text('Save Changes'),
                    onPressed: () {
                      _formKey.currentState.save();
                      sendCard(_changedCard, cardId);
                      Navigator.pop(context);
                    })
              ]));
  }
}
以下是我的文本控制器解决方案与先前代码的不同之处:

class _EditViewState extends State<EditView> {
// <!--Snip--!>

  final controller = TextEditingController();

// <!--Snip--!>

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

// <!--Snip--!>

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: const Text('Edit Card')),
        body: _isLoading
            ? CircularProgressIndicator()
            : Column(children: [
                TextFormField(
                    key: _formKey,
                    controller: controller,
                    initialValue: _card,
                    maxLines: null,
                    onSaved: (value) {
                      _changedCard = value;
                    }),
                ElevatedButton(
                    child: Text('Save Changes'),
                    onPressed: () {
                      // _formKey.currentState.save();
                      _changedCard = controller.text;
                      sendCard(_changedCard, cardId);
                      Navigator.pop(context);
                    })
              ]));
  }
}
class\u EditViewState扩展状态{

//您不能使用
GlobalKey
变量作为
TextField
的键。您必须在包装
TextField
表单
小部件中使用它

final_formKey=GlobalKey();
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:常量文本(“编辑卡”),
正文:_正在加载
?循环压缩机指示器()

:Form(//您可能需要使用表单小部件包装列,并在TextFormField中设置key=\u formKey。为什么设置maxLines:null?为什么不在loadCard()方法的setState中包装_card?
class _EditViewState extends State<EditView> {
// <!--Snip--!>

  final controller = TextEditingController();

// <!--Snip--!>

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

// <!--Snip--!>

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: const Text('Edit Card')),
        body: _isLoading
            ? CircularProgressIndicator()
            : Column(children: [
                TextFormField(
                    key: _formKey,
                    controller: controller,
                    initialValue: _card,
                    maxLines: null,
                    onSaved: (value) {
                      _changedCard = value;
                    }),
                ElevatedButton(
                    child: Text('Save Changes'),
                    onPressed: () {
                      // _formKey.currentState.save();
                      _changedCard = controller.text;
                      sendCard(_changedCard, cardId);
                      Navigator.pop(context);
                    })
              ]));
  }
}