Flutter TextField Widget 中的观察者模式有什么意义?
What is the point of observer pattern in flutter TextField Widget?
我的任务是制作一个页面,在其中将一些文本输入到 TextField 中后,我需要检索使用 http 请求获得的帖子列表。
我的团队领导告诉我,我应该使用观察者模式,这是我以前不知道的。在他向我解释了 3 次之后,我现在知道它的作用了。
但我无法理解为什么我会使用它而不是 TextField 小部件中的 onChanged 属性,它已经监听了对 TextField 所做的任何更改,并将文本发送到实体,然后我用它来发送我的 http 请求。
用简单的类比用更简单的术语向我解释,这样我就可以一劳永逸地理解它。感谢您的回答。
我会努力的。当您使用 onChanged
发送有关文本更改的 http 请求时,可能会在短时间内发送过多的请求。假设用户输入了一个长单词,然后由于打字错误删除了一些符号,然后再次输入。每次更改都会发送太多的 http 请求,对吧?如果您有很多用户怎么办?
为了避免不必要的网络负载,您需要 debounce text field changes. Observer pattern and rxDart 是执行此操作的选项。这是一个例子:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';
class SomeWidgetState extends State<SomeWidget> {
final textStreamController = StreamController<String>();
Stream<String> get textStream => textStreamController.stream;
StreamSubscription textStreamSubscription;
@override
void initState() {
// HERE is how to use debounce
textStreamSubscription =
textStream.debounceTime(Duration(seconds: 1)).listen(sendRequest);
super.initState();
}
@override
void dispose() {
textStreamController.close();
textStreamSubscription.cancel();
super.dispose();
}
void sendRequest(String text) {
// Here you can send http request
}
@override
Widget build(BuildContext context) {
return TextField(onChanged: textStreamController.add);
}
}
我猜你的组长想采用这种方法。
我的任务是制作一个页面,在其中将一些文本输入到 TextField 中后,我需要检索使用 http 请求获得的帖子列表。
我的团队领导告诉我,我应该使用观察者模式,这是我以前不知道的。在他向我解释了 3 次之后,我现在知道它的作用了。
但我无法理解为什么我会使用它而不是 TextField 小部件中的 onChanged 属性,它已经监听了对 TextField 所做的任何更改,并将文本发送到实体,然后我用它来发送我的 http 请求。
用简单的类比用更简单的术语向我解释,这样我就可以一劳永逸地理解它。感谢您的回答。
我会努力的。当您使用 onChanged
发送有关文本更改的 http 请求时,可能会在短时间内发送过多的请求。假设用户输入了一个长单词,然后由于打字错误删除了一些符号,然后再次输入。每次更改都会发送太多的 http 请求,对吧?如果您有很多用户怎么办?
为了避免不必要的网络负载,您需要 debounce text field changes. Observer pattern and rxDart 是执行此操作的选项。这是一个例子:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';
class SomeWidgetState extends State<SomeWidget> {
final textStreamController = StreamController<String>();
Stream<String> get textStream => textStreamController.stream;
StreamSubscription textStreamSubscription;
@override
void initState() {
// HERE is how to use debounce
textStreamSubscription =
textStream.debounceTime(Duration(seconds: 1)).listen(sendRequest);
super.initState();
}
@override
void dispose() {
textStreamController.close();
textStreamSubscription.cancel();
super.dispose();
}
void sendRequest(String text) {
// Here you can send http request
}
@override
Widget build(BuildContext context) {
return TextField(onChanged: textStreamController.add);
}
}
我猜你的组长想采用这种方法。