提交 952a6e9a authored 作者: 张国庆's avatar 张国庆

开发新 列表控件
上级 5bb2bb49
import 'package:flutter/material.dart';
import 'package:flutter_clx_base/flutter_clx_base.dart';
import 'package:flutter_clx_base_example/sample/base_list_widget_test.dart';
class Sample extends StatelessWidget {
const Sample({super.key});
......@@ -8,14 +9,12 @@ class Sample extends StatelessWidget {
Widget build(BuildContext context) {
return MyScaffold(
title: 'Sample',
body: const Center(
child: Text('Sample'),
),
floatingActionButton: FloatingActionButton(
onPressed: () {},
tooltip: 'Increment',
child: const Icon(Icons.add),
),
children: [
GFButton(
fullWidthButton: true,
onPressed: () => Get.to(const BaseListWidgetTest()),
text: '列表'),
],
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_clx_base/flutter_clx_base.dart';
import 'package:flutter_clx_base/widget/base_list_widget.dart';
class BaseListWidgetTest extends StatefulWidget {
const BaseListWidgetTest({super.key});
@override
State<BaseListWidgetTest> createState() => _BaseListWidgetTestState();
}
class _BaseListWidgetTestState extends State<BaseListWidgetTest> {
@override
Widget build(BuildContext context) {
return MyScaffold(
title: 'BaseListWidget',
body: BaseListWidget(
requestData: (page, pageSize, success, error) async {
await Future.delayed(const Duration(seconds: 2));
if (page == 1) {
success([
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'10',
]);
} else {
success([
'11',
'12',
'13',
'14',
'15',
'16',
'17',
'18',
'19',
'20',
]);
}
},
pageSize: 10,
itemBuilder: (BuildContext context, int index, item) {
return Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: Colors.grey.withOpacity(0.5),
width: 0.5,
),
),
),
alignment: Alignment.center,
height: 100,
child: Text(item.toString()),
);
},
),
);
}
}
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
class BaseListWidget extends StatefulWidget {
final RequestDataCallback requestData;
final int pageSize;
final ItemBuilder itemBuilder;
const BaseListWidget({
Key? key,
required this.requestData,
required this.pageSize,
required this.itemBuilder,
}) : super(key: key);
@override
State<BaseListWidget> createState() => _BaseListWidgetState();
}
class _BaseListWidgetState extends State<BaseListWidget> {
late EasyRefreshController _controller;
final List<dynamic> _dataList = [];
int _page = 1;
int _count = 0;
@override
void initState() {
super.initState();
_controller = EasyRefreshController(
controlFinishRefresh: true,
controlFinishLoad: true,
);
}
@override
Widget build(BuildContext context) {
return EasyRefresh(
controller: _controller,
refreshOnStart: true,
refreshOnStartHeader: BuilderHeader(
triggerOffset: 70,
clamping: true,
position: IndicatorPosition.above,
processedDuration: Duration.zero,
builder: (ctx, state) {
if (state.mode == IndicatorMode.inactive ||
state.mode == IndicatorMode.done) {
return const SizedBox();
}
return Container(
padding: const EdgeInsets.only(bottom: 100),
width: double.infinity,
height: state.viewportDimension,
alignment: Alignment.center,
child: SpinKitFadingCube(
size: 24,
color: Theme.of(context).primaryColor,
),
);
},
),
onRefresh: _onRefresh,
onLoad: _onLoad,
child: CustomScrollView(
slivers: [
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
return widget.itemBuilder(context, index, _dataList[index]);
},
childCount: _count,
),
),
],
),
);
}
Future<void> _onRefresh() async {
_page = 1;
await widget.requestData(
_page, widget.pageSize, _requestSuccess, _requestError);
}
Future<void> _onLoad() async {
_page++;
await widget.requestData(
_page, widget.pageSize, _requestSuccess, _requestError);
}
void _requestSuccess(List? result) {
if (!mounted) {
return;
}
result ??= [];
if (_page == 1) {
setState(() {
_dataList.clear();
_dataList.addAll(result!);
_count = _dataList.length;
});
_controller.finishRefresh();
_controller.resetFooter();
} else {
setState(() {
_dataList.addAll(result!);
_count = _dataList.length;
});
_controller.finishLoad(result.length <= widget.pageSize
? IndicatorResult.noMore
: IndicatorResult.success);
}
}
void _requestError(r, s) {
if (!mounted) {
return;
}
}
}
typedef RefreshCallback = Future<void> Function();
typedef LoadMoreCallback = Future<void> Function();
typedef SuccessCallback = Function(List list);
typedef ErrorCallback = Function(int code, String msg);
typedef RequestDataCallback = Function(
int page, int pageSize, SuccessCallback success, ErrorCallback error);
typedef ItemBuilder = Function(BuildContext context, int index, dynamic item);
......@@ -48,6 +48,10 @@ dependencies:
image_picker: ^0.8.6
#https://pub.dev/packages/flustars_flutter3
flustars_flutter3: ^3.0.0
#https://pub.dev/packages/easy_refresh
easy_refresh: ^3.3.1
#https://pub.dev/packages/flutter_spinkit
flutter_spinkit: ^5.1.0
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论