Flutter 尝试从用户url输入中获取一些数据,然后显示TextFormField并用获取的数据初始化它们

Flutter 尝试从用户url输入中获取一些数据,然后显示TextFormField并用获取的数据初始化它们,flutter,flutter-layout,facebook-opengraph,Flutter,Flutter Layout,Facebook Opengraph,所以基本上我是个新手。 问题是,当我向用户请求url输入,然后从输入链接获取OpenGraph数据,并试图显示一个新列,其中包含TextFormFields和我从url的OpenGraph中获取的初始值 我尝试用新数据设置TextFormField controller.text,还尝试设置在用户按下提交按钮时设置的变量,但我一直收到一个错误消息 ═══════════════════════════════════════════════════════════════════════════

所以基本上我是个新手。 问题是,当我向用户请求url输入,然后从输入链接获取OpenGraph数据,并试图显示一个新列,其中包含TextFormFields和我从url的OpenGraph中获取的初始值

我尝试用新数据设置TextFormField controller.text,还尝试设置在用户按下提交按钮时设置的变量,但我一直收到一个错误消息

════════════════════════════════════════════════════════════════════════════════
Reloaded 5 of 635 libraries in 762ms.

════════ Exception caught by widgets library ═══════════════════════════════════
The following assertion was thrown building EditPostScreen(dirty, state: _EditPostScreenState#f6ac9):
'package:flutter/src/material/text_form_field.dart': Failed assertion: line 117 pos 15: 'initialValue == null || controller == null': is not true.


Either the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=BUG.md

User-created ancestor of the error-causing widget was
    MaterialApp 
lib\main.dart:25
When the exception was thrown, this was the stack
#2      new TextFormField 
package:flutter/…/material/text_form_field.dart:117
#3      _EditPostScreenState.build 
package:crusty/…/edit_post/edit_post_screen.dart:57
#4      StatefulElement.build 
package:flutter/…/widgets/framework.dart:4047
#5      ComponentElement.performRebuild 
package:flutter/…/widgets/framework.dart:3941
#6      Element.rebuild 
package:flutter/…/widgets/framework.dart:3738
...
════════════════════════════════════════════════════════════════════════════════
Reloaded 5 of 635 libraries in 700ms.
这是我所有的小部件

  final _formKey = GlobalKey<FormState>();
  final _urlController = TextEditingController();
  final _titleController = TextEditingController();
  final _imageController = TextEditingController();


  var _isFetchedUrl = false;

  @override
  void dispose() {
    _urlController.dispose();
    _imageController.dispose();
    _titleController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(''),
      ),
      body: Form(
        key: _formKey,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextFormField(
              controller: _urlController,
              autofocus: true,
              decoration:
                  InputDecoration(hintText: 'Enter the url for your post'),
              validator: (value) {
                bool _validURL = Uri.parse(value).isAbsolute;
                if (value.isEmpty) {
                  return 'Please enter url for your new post';
                } else if (_validURL) {
                  return 'Pleas make sure you entered valid URL';
                }
                return null;
              },
            ),
            _isFetchedUrl == false
                ? Container()
                : Column(
                    children: <Widget>[
                      TextFormField(
                          controller: _titleController,
                          initialValue: _titleController.text,
                          decoration: InputDecoration(
                              hintText: 'Enter title for your post'),
                          validator: (value) {
                            if (value.isEmpty) {
                              return 'Please enter title for your new post';
                            }
                            return null;
                          }),
                      TextFormField(
                          controller: _imageController,
                          initialValue: _imageController.text,
                          decoration: InputDecoration(
                              hintText: 'Enter subtitle for your post'),
                          validator: (value) {
                            if (value.isEmpty) {
                              return 'Please enter subtitle for your new post';
                            }
                            return null;
                          }),
                    ],
                  ),
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 16.0),
              child: RaisedButton(
                onPressed: () async {
                  // Validate returns true if the form is valid, or false
                  // otherwise.
                  if (_formKey.currentState.validate()) {
                    // If the form is valid, display a Snackbar.
                    Scaffold.of(context).showSnackBar(
                        SnackBar(content: Text('Processing Data')));
                  }
                  var data = await OpenGraphParser.getOpenGraphData(_urlController.text);
                  print(data['description']);

                  setState(() {
                    _titleController.text = data['description'];
                   _imageController.text = data['image'];
                   _isFetchedUrl = true;
                  });
                  // print(_urlController.text);
                },
                child: Text('Load my post'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

final_formKey=GlobalKey();
final _urlController=TextEditingController();
最终_titleController=TextEditingController();
最终_imageController=TextEditingController();
var_isFetchedUrl=false;
@凌驾
无效处置(){
_urlController.dispose();
_dispose();
_titleController.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“”),
),
正文:表格(
键:_formKey,
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
TextFormField(
控制器:_urlController,
自动对焦:对,
装饰:
InputDecoration(hintText:“输入帖子的url”),
验证器:(值){
bool _validul=Uri.parse(value).isAbsolute;
if(value.isEmpty){
返回“请输入新帖子的url”;
}否则如果(_validull){
返回“请确保您输入了有效的URL”;
}
返回null;
},
),
_isFetchedUrl==false
?容器()
:列(
儿童:[
TextFormField(
控制器:\标题控制器,
initialValue:_titleController.text,
装饰:输入装饰(
hintText:“输入文章标题”),
验证器:(值){
if(value.isEmpty){
返回“请输入新帖子的标题”;
}
返回null;
}),
TextFormField(
控制器:_图像控制器,
初始值:_imageController.text,
装饰:输入装饰(
hintText:“为您的帖子输入副标题”),
验证器:(值){
if(value.isEmpty){
返回“请为您的新帖子输入字幕”;
}
返回null;
}),
],
),
填充物(
填充:常量边集。对称(垂直:16.0),
孩子:升起按钮(
onPressed:()异步{
//如果表单有效,则Validate返回true,否则返回false
//否则。
if(_formKey.currentState.validate()){
//如果表单有效,则显示一个快捷键。
Scaffold.of(上下文).showSnackBar(
SnackBar(内容:文本(“处理数据”));
}
var data=wait OpenGraphParser.getOpenGraphData(_urlController.text);
打印(数据['description']);
设置状态(){
_titleController.text=数据['description'];
_imageController.text=数据['image'];
_isFetchedUrl=true;
});
//打印(_urlController.text);
},
child:Text('Load my post'),
),
),
],
),
),
);
}
}

我想在Facebook上做一些类似的事情,当你通过一个链接时,它会立即预览该链接,但我需要用户在我加载数据后编辑它的能力。错误是因为你不能同时将
初始值
控制器
设置为
文本表单字段
,是一个还是另一个

如果要使用控制器设置初始值,则在初始化控制器时,可以向其传递初始值,如下所示:

final _urlController = TextEditingController(text: "Initial value");

你能解释一下我如何在从url获取数据后才初始化吗?你可以做_urlController.text=newText;我明白了,我把它复杂化了,但最终还是明白了,然后呢!