gpt4 book ai didi

flutter - Rxdart Vanilla Bloc中的Flutter Debounce API调用

转载 作者:行者123 更新时间:2023-12-03 04:32:16 25 4
gpt4 key购买 nike

我有一个 Vanilla 集团,我正在实现无限列表 View 。到目前为止,我已经做到了。这是我的bloc实现,我将数据加载到无限列表 View 中,如下所示。

class MyProductsBloc {
final MyProductsRepo _repository = MyProductsRepo();
final BehaviorSubject<MyProducts> _subject = BehaviorSubject<MyProducts>();
int _page;
getMyProducts() async {
_page = 1;
MyProducts response = await _repository.getProducts(page: 1);
_subject.sink.add(response);
}

getMoreProducts() async {
_page++;
MyProducts response =
await _repository.getProducts(page: _page);
if (response.success) {
_subject.value.maxPage = response.maxPage;
_subject.value.pageNum = response.pageNum;
_subject.value.data.addAll(response.data);
_subject.sink.add(_subject.value);
} else {
_page--;
}
}

dispose() {
_subject?.close();
}

BehaviorSubject<MyProducts> get subject => _subject;
}
在用户界面部分,我使用的是streambuilder,它的listview具有notifylistner来监听滚动通知。
StreamBuilder<MyProducts>(
stream: myProductsBloc.subject.stream,
builder: (context, snapshot) {
if (snapshot.hasData) {
if (snapshot.data.error != null &&
snapshot.data.error.length > 0) {
return ShowError(
error: snapshot.data.error,
onTap: () => myProductsBloc.getMyProducts(),
);
} else if (snapshot.data.data.length == 0) {
return EmptyWidget();
}
return NotificationListener<ScrollNotification>(
onNotification: (ScrollNotification scrollInfo) {
if (scrollInfo.metrics.pixels ==
scrollInfo.metrics.maxScrollExtent) {
if (snapshot.data.isEnd) {
return false;
} else {
myProductsBloc.getMoreProducts();
}
}
return false;
},
child: ListView(
children: [
ListView.separated(
primary: false,
shrinkWrap: true,
separatorBuilder: (context, i) =>
const SizedBox(height: 10),
padding: EdgeInsets.all(10),
itemCount: snapshot.data.data.length,
itemBuilder: (context, i) {
ProductData productData = snapshot.data.data[i];
return ProductCard(product: productData);
},
),
LoadMoreIndicator(isEnd: snapshot.data.isEnd),
],
),
);
} else if (snapshot.hasError) {
return Center(
child: Text('${snapshot.data.error}'),
);
} else {
return Center(
child: LoadingWidget(text: "Fetching products.."));
}
}),
但是当滚动时,api被多次调用。在这种模式下,有什么方法可以多次消除对api的反跳?

最佳答案



class MyProductsBloc {
var _isLoading = false; <---- add this variable

final MyProductsRepo _repository = MyProductsRepo();
final BehaviorSubject<MyProducts> _subject = BehaviorSubject<MyProducts>();
int _page;
getMyProducts() async {
_page = 1;
MyProducts response = await _repository.getProducts(page: 1);
_subject.sink.add(response);
}

getMoreProducts() async {
if (_isLoading) return;
_isLoading = true;

_page++;
MyProducts response =
await _repository.getProducts(page: _page);
if (response.success) {
_subject.value.maxPage = response.maxPage;
_subject.value.pageNum = response.pageNum;
_subject.value.data.addAll(response.data);
_subject.sink.add(_subject.value);
} else {
_page--;
}

_isLoading = false;
}

dispose() {
_subject?.close();
}

BehaviorSubject<MyProducts> get subject => _subject;
}

关于flutter - Rxdart Vanilla Bloc中的Flutter Debounce API调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64727860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com