更改文本字段,调用 api - 如何限制这个?

Posted

技术标签:

【中文标题】更改文本字段,调用 api - 如何限制这个?【英文标题】:TextField on change, call api - how to throttle this? 【发布时间】:2019-07-12 21:37:54 【问题描述】:

如果我有一个文本字段,并且在该文本字段发生更改时,我会调用一个调用 API 的函数,我该如何限制它,所以只有在用户 1 秒内没有输入任何内容时它才会调用该函数?

我在这里迷路了。任何帮助都非常受欢迎。

【问题讨论】:

【参考方案1】:

使用Timer

如果在一秒之前按下某个键,则取消旧计时器并使用新计时器重新安排,否则进行 API 调用:

import 'dart:async';

class _MyHomePageState extends State<MyHomePage> 
  String textValue;
  Timer timeHandle;

  void textChanged(String val) 
    textValue = val;
    if (timeHandle != null) 
      timeHandle.cancel();
      
    timeHandle = Timer(Duration(seconds: 1), () 
      print("Calling now the API: $textValue");
    );
  

  @override
  void dispose() 
      super.dispose();
      timeHandle.cancel();
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Container(
              padding: EdgeInsets.all(20),
              alignment: Alignment.center,
              child: TextField(
                onChanged: textChanged,
                  decoration: InputDecoration(
                      border: InputBorder.none,
                      hintText: 'Please enter a search term')),
            ),
          ],
        ),
      ),
    );
  

【讨论】:

如果未调用 onChanged(),您忘记在 dispose() 中进行空检查。无论如何,就像魅力一样!谢谢。【参考方案2】:

您需要使用async package 中名为CancelableOperation 的类。

您可以在有状态的小部件中声明它,在 build() 方法之外:

CancelableOperation cancelableOperation;

并在您的 onChanged 回调中像这样使用它:

cancelableOperation?.cancel();

cancelableOperation = CancelableOperation.fromFuture(Future.delayed(Duration(seconds: 1), () 
  // API call here
));

【讨论】:

请注意,使用这种方法,经过一秒后,API 调用会被多次调用。这是因为cancel 方法是异步的。

以上是关于更改文本字段,调用 api - 如何限制这个?的主要内容,如果未能解决你的问题,请参考以下文章

使用 WP-API 节点模块时如何限制返回的 Wordpress REST-API 字段

如何将文本字段限制为仅有效的小数?

如何更改 UISearchController 中文本字段的背景颜色?

如何在文本字段下方删除时更改文本字段的位置?

如何在下拉列表更改时更新两个文本字段

编辑时如何更改 UITextField