【问题标题】:How to catch speed typing on textField widget?如何在 textField 小部件上快速输入?
【发布时间】:2020-03-24 22:00:19
【问题描述】:

每次输入更改时都会调用此方法。问题是当用户快速输入时,每次调用 api 并且搜索结果总是在变化。 (称为google map autoComplete api)

当用户停止输入时如何调用 api? (不关闭键盘或onSaved)

TextField(
      decoration: _inputStyle(),
      cursorColor: Palette.defaultColor,
      controller: _textEditingController,
     onChanged: (value) => setState(() => _autocompletePlace(value)),
 )

【问题讨论】:

  • 使用来自pub.dev/packages/stream_transformdebounce()变换运算符
  • 我认为更好的方法是取消任何以前的 API 调用,而不是依靠用户停止输入。
  • 你用这个搜索吗?
  • @Salma.yes.....

标签: flutter dart


【解决方案1】:

我会创建Debouncer,它会延迟所选计时器的代码执行。

例如用户输入“123” - 执行将延迟 200 毫秒,用户输入“4”,最后一次执行被取消并创建另一个延迟。如果用户在 200 毫秒内没有输入新数据,_autocompletePlace("1234") 将被执行

import 'package:flutter/foundation.dart';
import 'dart:async';

class Debouncer {
  final int milliseconds;
  VoidCallback action;
  Timer _timer;

  Debouncer({ this.milliseconds });

  run(VoidCallback action) {
    if (_timer != null) {
      _timer.cancel();
    }

    _timer = Timer(Duration(milliseconds: milliseconds), action);
  }
}
final _debouncer = Debouncer(milliseconds: 200);

onTextChange(String text) {
  _debouncer.run(() => _autocompletePlace(value));
}

【讨论】:

  • 无需重新发明轮子:pub.dev/packages/stream_transform
  • 这不是重新发明轮子。它只是使用计时器而不是流
  • Streams 在这种情况下很可能是最好的方法 - 我敢打赌,搜索 OP 使用某种返回 Future 的异步方法,所以它是 @987654330 的最佳工作@方法
  • @pskink 你能用Stream.asyncMap举个例子吗?
  • @BloodLoss 有一些示例如何使用 rxDart 库上的流:github.com/ReactiveX/rxdart/blob/master/example/flutter/… @pskink 但我也很好奇Stream.asyncMap 是什么意思:o
猜你喜欢
  • 1970-01-01
  • 2017-03-06
  • 2019-09-23
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
相关资源
最近更新 更多