import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/logic_utils.dart'; import 'package:pilipala/utils/storage.dart'; class FavPanel extends StatefulWidget { const FavPanel({super.key, this.ctr, this.scrollController}); final dynamic ctr; final ScrollController? scrollController; @override State createState() => _FavPanelState(); } class _FavPanelState extends State { final Box localCache = GStorage.localCache; late Future _futureBuilderFuture; @override void initState() { super.initState(); _futureBuilderFuture = widget.ctr!.queryVideoInFolder(); } @override Widget build(BuildContext context) { return Column( children: [ AppBar( shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical( top: Radius.circular(20), ), ), leading: IconButton( onPressed: () => Get.back(), icon: const Icon(Icons.close_outlined)), title: Text( '选择收藏夹', style: Theme.of(context) .textTheme .titleMedium! .copyWith(fontWeight: FontWeight.bold), ), ), Expanded( child: Material( child: FutureBuilder( future: _futureBuilderFuture, builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.connectionState == ConnectionState.done) { Map data = snapshot.data as Map; if (data['status']) { return Obx( () => ListView.builder( controller: widget.scrollController, itemCount: widget.ctr!.favFolderData.value.list!.length, itemBuilder: (context, index) { final item = widget.ctr!.favFolderData.value.list![index]; return ListTile( onTap: () => widget.ctr!.onChoose(item.favState != 1, index), dense: true, leading: Icon(LogicUtils.isPublic(item.attr) ? Icons.folder_outlined : Icons.lock_outline), minLeadingWidth: 0, title: Text(item.title!), subtitle: Text( '${item.mediaCount}个内容 - ${LogicUtils.isPublic(item.attr) ? '公开' : '私密'}', ), trailing: Transform.scale( scale: 0.9, child: Checkbox( value: item.favState == 1, onChanged: (bool? checkValue) => widget.ctr!.onChoose(checkValue!, index), ), ), ); }, ), ); } else { return HttpError( errMsg: data['msg'], fn: () => setState(() {}), ); } } else { // 骨架屏 return const Center(child: Text('请求中')); } }, ), ), ), Divider( height: 1, color: Theme.of(context).disabledColor.withOpacity(0.08), ), Padding( padding: EdgeInsets.only( left: 20, right: 20, top: 12, bottom: MediaQuery.of(context).padding.bottom + 12, ), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton( onPressed: () => Get.back(), style: TextButton.styleFrom( padding: const EdgeInsets.only(left: 30, right: 30), backgroundColor: Theme.of(context).colorScheme.onInverseSurface, // 设置按钮背景色 ), child: const Text('取消'), ), const SizedBox(width: 10), TextButton( onPressed: () async { feedBack(); await widget.ctr!.actionFavVideo(); }, style: TextButton.styleFrom( padding: const EdgeInsets.only(left: 30, right: 30), foregroundColor: Theme.of(context).colorScheme.onPrimary, backgroundColor: Theme.of(context).colorScheme.primary, // 设置按钮背景色 ), child: const Text('确认'), ), ], ), ), ], ); } }