Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.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 从TextWidget flift获取文本_Flutter_Flutter Layout_Textfield - Fatal编程技术网

Flutter 从TextWidget flift获取文本

Flutter 从TextWidget flift获取文本,flutter,flutter-layout,textfield,Flutter,Flutter Layout,Textfield,我正在创建一个天气应用程序,其中我向文本字段提供一个位置字符串,并获取其中的文本。我知道如果我每次都使用TextField小部件,我可以做到这一点,但我想使用代码的可重用性,这就是为什么我创建了一个名为TextFieldWidget的不同小部件,其中我提供了一个提示变量,它返回其中的文本。我不知道怎么做才能返回文本。这是我的密码 import 'package:flutter/material.dart'; class TextFieldWidget extends StatefulWidge

我正在创建一个天气应用程序,其中我向文本字段提供一个位置字符串,并获取其中的文本。我知道如果我每次都使用TextField小部件,我可以做到这一点,但我想使用代码的可重用性,这就是为什么我创建了一个名为TextFieldWidget的不同小部件,其中我提供了一个提示变量,它返回其中的文本。我不知道怎么做才能返回文本。这是我的密码

import 'package:flutter/material.dart';

class TextFieldWidget extends StatefulWidget {

  final String _hint;

  TextFieldWidget(this._hint);

  @override
  _TextFieldWidgetState createState() => _TextFieldWidgetState();
}

class _TextFieldWidgetState extends State<TextFieldWidget> {

  TextEditingController _textEditingController;
  InputDecoration _inputdecoration;

  @override
  void initState() {
    super.initState();
    _textEditingController = TextEditingController();
    _inputdecoration = InputDecoration(hintText: widget._hint,floatingLabelBehavior: FloatingLabelBehavior.always);
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      autocorrect: true,
      controller: _textEditingController,
      keyboardType: TextInputType.text,
      enableSuggestions: true,
      decoration: _inputdecoration,
      onSubmitted: (value){
          // somehow return data
          // I want to access this part..
      },
    );
  }
}
导入“包装:颤振/材料.省道”;
类TextFieldWidget扩展StatefulWidget{
最后的字符串提示;
TextFieldWidget(此.\u提示);
@凌驾
_TextFieldWidgetState createState()=>TextFieldWidgetState();
}
类_TextFieldWidgetState扩展状态{
TextEditingController\u TextEditingController;
输入装饰_输入装饰;
@凌驾
void initState(){
super.initState();
_textEditingController=textEditingController();
_inputdecoration=inputdecoration(hintText:widget.\u提示,floatingLabelBehavior:floatingLabelBehavior.always);
}
@凌驾
小部件构建(构建上下文){
返回文本字段(
自动更正:正确,
控制器:_textededitingcontroller,
键盘类型:TextInputType.text,
使能建议:正确,
装饰:输入装饰,
提交:(值){
//以某种方式返回数据
//我想访问此部分。。
},
);
}
}

1。您必须在调用类中创建一个方法

void _setTextValue(String value) {
  // Submitted text should appear here from value
}


TextFieldWidget(_setTextValue)
2。在TextFormField中使用此选项,然后

  final Function _setValue;

  TextFieldWidget(this._setValue);
3。内部提交呼叫

widget._setValue(value);
最后,您将在调用类中获得值

编辑:

class _TextFieldWidgetState extends State<TextFieldWidget> {

  TextEditingController _textEditingController;
  InputDecoration _inputdecoration;

  @override
  void initState() {
    super.initState();
    _textEditingController = TextEditingController();
    _inputdecoration = InputDecoration(hintText: 'UserName',floatingLabelBehavior: FloatingLabelBehavior.always);
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      autocorrect: true,
      controller: _textEditingController,
      keyboardType: TextInputType.text,
      enableSuggestions: true,
      decoration: _inputdecoration,
      onSubmitted: (value){
        widget.getUserName(value);
        // somehow return data
        // I want to access this part..
      },
    );
  }
}
我们可以使用命名参数在调用小部件本身时添加回调,这是正确的方法

示例:

class _TextFieldWidgetState extends State<TextFieldWidget> {

  TextEditingController _textEditingController;
  InputDecoration _inputdecoration;

  @override
  void initState() {
    super.initState();
    _textEditingController = TextEditingController();
    _inputdecoration = InputDecoration(hintText: 'UserName',floatingLabelBehavior: FloatingLabelBehavior.always);
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      autocorrect: true,
      controller: _textEditingController,
      keyboardType: TextInputType.text,
      enableSuggestions: true,
      decoration: _inputdecoration,
      onSubmitted: (value){
        widget.getUserName(value);
        // somehow return data
        // I want to access this part..
      },
    );
  }
}

注意:我们可以添加任意数量的命名参数,如此

以下解决方案是否适用于您?是的,它确实有效,谢谢。我想问另一个问题,像这样单独使用所有小部件作为一个单独的实体是否明智?我创建这些类是为了重用它。你可以像这样单独使用所有的小部件。对于我来说,我曾经编写一个公共类来管理一些像这样的小的公共小部件。不需要类或状态完整的小部件。我编写返回小部件的函数。对于一个大的自定义小部件,我将它放在一个单独的类中。你尝试过添加回调函数吗?是的,当然。@Jay Dangar:编辑了答案。看一看,你能详细说明一下吗?我没有明白。这和我前面的例子一样,但唯一的区别是我直接在构造函数中添加函数,你可以添加另一个TextFeId并传递另一个,然后遵循相同的方法。我相信你会得到这个。
void _setTextValue(String value) {
  // Submitted text should appear here from value
}


TextFieldWidget(_setTextValue)