提交 96767c85 authored 作者: shixiaochen's avatar shixiaochen

1、修复BaseListWidget多次触发自动刷新无反应问题

上级 780d581d
......@@ -25,4 +25,6 @@
## 1.1.2
* 修改BaseListWidget,①修复根据获取加载数据大小设置是否可上拉加载②去除canLoadMore标识(根据获取数据大小判断是否可上拉加载)
## 1.1.3
* 修改base_dio 去除基础bean类,修改为直接解析返回数据
\ No newline at end of file
* 修改base_dio 去除基础bean类,修改为直接解析返回数据
## 1.1.4
* 修复BaseListWidget多次触发自动刷新无反应问题
\ No newline at end of file
......@@ -3,6 +3,7 @@ import 'package:flutter_clx_base/flutter_clx_base.dart';
import 'package:flutter_clx_base/widget/normal_dialog.dart';
import 'package:flutter_clx_base_example/sample/base_list_widget_test.dart';
import 'package:flutter_clx_base_example/sample/dio_widget_test.dart';
import 'package:flutter_clx_base_example/sample/list/list1/list1_view.dart';
import 'package:flutter_clx_base_example/sample/scroll_view.dart';
import 'package:flutter_clx_base_example/sample/search_appbar.dart';
......@@ -56,6 +57,10 @@ class Sample extends StatelessWidget {
fullWidthButton: true,
onPressed: () => Get.to(const SearchAppBarPage()),
text: 'SearchAppBar'),
GFButton(
fullWidthButton: true,
onPressed: () => Get.to(List1Page()),
text: 'BaseListWidget多次reload无法应问题'),
],
);
}
......
import 'package:flutter_clx_base/flutter_clx_base.dart';
class DetailLogic extends GetxController {
}
import 'package:flutter/material.dart';
import 'package:flutter_clx_base/flutter_clx_base.dart';
import 'package:flutter_clx_base_example/sample/list/list1/list1_logic.dart';
import 'detail_logic.dart';
class DetailPage extends StatelessWidget {
DetailPage({Key? key}) : super(key: key);
final logic = Get.put(DetailLogic());
@override
Widget build(BuildContext context) {
return MyScaffold(
title: "详情",
children: [
TextButton(
onPressed: () {
findOtherLogic<List1Logic>()?.controller.reload();
findOtherLogic<List1Logic>()?.controller.reload();
Get.back();
},
child: const Text("刷新列表1"))
],
);
}
}
import 'package:flutter_clx_base/flutter_clx_base.dart';
import 'package:flutter_clx_base/widget/base_list_widget.dart';
class List1Logic extends GetxController {
var controller = BaseListController();
}
import 'package:flutter/material.dart';
import 'package:flutter_clx_base/flutter_clx_base.dart';
import 'package:flutter_clx_base/widget/base_list_widget.dart';
import 'package:flutter_clx_base_example/sample/list/detail/detail_view.dart';
import 'list1_logic.dart';
class List1Page extends StatelessWidget {
List1Page({Key? key}) : super(key: key);
final logic = Get.put(List1Logic());
@override
Widget build(BuildContext context) {
return MyScaffold(
title: 'list1',
floatingActionButton: Row(
children: [
TextButton(
onPressed: () {
logic.controller.reload();
},
child: const Text("下拉刷新"),
),
TextButton(
onPressed: () {
Get.to(DetailPage());
},
child: const Text("detail"),
),
],
),
body: BaseListWidget(
controller: logic.controller,
requestData: (page, pageSize, success, error) async {
await Future.delayed(const Duration(seconds: 1));
if (page == 1) {
success([
{"key": "1", "value": "1"},
{"key": "2", "value": '2'},
{"key": "3", "value": '3'},
{"key": "4", "value": '4'},
{"key": "5", "value": '5'},
{"key": "6", "value": '6'},
{"key": "7", "value": '7'},
{"key": "8", "value": '8'},
{"key": "9", "value": '9'},
{"key": "10", "value": '10'},
]);
} else {
success([
{"key": "11", "value": "11"},
{"key": "12", "value": '12'},
{"key": "13", "value": '13'},
{"key": "14", "value": '14'},
{"key": "15", "value": '15'},
{"key": "16", "value": '16'},
{"key": "17", "value": '17'},
{"key": "18", "value": '18'},
{"key": "19", "value": '19'},
{"key": "20", "value": '20'},
]);
}
},
pageSize: 10,
itemBuilder: (context, index, item) {
return InkWell(
onTap: () {
item["value"] = "修改item ${index + 1}";
logic.controller.notifySingleItem(index, item);
},
child: Container(
height: 150.0,
color: Colors.white,
margin: const EdgeInsets.only(top: 10.0),
alignment: Alignment.center,
child: Text(item["value"]),
),
);
},
// header: TaurusHeader(
// skyColor: themeData.colorScheme.primary,
// ),
// footer: ClassicFooter(
// dragText: 'Pull to load'.tr,
// armedText: 'Release ready'.tr,
// readyText: 'Loading...'.tr,
// processingText: 'Loading...'.tr,
// processedText: 'Succeeded'.tr,
// noMoreText: 'No more'.tr,
// failedText: 'Failed'.tr,
// messageText: 'Last updated at %T'.tr,
// ),
// startLoadWidget: Container(
// decoration: BoxDecoration(
// color: themeData.colorScheme.primary,
// borderRadius: BorderRadius.circular(10),
// ),
// alignment: Alignment.center,
// width: double.infinity,
// height: 300,
// // child: const RiveAnimation.asset(
// // 'assets/rive/highway-truck.riv',
// // fit: BoxFit.cover,
// // ),
// ),
),
);
}
}
......@@ -54,7 +54,8 @@ class _BaseListWidgetState extends State<BaseListWidget> {
bool _startLoadingFinish = false; // 首次进入loading加载完成标识
StateType _stateType = StateType.loading; // 列表状态
// 禁止手动触发滚动,处理刷新过程中禁止滚动列表操作
bool disallowScroll = false;
bool _disallowScroll = false;
bool _callReloading = false; // 触发自动刷新标识
@override
void initState() {
......@@ -103,7 +104,7 @@ class _BaseListWidgetState extends State<BaseListWidget> {
),
// 列表刷新时,增加透明遮罩,禁止滚动列表
Visibility(
visible: disallowScroll,
visible: _disallowScroll,
child: Container(
color: Colors.transparent,
width: double.infinity,
......@@ -118,7 +119,8 @@ class _BaseListWidgetState extends State<BaseListWidget> {
}
Future<void> _onRefresh() async {
disallowScroll = false; // 开始刷新-重置标志位
_disallowScroll = false; // 开始刷新-重置标志位
_callReloading = false; // 重置自动刷新标识
_stateType = StateType.loading;
_page = 1;
await widget.requestData(
......@@ -274,10 +276,18 @@ class _BaseListWidgetState extends State<BaseListWidget> {
void setDisallowScroll() {
if (mounted) {
setState(() {
disallowScroll = true;
_disallowScroll = true;
});
}
}
// 触发自动刷新列表
void onCallReload() {
_callReloading = true;
}
// 自动刷新标识
bool get reloadFlag => _callReloading;
}
// 列表控制器
......@@ -311,6 +321,11 @@ class BaseListController {
// 重新加载数据
void reload() {
// 多次触发自动刷新无反应问题
if (_listState?.reloadFlag == true) {
return;
}
_listState?.onCallReload(); // 设置自动刷新标识
_listState?.setDisallowScroll(); // 禁止手动触发滚动
// force true 强制刷新,解决快速刷新只触发一次问题
_controller.callRefresh(force: true);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论