Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
F
flutter_clx_base
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
openSourceLibrary
flutter_clx_base
Commits
20814971
提交
20814971
authored
8月 04, 2023
作者:
shixiaochen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1、修改BaseListWidget,调用下拉刷新时,禁止手动滚动列表操作(列表刷新时,增加透明遮罩,禁止滚动列表);
上级
eb945f84
显示空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
87 行增加
和
48 行删除
+87
-48
CHANGELOG.md
CHANGELOG.md
+3
-0
base_list_widget_test.dart
example/lib/sample/base_list_widget_test.dart
+34
-27
base_list_widget.dart
lib/widget/base_list_widget.dart
+50
-21
没有找到文件。
CHANGELOG.md
浏览文件 @
20814971
...
@@ -18,3 +18,5 @@
...
@@ -18,3 +18,5 @@
*
升级dio版本 5.1.3
*
升级dio版本 5.1.3
## 1.0.9
## 1.0.9
*
修改SearchAppBar样式,设置默认右边距15
*
修改SearchAppBar样式,设置默认右边距15
## 1.1.0
*
修改BaseListWidget,调用下拉刷新时,禁止手动滚动列表操作;
\ No newline at end of file
example/lib/sample/base_list_widget_test.dart
浏览文件 @
20814971
...
@@ -15,13 +15,20 @@ class _BaseListWidgetTestState extends State<BaseListWidgetTest> {
...
@@ -15,13 +15,20 @@ class _BaseListWidgetTestState extends State<BaseListWidgetTest> {
@override
@override
Widget
build
(
BuildContext
context
)
{
Widget
build
(
BuildContext
context
)
{
final
themeData
=
Theme
.
of
(
context
);
return
MyScaffold
(
return
MyScaffold
(
title:
'BaseListWidget'
,
title:
'BaseListWidget'
,
floatingActionButton:
Row
(
children:
[
TextButton
(
onPressed:
()
{
controller
.
reload
();
},
child:
Text
(
"下拉刷新"
),
),
],),
body:
BaseListWidget
(
body:
BaseListWidget
(
controller:
controller
,
controller:
controller
,
requestData:
(
page
,
pageSize
,
success
,
error
)
async
{
requestData:
(
page
,
pageSize
,
success
,
error
)
async
{
await
Future
.
delayed
(
const
Duration
(
seconds:
5
));
await
Future
.
delayed
(
const
Duration
(
seconds:
1
));
if
(
page
==
1
)
{
if
(
page
==
1
)
{
success
([
success
([
{
"key"
:
"1"
,
"value"
:
"1"
},
{
"key"
:
"1"
,
"value"
:
"1"
},
...
@@ -66,32 +73,32 @@ class _BaseListWidgetTestState extends State<BaseListWidgetTest> {
...
@@ -66,32 +73,32 @@ class _BaseListWidgetTestState extends State<BaseListWidgetTest> {
),
),
);
);
},
},
header:
TaurusHeader
(
// header: TaurusHeader(
skyColor:
themeData
.
colorScheme
.
primary
,
// skyColor: themeData.colorScheme.primary,
),
// ),
footer:
ClassicFooter
(
// footer: ClassicFooter(
dragText:
'Pull to load'
.
tr
,
// dragText: 'Pull to load'.tr,
armedText:
'Release ready'
.
tr
,
// armedText: 'Release ready'.tr,
readyText:
'Loading...'
.
tr
,
// readyText: 'Loading...'.tr,
processingText:
'Loading...'
.
tr
,
// processingText: 'Loading...'.tr,
processedText:
'Succeeded'
.
tr
,
// processedText: 'Succeeded'.tr,
noMoreText:
'No more'
.
tr
,
// noMoreText: 'No more'.tr,
failedText:
'Failed'
.
tr
,
// failedText: 'Failed'.tr,
messageText:
'Last updated at %T'
.
tr
,
// messageText: 'Last updated at %T'.tr,
),
// ),
startLoadWidget:
Container
(
// startLoadWidget: Container(
decoration:
BoxDecoration
(
// decoration: BoxDecoration(
color:
themeData
.
colorScheme
.
primary
,
// color: themeData.colorScheme.primary,
borderRadius:
BorderRadius
.
circular
(
10
),
// borderRadius: BorderRadius.circular(10),
),
// ),
alignment:
Alignment
.
center
,
// alignment: Alignment.center,
width:
double
.
infinity
,
// width: double.infinity,
height:
300
,
// height: 300,
// child: const RiveAnimation.asset(
// // child: const RiveAnimation.asset(
// 'assets/rive/highway-truck.riv',
// // 'assets/rive/highway-truck.riv',
// fit: BoxFit.cover,
// // fit: BoxFit.cover,
// // ),
// ),
// ),
),
),
),
);
);
}
}
...
...
lib/widget/base_list_widget.dart
浏览文件 @
20814971
...
@@ -51,20 +51,25 @@ class _BaseListWidgetState extends State<BaseListWidget> {
...
@@ -51,20 +51,25 @@ class _BaseListWidgetState extends State<BaseListWidget> {
final
List
<
dynamic
>
_dataList
=
[];
final
List
<
dynamic
>
_dataList
=
[];
int
_page
=
1
;
int
_page
=
1
;
int
_count
=
0
;
int
_count
=
0
;
bool
startLoadingFinish
=
false
;
// 首次进入loading加载完成标识
bool
_startLoadingFinish
=
false
;
// 首次进入loading加载完成标识
StateType
stateType
=
StateType
.
loading
;
// 列表状态
StateType
_stateType
=
StateType
.
loading
;
// 列表状态
// 禁止手动触发滚动,处理刷新过程中禁止滚动列表操作
bool
disallowScroll
=
false
;
@override
@override
void
initState
()
{
void
initState
()
{
super
.
initState
();
super
.
initState
();
_controller
=
widget
.
controller
??
BaseListController
();
_controller
=
widget
.
controller
??
BaseListController
();
_controller
.
_bind
(
this
);
// 绑定 BaseListWidget state
}
}
@override
@override
Widget
build
(
BuildContext
context
)
{
Widget
build
(
BuildContext
context
)
{
final
header
=
buildHeader
();
final
header
=
buildHeader
();
final
footer
=
buildFooter
();
final
footer
=
buildFooter
();
return
EasyRefresh
(
return
Stack
(
children:
[
EasyRefresh
(
controller:
_controller
.
c
,
controller:
_controller
.
c
,
refreshOnStart:
widget
.
refreshOnStart
,
refreshOnStart:
widget
.
refreshOnStart
,
header:
header
,
header:
header
,
...
@@ -77,7 +82,7 @@ class _BaseListWidgetState extends State<BaseListWidget> {
...
@@ -77,7 +82,7 @@ class _BaseListWidgetState extends State<BaseListWidget> {
builder:
(
ctx
,
state
)
{
builder:
(
ctx
,
state
)
{
if
(
state
.
mode
==
IndicatorMode
.
inactive
||
if
(
state
.
mode
==
IndicatorMode
.
inactive
||
state
.
mode
==
IndicatorMode
.
done
)
{
state
.
mode
==
IndicatorMode
.
done
)
{
startLoadingFinish
=
true
;
_
startLoadingFinish
=
true
;
return
const
SizedBox
();
return
const
SizedBox
();
}
}
return
Container
(
return
Container
(
...
@@ -95,24 +100,33 @@ class _BaseListWidgetState extends State<BaseListWidget> {
...
@@ -95,24 +100,33 @@ class _BaseListWidgetState extends State<BaseListWidget> {
onRefresh:
_onRefresh
,
onRefresh:
_onRefresh
,
onLoad:
widget
.
noMoreLoad
?
null
:
_onLoad
,
onLoad:
widget
.
noMoreLoad
?
null
:
_onLoad
,
child:
buildScrollView
(),
child:
buildScrollView
(),
),
// 列表刷新时,增加透明遮罩,禁止滚动列表
Visibility
(
visible:
disallowScroll
,
child:
Container
(
color:
Colors
.
transparent
,
width:
double
.
infinity
,
height:
double
.
infinity
),
),
],
);
);
}
}
Widget
buildScrollView
()
{
Widget
buildScrollView
()
{
return
CustomScrollView
(
return
CustomScrollView
(
slivers:
buildSlivers
());
slivers:
buildSlivers
(),
);
}
}
Future
<
void
>
_onRefresh
()
async
{
Future
<
void
>
_onRefresh
()
async
{
stateType
=
StateType
.
loading
;
disallowScroll
=
false
;
// 开始刷新-重置标志位
_stateType
=
StateType
.
loading
;
_page
=
1
;
_page
=
1
;
await
widget
.
requestData
(
await
widget
.
requestData
(
_page
,
widget
.
pageSize
,
_requestSuccess
,
_requestError
);
_page
,
widget
.
pageSize
,
_requestSuccess
,
_requestError
);
}
}
Future
<
void
>
_onLoad
()
async
{
Future
<
void
>
_onLoad
()
async
{
stateType
=
StateType
.
loading
;
_
stateType
=
StateType
.
loading
;
_page
++;
_page
++;
await
widget
.
requestData
(
await
widget
.
requestData
(
_page
,
widget
.
pageSize
,
_requestSuccess
,
_requestError
);
_page
,
widget
.
pageSize
,
_requestSuccess
,
_requestError
);
...
@@ -140,14 +154,14 @@ class _BaseListWidgetState extends State<BaseListWidget> {
...
@@ -140,14 +154,14 @@ class _BaseListWidgetState extends State<BaseListWidget> {
?
IndicatorResult
.
noMore
?
IndicatorResult
.
noMore
:
IndicatorResult
.
success
);
:
IndicatorResult
.
success
);
}
}
stateType
=
isEmpty
?
StateType
.
empty
:
StateType
.
success
;
_
stateType
=
isEmpty
?
StateType
.
empty
:
StateType
.
success
;
}
}
void
_requestError
(
code
,
msg
)
{
void
_requestError
(
code
,
msg
)
{
if
(!
mounted
)
{
if
(!
mounted
)
{
return
;
return
;
}
}
stateType
=
StateType
.
error
;
_
stateType
=
StateType
.
error
;
ToastUtil
.
showToast
(
msg
);
ToastUtil
.
showToast
(
msg
);
setState
(()
{});
setState
(()
{});
if
(
_page
==
1
)
{
if
(
_page
==
1
)
{
...
@@ -211,27 +225,19 @@ class _BaseListWidgetState extends State<BaseListWidget> {
...
@@ -211,27 +225,19 @@ class _BaseListWidgetState extends State<BaseListWidget> {
return
_dataList
[
index
];
return
_dataList
[
index
];
}
}
// 刷新单个数据
void
notifySingleItem
(
index
,
item
)
{
_dataList
[
index
]
=
item
;
if
(
mounted
)
{
setState
(()
{});
}
}
List
<
Widget
>
buildSlivers
()
{
List
<
Widget
>
buildSlivers
()
{
final
header
=
buildHeader
();
final
header
=
buildHeader
();
final
footer
=
buildFooter
();
final
footer
=
buildFooter
();
return
[
return
[
if
(
header
.
position
==
IndicatorPosition
.
locator
)
if
(
header
.
position
==
IndicatorPosition
.
locator
)
const
HeaderLocator
.
sliver
(),
const
HeaderLocator
.
sliver
(),
if
(
isEmpty
&&
startLoadingFinish
)
if
(
isEmpty
&&
_
startLoadingFinish
)
SliverFillViewport
(
SliverFillViewport
(
delegate:
SliverChildBuilderDelegate
(
delegate:
SliverChildBuilderDelegate
(
(
context
,
index
)
{
(
context
,
index
)
{
return
widget
.
emptyWidget
??
return
widget
.
emptyWidget
??
StateLayout
(
StateLayout
(
type:
stateType
,
type:
_
stateType
,
emptyImg:
"default_drawing_1"
,
emptyImg:
"default_drawing_1"
,
errorImg:
"default_drawing_5"
,
errorImg:
"default_drawing_5"
,
onRefresh:
_controller
.
reload
,
onRefresh:
_controller
.
reload
,
...
@@ -262,6 +268,23 @@ class _BaseListWidgetState extends State<BaseListWidget> {
...
@@ -262,6 +268,23 @@ class _BaseListWidgetState extends State<BaseListWidget> {
Widget
buildItem
(
BuildContext
context
,
int
index
,
dynamic
item
)
{
Widget
buildItem
(
BuildContext
context
,
int
index
,
dynamic
item
)
{
return
widget
.
itemBuilder
(
context
,
index
,
item
);
return
widget
.
itemBuilder
(
context
,
index
,
item
);
}
}
// 刷新单个数据
void
notifySingleItem
(
index
,
item
)
{
_dataList
[
index
]
=
item
;
if
(
mounted
)
{
setState
(()
{});
}
}
// 禁止手动触发滚动
void
setDisallowScroll
()
{
if
(
mounted
)
{
setState
(()
{
disallowScroll
=
true
;
});
}
}
}
}
// 列表控制器
// 列表控制器
...
@@ -269,6 +292,11 @@ class BaseListController {
...
@@ -269,6 +292,11 @@ class BaseListController {
late
EasyRefreshController
_controller
;
late
EasyRefreshController
_controller
;
_BaseListWidgetState
?
_listState
;
// listState
_BaseListWidgetState
?
_listState
;
// listState
/// Binding with BaseListWidget state
void
_bind
(
_BaseListWidgetState
state
)
{
_listState
=
state
;
}
BaseListController
()
{
BaseListController
()
{
_controller
=
EasyRefreshController
(
_controller
=
EasyRefreshController
(
controlFinishRefresh:
true
,
controlFinishRefresh:
true
,
...
@@ -290,6 +318,7 @@ class BaseListController {
...
@@ -290,6 +318,7 @@ class BaseListController {
// 重新加载数据
// 重新加载数据
void
reload
()
{
void
reload
()
{
_listState
?.
setDisallowScroll
();
// 禁止手动触发滚动
// force true 强制刷新,解决快速刷新只触发一次问题
// force true 强制刷新,解决快速刷新只触发一次问题
_controller
.
callRefresh
(
force:
true
);
_controller
.
callRefresh
(
force:
true
);
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论