import 'dart:ui';
|
|
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/material.dart';
|
import '../../api/video_api.dart';
|
import '../../model/video/video_model.dart';
|
import '../../ui/widget/button.dart';
|
import '../../ui/widget/refresh_listview.dart';
|
import '../../ui/widget/video_item.dart';
|
import '../../utils/video/video_util.dart';
|
|
import '../../ui/widget/nav.dart';
|
import '../../utils/ui_utils.dart';
|
|
class VideoCollectedPage extends StatefulWidget {
|
VideoCollectedPage({Key? key, required this.title}) : super(key: key);
|
|
// This widget is the home page of your application. It is stateful, meaning
|
// that it has a State object (defined below) that contains fields that affect
|
// how it looks.
|
|
// This class is the configuration for the state. It holds the values (in this
|
// case the title) provided by the parent (in this case the App widget) and
|
// used by the build method of the State. Fields in a Widget subclass are
|
// always marked "final".
|
|
final String title;
|
|
@override
|
_VideoCollectedPageState createState() => _VideoCollectedPageState();
|
}
|
|
class _VideoCollectedPageState extends State<VideoCollectedPage>
|
with SingleTickerProviderStateMixin {
|
bool editMode = false;
|
Set<String> selectedSet = {};
|
|
final MyRefreshController _refreshController = MyRefreshController(initialRefresh: false);
|
List<VideoInfoModel> videoList = [];
|
|
int page = 1;
|
int toalCount = 0;
|
|
@override
|
void initState() {
|
super.initState();
|
loadVideoList(1);
|
}
|
|
|
void loadVideoList(int _page) async {
|
page = _page;
|
Map<String, dynamic>? result =
|
await VideoApiUtil.getCollelctedVideos(context, page);
|
if (result == null) {
|
if (page == 1) {
|
_refreshController.apiError!();
|
}
|
return;
|
}
|
|
if (result["IsPost"] != "true") {
|
return;
|
}
|
|
List<dynamic> list = result["Data"]["data"];
|
List<VideoInfoModel> temList = [];
|
list.forEach((element) {
|
temList.add(VideoInfoModel.fromJson(element));
|
});
|
|
int count = int.parse(result["Data"]["count"]);
|
setState(() {
|
toalCount = count;
|
});
|
if (page == 1) {
|
setState(() {
|
videoList = temList;
|
});
|
} else {
|
setState(() {
|
videoList.addAll(temList);
|
});
|
}
|
|
_refreshController.refreshCompleted();
|
if (count >= videoList.length) {
|
_refreshController.loadNoData();
|
} else {
|
_refreshController.loadComplete();
|
}
|
if (videoList.isEmpty) {
|
_refreshController.dataEmpty!();
|
} else {
|
//正常的状态
|
_refreshController.dataNormal!();
|
}
|
}
|
|
void deleteVideo() async {
|
if (selectedSet.isEmpty) {
|
return;
|
}
|
String videoIds = selectedSet.join(",");
|
|
Map<String, dynamic>? result =
|
await VideoApiUtil.collelctVideo(context, videoIds, false);
|
if (result == null) {
|
return;
|
}
|
if (result["IsPost"] == "true") {
|
ToastUtil.toast("删除成功", context);
|
setState(() {
|
selectedSet.clear();
|
});
|
loadVideoList(1);
|
} else {
|
ToastUtil.toast(result["Error"], context);
|
}
|
}
|
|
@override
|
Widget build(BuildContext context) {
|
return Scaffold(
|
backgroundColor: Colors.white,
|
body: Column(
|
children: [
|
TopNavBar(
|
title: "我的收藏",
|
rightIcon: videoList.isNotEmpty
|
? const Icon(
|
Icons.format_list_bulleted,
|
size: 25,
|
color: Color(0xFF202020),
|
)
|
: null,
|
rightClick: () {
|
setState(() {
|
editMode = !editMode;
|
if (!editMode) {
|
selectedSet.clear();
|
}
|
_refreshController.setEditMode!(editMode);
|
});
|
},
|
),
|
Container(
|
height: DimenUtil.getOnePixel(context),
|
color: const Color(0xFFDBDBDB),
|
),
|
Expanded(
|
child: RefreshListView(
|
content: ListView.builder(
|
padding: const EdgeInsets.only(top: 10),
|
itemBuilder: (BuildContext context, int index) {
|
return getItem(index);
|
},
|
itemCount: videoList.length,
|
),
|
refreshController: _refreshController,
|
refresh: () {
|
loadVideoList(1);
|
},
|
loadMore: () {
|
loadVideoList(page + 1);
|
},
|
)),
|
editMode && videoList.isNotEmpty
|
? Container(
|
padding: const EdgeInsets.fromLTRB(28, 10, 28, 10),
|
decoration: const BoxDecoration(
|
color: Colors.white,
|
border: Border(
|
top: BorderSide(
|
color: Color(0xFFDBDBDB), width: 0.5))),
|
child: Row(
|
children: [
|
Expanded(
|
child: MyOutlineButton(
|
videoList.length == selectedSet.length ? "反选" : "全选",
|
8,
|
height: 34,
|
fontSize: 16,
|
color: const Color(0xFFdbdbdb),
|
textColor: const Color(0xFF202020),
|
onClick: () {
|
if (videoList.length == selectedSet.length) {
|
setState(() {
|
selectedSet.clear();
|
});
|
} else {
|
Set<String> list =
|
videoList.map((e) => e.id.toString()).toSet();
|
setState(() {
|
selectedSet = list;
|
});
|
}
|
},
|
)),
|
Container(
|
width: 20,
|
),
|
Expanded(
|
child: MyFillButton(
|
selectedSet.isNotEmpty
|
? ("删除(${selectedSet.length})")
|
: "删除",
|
8,
|
height: 34,
|
fontSize: 16,
|
onClick: () {
|
deleteVideo();
|
},
|
)),
|
],
|
),
|
)
|
: Container()
|
],
|
));
|
}
|
|
Widget getItem(index) {
|
return Container(
|
alignment: Alignment.centerLeft,
|
margin: const EdgeInsets.fromLTRB(10, 8, 10, 8),
|
height: 80,
|
child: InkWell(
|
child: Row(
|
children: [
|
Stack(
|
alignment: Alignment.center,
|
children: [
|
ClipRRect(
|
borderRadius: BorderRadius.circular(6),
|
child: VideoImage(
|
VideoUtil.getHPicture(videoList[index]),
|
fit: BoxFit.cover,
|
height: 80,
|
width: 80 * 1.68,
|
)),
|
(editMode
|
? Image.asset(
|
selectedSet.contains("${videoList[index].id}")
|
? "assets/imgs/video/icon_check_true.png"
|
: "assets/imgs/video/icon_check_false.png",
|
width: 35,
|
)
|
: Container())
|
],
|
),
|
Container(
|
width: 10,
|
),
|
Expanded(
|
child: Column(
|
crossAxisAlignment: CrossAxisAlignment.start,
|
children: [
|
Text(
|
videoList[index].name!,
|
maxLines: 2,
|
overflow: TextOverflow.ellipsis,
|
style:
|
const TextStyle(color: Color(0xFF232323), fontSize: 15),
|
),
|
Text(
|
videoList[index].tag!,
|
maxLines: 1,
|
overflow: TextOverflow.ellipsis,
|
style:
|
TextStyle(color: const Color(0xFFB8AFB5), fontSize: 12),
|
),
|
Expanded(child: Container()),
|
const Text(
|
"",
|
style: TextStyle(color: Color(0xFFB8AFB5), fontSize: 12),
|
)
|
],
|
))
|
],
|
),
|
onTap: () {
|
if (!editMode) {
|
return;
|
}
|
setState(() {
|
if (selectedSet.contains("${videoList[index].id}")) {
|
selectedSet.remove("${videoList[index].id}");
|
} else {
|
selectedSet.add("${videoList[index].id}");
|
}
|
});
|
},
|
));
|
}
|
}
|