Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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
Search 有没有一种方法可以在用户停止键入后发送请求? 我正在寻找一种在用户停止键入X秒后发送API请求的方法 但是,我发送请求的方式是通过onTextChanged回调,它会在每次按键时发送请求 我已经在React中看到了超时的方法,但是,我对Flitter比较陌生,所以如果有任何帮助,我将不胜感激_Search_Dart_Flutter - Fatal编程技术网

Search 有没有一种方法可以在用户停止键入后发送请求? 我正在寻找一种在用户停止键入X秒后发送API请求的方法 但是,我发送请求的方式是通过onTextChanged回调,它会在每次按键时发送请求 我已经在React中看到了超时的方法,但是,我对Flitter比较陌生,所以如果有任何帮助,我将不胜感激

Search 有没有一种方法可以在用户停止键入后发送请求? 我正在寻找一种在用户停止键入X秒后发送API请求的方法 但是,我发送请求的方式是通过onTextChanged回调,它会在每次按键时发送请求 我已经在React中看到了超时的方法,但是,我对Flitter比较陌生,所以如果有任何帮助,我将不胜感激,search,dart,flutter,Search,Dart,Flutter,在颤振中执行此操作的常用方法是使用RxDart及其去盎司()方法。它允许在启动特定呼叫之前等待一小段时间 在下面的完整示例中,您可以看到它以1秒的时间运行。在该示例中,将显示一条消息,其中应调度对服务器的调用 import 'package:flutter/material.dart'; import 'package:rxdart/rxdart.dart'; void main() => runApp(new MyApp()); class MyApp extends Statele

在颤振中执行此操作的常用方法是使用RxDart及其
去盎司()方法。它允许在启动特定呼叫之前等待一小段时间

在下面的完整示例中,您可以看到它以1秒的时间运行。在该示例中,将显示一条消息,其中应调度对服务器的调用

import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final subject = new PublishSubject<String>();

  bool isLoading = false;

  GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey();

  void _textChanged(String text) {
    if (text.isEmpty) {
      setState(() {
        isLoading = false;
      });
      return;
    }
    setState(() {
      isLoading = true;
    });
    scaffoldKey.currentState.showSnackBar(new SnackBar(
      content: new Text("Search for ${text}"),
    ));
  }

  @override
  void initState() {
    super.initState();
    subject.stream.debounce(new Duration(milliseconds: 1000)).listen(_textChanged);
  }

  @override
  void dispose() {
    subject.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      key: scaffoldKey,
      appBar: new AppBar(
        title: new Text("Debounce demo"),
      ),
      body: new Container(
        padding: new EdgeInsets.all(8.0),
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[
            new TextField(
              decoration: new InputDecoration(
                hintText: 'Type text to search',
              ),
              onChanged: (string) => (subject.add(string)),
            ),
            isLoading
                ? Padding(
                    padding: const EdgeInsets.all(20.0),
                    child: new CircularProgressIndicator(),
                  )
                : new Container(),
          ],
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“包:rxdart/rxdart.dart”;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
主页:新建MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState扩展状态{
最终科目=新出版科目();
bool isLoading=false;
GlobalKey scaffoldKey=新的GlobalKey();
void\u text已更改(字符串文本){
if(text.isEmpty){
设置状态(){
isLoading=false;
});
返回;
}
设置状态(){
isLoading=true;
});
scaffoldKey.currentState.showSnackBar(新SnackBar(
内容:新文本(“搜索${Text}”),
));
}
@凌驾
void initState(){
super.initState();
subject.stream.debounce(新的持续时间(毫秒:1000)).listen(_textChanged);
}
@凌驾
无效处置(){
subject.close();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
钥匙:脚手架钥匙,
appBar:新的appBar(
标题:新文本(“Debounce演示”),
),
主体:新容器(
填充:新边缘设置。全部(8.0),
子:新列(
mainAxisAlignment:mainAxisAlignment.start,
儿童:[
新文本字段(
装饰:新的输入装饰(
hintText:'键入要搜索的文本',
),
onChanged:(string)=>(subject.add(string)),
),
卸载
?填充物(
填充:常数边集全部(20.0),
子项:新的CircularProgressIndicator(),
)
:新容器(),
],
),
),
);
}
}

您可以在下面的

中看到此代码的作用。您可以使用以下代码执行此操作:

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

class Test extends StatefulWidget {
    @override
    State<StatefulWidget> createState() {
        return _TestState();
    }
}

class _TestState extends State<StatefulWidget> {
    Timer searchOnStoppedTyping;

    _onChangeHandler(value ) {
        const duration = Duration(milliseconds:800); // set the duration that you want call search() after that.
        if (searchOnStoppedTyping != null) {
            setState(() => searchOnStoppedTyping.cancel()); // clear timer
        }
        setState(() => searchOnStoppedTyping = new Timer(duration, () => search(value)));
    }

    search(value) {
        print('hello world from search . the value is $value');
    }
    @override
    Widget build(BuildContext context) {
        return TextField(
            onChanged: _onChangeHandler,
            decoration: InputDecoration(
                hintText: 'Search ....'
                ),
            );
    }
}
导入“包装:颤振/材料.省道”;
导入“dart:async”;
类测试扩展了StatefulWidget{
@凌驾
状态createState(){
返回_TestState();
}
}
类_TestState扩展状态{
计时器搜索停止键入;
_onChangeHandler(值){
const duration=duration(毫秒:800);//设置在此之后调用search()的持续时间。
if(searchOnStoppedTyping!=null){
setState(()=>searchOnStoppedTyping.cancel());//清除计时器
}
设置状态(()=>searchOnStoppedTyping=新计时器(持续时间,()=>search(值));
}
搜索(值){
打印('hello world from search.该值为$value');
}
@凌驾
小部件构建(构建上下文){
返回文本字段(
onChanged:_onChangeHandler,
装饰:输入装饰(
hintText:“搜索…”
),
);
}
}

如果用户在计时器关闭前更改了焦点,则可能会取消计时器,并可能保持旧状态。即使您的代码是此问题的正确答案,也可以对代码进行一些解释。很好,这正是我想要的,你救了我为这个简单的解决方案安装rxdart或stream_转换库