refa fav/group panel

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-06-19 10:54:34 +08:00
parent f440edf43b
commit 5644e9a0e1
9 changed files with 294 additions and 341 deletions

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/models/member/tags.dart';
import 'package:PiliPlus/utils/feed_back.dart';
@@ -22,32 +23,44 @@ class GroupPanel extends StatefulWidget {
}
class _GroupPanelState extends State<GroupPanel> {
late Future _futureBuilderFuture;
late List<MemberTagItemModel> tagsList;
LoadingState<List<MemberTagItemModel>> loadingState =
LoadingState<List<MemberTagItemModel>>.loading();
bool showDefaultBtn = true;
@override
void initState() {
super.initState();
_futureBuilderFuture = MemberHttp.followUpTags();
() async {
var result = await _futureBuilderFuture;
if (result['status']) {
tagsList = result['data'];
tagsList.removeWhere((item) => item.tagid == 0);
tagsList = tagsList.map((item) {
return item..checked = widget.tags?.contains(item.tagid) == true;
}).toList();
setState(() {
_query();
}
void _query() {
MemberHttp.followUpTags().then((res) {
if (mounted) {
if (res['status']) {
List<MemberTagItemModel> tagsList = (res['data']
as List<MemberTagItemModel>)
..removeWhere((item) => item.tagid == 0)
..map((item) {
return item.checked = widget.tags?.contains(item.tagid) == true;
}).toList();
showDefaultBtn = !tagsList.any((e) => e.checked == true);
});
loadingState = Success(tagsList);
} else {
loadingState = Error(res['msg']);
}
setState(() {});
}
}();
});
}
Future<void> onSave() async {
if (!loadingState.isSuccess) {
Get.back();
return;
}
feedBack();
// 是否有选中的 有选中的带id没选使用默认0
List<MemberTagItemModel> tagsList = loadingState.data;
final bool anyHasChecked =
tagsList.any((MemberTagItemModel e) => e.checked == true);
late List<int> tagidList;
@@ -66,6 +79,50 @@ class _GroupPanelState extends State<GroupPanel> {
}
}
Widget get _buildBody {
return switch (loadingState) {
Loading() => loadingWidget,
Success(:var response) => ListView.builder(
controller: widget.scrollController,
itemCount: response.length,
itemBuilder: (context, index) {
final item = response[index];
return Material(
type: MaterialType.transparency,
child: ListTile(
onTap: () {
item.checked = !item.checked!;
showDefaultBtn = !response.any((e) => e.checked == true);
setState(() {});
},
dense: true,
leading: const Icon(Icons.group_outlined),
minLeadingWidth: 0,
title: Text(item.name ?? ''),
subtitle: item.tip?.isNotEmpty == true ? Text(item.tip!) : null,
trailing: Transform.scale(
scale: 0.9,
child: Checkbox(
value: item.checked,
onChanged: (bool? checkValue) {
item.checked = checkValue;
showDefaultBtn = !response.any((e) => e.checked == true);
setState(() {});
},
),
),
),
);
},
),
Error(:var errMsg) => scrollErrorWidget(
controller: widget.scrollController,
errMsg: errMsg,
onReload: _query,
),
};
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
@@ -79,77 +136,7 @@ class _GroupPanelState extends State<GroupPanel> {
icon: const Icon(Icons.close_outlined)),
title: const Text('设置关注分组'),
),
Expanded(
child: FutureBuilder(
future: _futureBuilderFuture,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
// TODO: refactor
if (snapshot.data is! Map) {
return HttpError(
isSliver: false,
onReload: () => setState(() {
_futureBuilderFuture = MemberHttp.followUpTags();
}),
);
}
Map data = snapshot.data as Map;
if (data['status']) {
return ListView.builder(
controller: widget.scrollController,
itemCount: tagsList.length,
itemBuilder: (context, index) {
return Material(
type: MaterialType.transparency,
child: ListTile(
onTap: () {
tagsList[index].checked = !tagsList[index].checked!;
showDefaultBtn =
!tagsList.any((e) => e.checked == true);
setState(() {});
},
dense: true,
leading: const Icon(Icons.group_outlined),
minLeadingWidth: 0,
title: Text(tagsList[index].name ?? ''),
subtitle: tagsList[index].tip != ''
? Text(tagsList[index].tip ?? '')
: null,
trailing: Transform.scale(
scale: 0.9,
child: Checkbox(
value: tagsList[index].checked,
onChanged: (bool? checkValue) {
tagsList[index].checked = checkValue;
showDefaultBtn =
!tagsList.any((e) => e.checked == true);
setState(() {});
},
),
),
),
);
},
);
} else {
return CustomScrollView(
controller: widget.scrollController,
slivers: [
HttpError(
errMsg: data['msg'],
onReload: () => setState(() {}),
),
],
);
}
} else {
return const Center(
child: CircularProgressIndicator(),
);
}
},
),
),
Expanded(child: _buildBody),
Divider(
height: 1,
color: theme.disabledColor.withValues(alpha: 0.08),