【问题标题】:Flutter textfield onChanged don't work when textfield bring value from controller当文本字段从控制器带来值时,颤动文本字段 onChanged 不起作用
【发布时间】:2020-09-25 09:04:12
【问题描述】:

我正在开发 Flutter 项目,但遇到了一个问题。文本字段应该从控制器中获取一个可以正常工作但 onChanged 函数不起作用的值。但是它不起作用。我必须重新输入值才能显示结果。

当我的文本字段带来值时,我如何从 onchanged 获得结果?

代码: // 搜索调用 api 的函数

class _SearchPageTState extends State<SearchPageT> {
  GlobalState _store = GlobalState.instance;
  List<dynamic> searchResults = [];
  searchT(value) async {
    SearchServicet.searchApiT(value).then((responseBody) {
      List<dynamic> data = jsonDecode(responseBody);
      setState(() {
        data.forEach((value) {
          searchResults.add(value);
        });
      });
    });
  }
  @override

/////// //code textfield search onchanged

Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          centerTitle: true,
        ),
        body: ListView(
          children: <Widget>[
            Padding(
              padding: const EdgeInsets.all(10.0),
              child: TextField(
                autofocus: true,
                controller: TextEditingController()
                  ..text = '${_store.get('num')}',
                onChanged: (value) {
                  searchResults.clear();
                  searchCodeighniterT(value);
                },
                textAlign: TextAlign.center,
                decoration: InputDecoration(
                  contentPadding: EdgeInsets.only(left: 25.0),
                  labelText: 'number',
                  border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(4.0),
                  ),
                  suffixIcon: IconButton(
                    icon: Icon(Icons.search),
                    onPressed: null,
                  ),
                ),
              ),
            ),
            SizedBox(
              height: 10.0,
            ),
            ListView.builder(
              physics: ScrollPhysics(),
              shrinkWrap: true,
              itemCount: searchResults.length,
              itemBuilder: (BuildContext context, int index) {
                return buildResultCard(context, searchResults[index]);
              },
            ),
          ],
        ),
      ),
    );
  }

//这里显示结果

Widget buildResultCard(BuildContext context, data) {
  return Padding(
    padding: const EdgeInsets.all(8.0),
    child: Column(
      children: <Widget>[
        new Container(
          decoration: BoxDecoration(
            image: DecorationImage(
                image: AssetImage("assets/bgwlgo.png"), fit: BoxFit.cover),
          ),
          margin: EdgeInsets.all(5.0),
          child: Column(
            children: <Widget>[
              new Card(
                child: ListTile(
                  title: Text(
                    "DATE:",
                  ),
                  subtitle: Text(
                    data['DATETIME'].toString(),
                  ),
                ),
              ),
              new Card(
                child: ListTile(
                  title: Text(
                    "TRAITEMENT:",
                  ),
                  subtitle: Text(
                    data['TRAITEMENT_DETAIL'].toString()
                  ),
                ),
              ),
              new Padding(
                padding: EdgeInsets.all(9.0),
              ),
            ],
          ),
        ),
        Divider(
          color: Colors.black,
        )
      ],
    ),
  );
}

【问题讨论】:

  • 请尝试改进您的描述。我知道英语不是您的母语,但请尝试清理它。事实上,你可以继续写近 50 个单词,没有逗号或句号。这是非常难以阅读的。这意味着您获得帮助的机会可能很低。尽量遵循指南:stackoverflow.com/help/how-to-ask
  • 你能再看看我的帖子吗谢谢
  • 进步很大!
  • 您是否尝试过单独重现您的问题?在您的应用程序的上下文之外。仅测试 TextField 的 onChanged 方法,如果它有效,则增加您在应用程序中存在的复杂性,直到它中断并且您可以识别他的问题?
  • 是的,我尝试了 onchenged 方法,当我手动输入值时效果很好,但是当我从控制器调用值时没有显示结果,所以我必须手动重新输入值它工作

标签: flutter dart textfield


【解决方案1】:

正如在 cmets 中讨论和理解的那样,这里有几个可能的解决方案。

如果您使用的是有状态的 Widget 并且需要一个控制器用于您的 TextFormField,您可以使用它来设置 TextFormField 上的文本。否则,您可以只使用 initialValue 属性:

class TextFieldIssue64061076 extends StatelessWidget {
  final TextEditingController _textEditingController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children:[
        Text('Page 1'),
        TextFormField(
          controller: _textEditingController,
        ),
        FlatButton(
          child: Text('Submit'),
          onPressed: () => Navigator.of(context).push(MaterialPageRoute(
            builder: (context) {
              return SecondPage64061076(text: _textEditingController.text);
            }
          )),
        ),
      ],
    );
  }
}

class SecondPage64061076 extends StatefulWidget {
  final String text;

  SecondPage64061076({
    this.text
  });

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

class _SecondPage64061076State extends State<SecondPage64061076> {
  final TextEditingController _textEditingController = TextEditingController();

  @override
  void initState() {
    //  You can either use a text controller to set the text on the text field
    // or the initialValue below
    if(widget.text != null && widget.text != ''){
      _textEditingController.text = widget.text;
      methodToCallOnChanged(widget.text);
    }else{
      _textEditingController.text = '';
    }
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text('Page 2'),
          TextFormField(
            controller: _textEditingController,
            onChanged: (value) => methodToCallOnChanged(value),
            // As mentioned you could just use the initial value, it you don't need
            // a Stateful Widget
            // initialValue: widget.text ?? '',
          ),
        ]
      ),
    );
  }

  void methodToCallOnChanged(data){
    print('I was called onChange or when the view opened and there was data');
  }
}

【讨论】:

  • 这将允许我检索第二页的 textfeild 上的值,(已经工作的东西)控制器:TextEditingController () ..text = '$ {_ store.get ('num' )}', 但是如何在文本字段检索到值后立即在 onchanged 方法上调用函数提及者
  • 一旦在文本字段中检索到值,就会触发一个动作来调用另一个函数,正如您在我的代码 onChanged 中看到的那样:(value) { searchResults.clear (); searchCodeighniterT(值); },
  • 非常感谢您为帮助我所做的一切,希望找到一个可以在未来帮助其他人的解决方案
  • 你是对的。我将添加有关 onChange 的缺失代码,并在来自另一个视图时触发相同的方法。
  • João Soares 先生终于成功了,我不知道该怎么感谢您,上帝保佑您,经过一周的辛苦工作,上帝派您来帮助我,再次感谢您先生。跨度>
猜你喜欢
  • 2021-08-23
  • 2019-07-13
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多