Merge branch 'design'
This commit is contained in:
@ -559,6 +559,12 @@ class Api {
|
|||||||
static const String systemMarkRead =
|
static const String systemMarkRead =
|
||||||
'${HttpString.messageBaseUrl}/x/sys-msg/update_cursor';
|
'${HttpString.messageBaseUrl}/x/sys-msg/update_cursor';
|
||||||
|
|
||||||
|
/// 编辑收藏夹
|
||||||
|
static const String editFavFolder = '/x/v3/fav/folder/edit';
|
||||||
|
|
||||||
|
/// 新建收藏夹
|
||||||
|
static const String addFavFolder = '/x/v3/fav/folder/add';
|
||||||
|
|
||||||
/// 直播间弹幕信息
|
/// 直播间弹幕信息
|
||||||
static const String getDanmuInfo =
|
static const String getDanmuInfo =
|
||||||
'${HttpString.liveBaseUrl}/xlive/web-room/v1/index/getDanmuInfo';
|
'${HttpString.liveBaseUrl}/xlive/web-room/v1/index/getDanmuInfo';
|
||||||
|
|||||||
67
lib/http/fav.dart
Normal file
67
lib/http/fav.dart
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
import 'index.dart';
|
||||||
|
|
||||||
|
class FavHttp {
|
||||||
|
/// 编辑收藏夹
|
||||||
|
static Future editFolder({
|
||||||
|
required String title,
|
||||||
|
required String intro,
|
||||||
|
required String mediaId,
|
||||||
|
String? cover,
|
||||||
|
int? privacy,
|
||||||
|
}) async {
|
||||||
|
var res = await Request().post(
|
||||||
|
Api.editFavFolder,
|
||||||
|
queryParameters: {
|
||||||
|
'title': title,
|
||||||
|
'intro': intro,
|
||||||
|
'media_id': mediaId,
|
||||||
|
'cover': cover ?? '',
|
||||||
|
'privacy': privacy ?? 0,
|
||||||
|
'csrf': await Request.getCsrf(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
if (res.data['code'] == 0) {
|
||||||
|
return {
|
||||||
|
'status': true,
|
||||||
|
'data': res.data['data'],
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
'status': false,
|
||||||
|
'data': [],
|
||||||
|
'msg': res.data['message'],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 新建收藏夹
|
||||||
|
static Future addFolder({
|
||||||
|
required String title,
|
||||||
|
required String intro,
|
||||||
|
String? cover,
|
||||||
|
int? privacy,
|
||||||
|
}) async {
|
||||||
|
var res = await Request().post(
|
||||||
|
Api.addFavFolder,
|
||||||
|
queryParameters: {
|
||||||
|
'title': title,
|
||||||
|
'intro': intro,
|
||||||
|
'cover': cover ?? '',
|
||||||
|
'privacy': privacy ?? 0,
|
||||||
|
'csrf': await Request.getCsrf(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
if (res.data['code'] == 0) {
|
||||||
|
return {
|
||||||
|
'status': true,
|
||||||
|
'data': res.data['data'],
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
'status': false,
|
||||||
|
'data': [],
|
||||||
|
'msg': res.data['message'],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -57,6 +57,8 @@ class UserHttp {
|
|||||||
if (res.data['data'] != null) {
|
if (res.data['data'] != null) {
|
||||||
data = FavFolderData.fromJson(res.data['data']);
|
data = FavFolderData.fromJson(res.data['data']);
|
||||||
return {'status': true, 'data': data};
|
return {'status': true, 'data': data};
|
||||||
|
} else {
|
||||||
|
return {'status': false, 'msg': '收藏夹为空'};
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -86,7 +86,7 @@ Widget videoSeasonWidget(item, context, type, {floor = 1}) {
|
|||||||
height: width / StyleString.aspectRatio,
|
height: width / StyleString.aspectRatio,
|
||||||
src: content.cover,
|
src: content.cover,
|
||||||
),
|
),
|
||||||
if (content.badge != null && type == 'pgc')
|
if (content.badge != null && content.badge['text'] != null)
|
||||||
PBadge(
|
PBadge(
|
||||||
text: content.badge['text'],
|
text: content.badge['text'],
|
||||||
top: 8.0,
|
top: 8.0,
|
||||||
|
|||||||
@ -55,6 +55,22 @@ class _FavPageState extends State<FavPage> {
|
|||||||
tooltip: 'Ta的订阅',
|
tooltip: 'Ta的订阅',
|
||||||
)
|
)
|
||||||
: const SizedBox.shrink()),
|
: const SizedBox.shrink()),
|
||||||
|
|
||||||
|
// 新建收藏夹
|
||||||
|
Obx(() => _favController.isOwner.value
|
||||||
|
? IconButton(
|
||||||
|
onPressed: () async {
|
||||||
|
await Get.toNamed('/favEdit');
|
||||||
|
_favController.hasMore.value = true;
|
||||||
|
_favController.currentPage = 1;
|
||||||
|
setState(() {
|
||||||
|
_futureBuilderFuture = _favController.queryFavFolder();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
icon: const Icon(Icons.add_outlined),
|
||||||
|
tooltip: '新建收藏夹',
|
||||||
|
)
|
||||||
|
: const SizedBox.shrink()),
|
||||||
IconButton(
|
IconButton(
|
||||||
onPressed: () => Get.toNamed(
|
onPressed: () => Get.toNamed(
|
||||||
'/favSearch?searchType=1&mediaId=${_favController.favFolderData.value.list!.first.id}'),
|
'/favSearch?searchType=1&mediaId=${_favController.favFolderData.value.list!.first.id}'),
|
||||||
|
|||||||
@ -74,7 +74,7 @@ class VideoContent extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Expanded(
|
return Expanded(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.fromLTRB(10, 2, 6, 0),
|
padding: const EdgeInsets.fromLTRB(10, 2, 6, 10),
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
@ -94,6 +94,15 @@ class VideoContent extends StatelessWidget {
|
|||||||
color: Theme.of(context).colorScheme.outline,
|
color: Theme.of(context).colorScheme.outline,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
const Spacer(),
|
||||||
|
Text(
|
||||||
|
[23, 1].contains(favFolderItem.attr) ? '私密' : '公开',
|
||||||
|
textAlign: TextAlign.start,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: Theme.of(context).textTheme.labelMedium!.fontSize,
|
||||||
|
color: Theme.of(context).colorScheme.outline,
|
||||||
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@ -115,4 +115,17 @@ class FavDetailController extends GetxController {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onEditFavFolder() async {
|
||||||
|
Get.toNamed(
|
||||||
|
'/favEdit',
|
||||||
|
arguments: {
|
||||||
|
'mediaId': mediaId.toString(),
|
||||||
|
'title': item!.title,
|
||||||
|
'intro': item!.intro,
|
||||||
|
'cover': item!.cover,
|
||||||
|
'privacy': item!.attr,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -106,6 +106,11 @@ class _FavDetailPageState extends State<FavDetailPage> {
|
|||||||
position: PopupMenuPosition.under,
|
position: PopupMenuPosition.under,
|
||||||
onSelected: (String type) {},
|
onSelected: (String type) {},
|
||||||
itemBuilder: (BuildContext context) => <PopupMenuEntry<String>>[
|
itemBuilder: (BuildContext context) => <PopupMenuEntry<String>>[
|
||||||
|
PopupMenuItem<String>(
|
||||||
|
onTap: () => _favDetailController.onEditFavFolder(),
|
||||||
|
value: 'edit',
|
||||||
|
child: const Text('编辑收藏夹'),
|
||||||
|
),
|
||||||
PopupMenuItem<String>(
|
PopupMenuItem<String>(
|
||||||
onTap: () => _favDetailController.onDelFavFolder(),
|
onTap: () => _favDetailController.onDelFavFolder(),
|
||||||
value: 'pause',
|
value: 'pause',
|
||||||
|
|||||||
77
lib/pages/fav_edit/controller.dart
Normal file
77
lib/pages/fav_edit/controller.dart
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:pilipala/http/fav.dart';
|
||||||
|
|
||||||
|
class FavEditController extends GetxController {
|
||||||
|
final GlobalKey formKey = GlobalKey<FormState>();
|
||||||
|
final TextEditingController titleController = TextEditingController();
|
||||||
|
final TextEditingController contentController = TextEditingController();
|
||||||
|
|
||||||
|
final FocusNode titleTextFieldNode = FocusNode();
|
||||||
|
final FocusNode contentTextFieldNode = FocusNode();
|
||||||
|
|
||||||
|
// 默认新建
|
||||||
|
RxString type = 'add'.obs;
|
||||||
|
|
||||||
|
String? mediaId;
|
||||||
|
String cover = ''; // 封面
|
||||||
|
String title = ''; // 名称
|
||||||
|
String intro = ''; // 简介
|
||||||
|
RxInt privacy = 0.obs; // 是否公开 0公开 1私密
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onInit() {
|
||||||
|
super.onInit();
|
||||||
|
var args = Get.arguments;
|
||||||
|
if (args != null) {
|
||||||
|
type.value = 'edit';
|
||||||
|
mediaId = args['mediaId'];
|
||||||
|
title = args['title'];
|
||||||
|
intro = args['intro'];
|
||||||
|
cover = args['cover'];
|
||||||
|
privacy.value = args['privacy'];
|
||||||
|
titleController.text = title;
|
||||||
|
contentController.text = intro;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void onSubmit() async {
|
||||||
|
// 表单验证
|
||||||
|
if ((formKey.currentState as FormState).validate()) {
|
||||||
|
if (type.value == 'edit') {
|
||||||
|
await editFolder();
|
||||||
|
} else {
|
||||||
|
await addFolder();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> editFolder() async {
|
||||||
|
var res = await FavHttp.editFolder(
|
||||||
|
title: title,
|
||||||
|
intro: intro,
|
||||||
|
mediaId: mediaId!,
|
||||||
|
cover: cover,
|
||||||
|
);
|
||||||
|
if (res['status']) {
|
||||||
|
SmartDialog.showToast('编辑成功');
|
||||||
|
Get.back();
|
||||||
|
} else {
|
||||||
|
SmartDialog.showToast(res['msg']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> addFolder() async {
|
||||||
|
var res = await FavHttp.addFolder(
|
||||||
|
title: title,
|
||||||
|
intro: intro,
|
||||||
|
);
|
||||||
|
if (res['status']) {
|
||||||
|
SmartDialog.showToast('新建成功');
|
||||||
|
Get.back();
|
||||||
|
} else {
|
||||||
|
SmartDialog.showToast(res['msg']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
4
lib/pages/fav_edit/index.dart
Normal file
4
lib/pages/fav_edit/index.dart
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
library fav_edit;
|
||||||
|
|
||||||
|
export './controller.dart';
|
||||||
|
export './view.dart';
|
||||||
111
lib/pages/fav_edit/view.dart
Normal file
111
lib/pages/fav_edit/view.dart
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
import 'controller.dart';
|
||||||
|
|
||||||
|
class FavEditPage extends StatefulWidget {
|
||||||
|
const FavEditPage({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<FavEditPage> createState() => _FavEditPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _FavEditPageState extends State<FavEditPage> {
|
||||||
|
final FavEditController _favEditController = Get.put(FavEditController());
|
||||||
|
String title = '';
|
||||||
|
String content = '';
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
elevation: 0,
|
||||||
|
scrolledUnderElevation: 0,
|
||||||
|
title: Obx(
|
||||||
|
() => _favEditController.type.value == 'add'
|
||||||
|
? Text(
|
||||||
|
'新建收藏夹',
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
)
|
||||||
|
: Text(
|
||||||
|
'编辑收藏夹',
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
centerTitle: false,
|
||||||
|
actions: [
|
||||||
|
Obx(
|
||||||
|
() => _favEditController.privacy.value == 0
|
||||||
|
? IconButton(
|
||||||
|
onPressed: () {
|
||||||
|
_favEditController.privacy.value = 1;
|
||||||
|
},
|
||||||
|
icon: const Icon(Icons.lock_open_outlined))
|
||||||
|
: IconButton(
|
||||||
|
onPressed: () {
|
||||||
|
_favEditController.privacy.value = 0;
|
||||||
|
},
|
||||||
|
icon: Icon(
|
||||||
|
Icons.lock_outlined,
|
||||||
|
color: Theme.of(context).colorScheme.error,
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
TextButton(
|
||||||
|
onPressed: _favEditController.onSubmit, child: const Text('保存')),
|
||||||
|
const SizedBox(width: 14),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
body: Form(
|
||||||
|
key: _favEditController.formKey, //设置globalKey,用于后面获取FormState
|
||||||
|
autovalidateMode: AutovalidateMode.disabled,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
padding: const EdgeInsets.fromLTRB(14, 10, 14, 5),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: Border(
|
||||||
|
bottom: BorderSide(
|
||||||
|
color: Theme.of(context).dividerColor.withOpacity(0.2),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: TextFormField(
|
||||||
|
autofocus: true,
|
||||||
|
controller: _favEditController.titleController,
|
||||||
|
focusNode: _favEditController.titleTextFieldNode,
|
||||||
|
decoration: const InputDecoration(
|
||||||
|
hintText: "收藏夹名称",
|
||||||
|
enabledBorder: InputBorder.none,
|
||||||
|
focusedBorder: InputBorder.none,
|
||||||
|
),
|
||||||
|
// 校验标题
|
||||||
|
validator: (v) {
|
||||||
|
return v!.trim().isNotEmpty ? null : "请输入收藏夹名称";
|
||||||
|
},
|
||||||
|
onChanged: (val) {
|
||||||
|
_favEditController.title = val;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Container(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.symmetric(horizontal: 14, vertical: 5),
|
||||||
|
child: TextFormField(
|
||||||
|
controller: _favEditController.contentController,
|
||||||
|
minLines: 1,
|
||||||
|
maxLines: 5,
|
||||||
|
decoration: const InputDecoration(
|
||||||
|
hintText: '输入收藏夹简介', border: InputBorder.none),
|
||||||
|
style: Theme.of(context).textTheme.bodyLarge,
|
||||||
|
onChanged: (val) {
|
||||||
|
_favEditController.intro = val;
|
||||||
|
},
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -49,7 +49,10 @@ class FollowItem extends StatelessWidget {
|
|||||||
child: TextButton(
|
child: TextButton(
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await showFlexibleBottomSheet(
|
await showFlexibleBottomSheet(
|
||||||
bottomSheetColor: Colors.transparent,
|
bottomSheetBorderRadius: const BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(16),
|
||||||
|
topRight: Radius.circular(16),
|
||||||
|
),
|
||||||
minHeight: 1,
|
minHeight: 1,
|
||||||
initHeight: 1,
|
initHeight: 1,
|
||||||
maxHeight: 1,
|
maxHeight: 1,
|
||||||
|
|||||||
@ -74,7 +74,6 @@ class _NavigationbarSetPageState extends State<NavigationBarSetPage> {
|
|||||||
},
|
},
|
||||||
title: Text(defaultNavTabs[i]['label']),
|
title: Text(defaultNavTabs[i]['label']),
|
||||||
secondary: const Icon(Icons.drag_indicator_rounded),
|
secondary: const Icon(Icons.drag_indicator_rounded),
|
||||||
enabled: defaultNavTabs[i]['id'] != 0,
|
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|||||||
@ -519,7 +519,10 @@ class VideoIntroController extends GetxController {
|
|||||||
// 设置关注分组
|
// 设置关注分组
|
||||||
void setFollowGroup() {
|
void setFollowGroup() {
|
||||||
showFlexibleBottomSheet(
|
showFlexibleBottomSheet(
|
||||||
bottomSheetColor: Colors.transparent,
|
bottomSheetBorderRadius: const BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(16),
|
||||||
|
topRight: Radius.circular(16),
|
||||||
|
),
|
||||||
minHeight: 0.6,
|
minHeight: 0.6,
|
||||||
initHeight: 0.6,
|
initHeight: 0.6,
|
||||||
maxHeight: 1,
|
maxHeight: 1,
|
||||||
|
|||||||
@ -230,7 +230,10 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
|
|||||||
|
|
||||||
void _showFavPanel() {
|
void _showFavPanel() {
|
||||||
showFlexibleBottomSheet(
|
showFlexibleBottomSheet(
|
||||||
bottomSheetColor: Colors.transparent,
|
bottomSheetBorderRadius: const BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(16),
|
||||||
|
topRight: Radius.circular(16),
|
||||||
|
),
|
||||||
minHeight: 0.6,
|
minHeight: 0.6,
|
||||||
initHeight: 0.6,
|
initHeight: 0.6,
|
||||||
maxHeight: 1,
|
maxHeight: 1,
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
import 'package:pilipala/common/widgets/http_error.dart';
|
import 'package:pilipala/common/widgets/http_error.dart';
|
||||||
@ -26,16 +27,7 @@ class _FavPanelState extends State<FavPanel> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return Column(
|
||||||
clipBehavior: Clip.hardEdge,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Theme.of(context).colorScheme.surface,
|
|
||||||
borderRadius: const BorderRadius.only(
|
|
||||||
topLeft: Radius.circular(16),
|
|
||||||
topRight: Radius.circular(16),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
child: Column(
|
|
||||||
children: [
|
children: [
|
||||||
AppBar(
|
AppBar(
|
||||||
centerTitle: false,
|
centerTitle: false,
|
||||||
@ -61,28 +53,29 @@ class _FavPanelState extends State<FavPanel> {
|
|||||||
return Obx(
|
return Obx(
|
||||||
() => ListView.builder(
|
() => ListView.builder(
|
||||||
controller: widget.scrollController,
|
controller: widget.scrollController,
|
||||||
itemCount:
|
itemCount: widget.ctr!.favFolderData.value.list!.length,
|
||||||
widget.ctr!.favFolderData.value.list!.length,
|
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
final item =
|
final item =
|
||||||
widget.ctr!.favFolderData.value.list![index];
|
widget.ctr!.favFolderData.value.list![index];
|
||||||
return ListTile(
|
return ListTile(
|
||||||
onTap: () => widget.ctr!
|
onTap: () =>
|
||||||
.onChoose(item.favState != 1, index),
|
widget.ctr!.onChoose(item.favState != 1, index),
|
||||||
dense: true,
|
dense: true,
|
||||||
leading: const Icon(Icons.folder_outlined),
|
leading: Icon([23, 1].contains(item.attr)
|
||||||
|
? Icons.lock_outline
|
||||||
|
: Icons.folder_outlined),
|
||||||
minLeadingWidth: 0,
|
minLeadingWidth: 0,
|
||||||
title: Text(widget.ctr!.favFolderData.value
|
title: Text(item.title!),
|
||||||
.list![index].title!),
|
|
||||||
subtitle: Text(
|
subtitle: Text(
|
||||||
'${item.mediaCount}个内容 ',
|
'${item.mediaCount}个内容 - ${[
|
||||||
|
23,
|
||||||
|
1
|
||||||
|
].contains(item.attr) ? '私密' : '公开'}',
|
||||||
),
|
),
|
||||||
trailing: Transform.scale(
|
trailing: Transform.scale(
|
||||||
scale: 0.9,
|
scale: 0.9,
|
||||||
child: Checkbox(
|
child: Checkbox(
|
||||||
value: widget.ctr!.favFolderData.value
|
value: item.favState == 1,
|
||||||
.list![index].favState ==
|
|
||||||
1,
|
|
||||||
onChanged: (bool? checkValue) =>
|
onChanged: (bool? checkValue) =>
|
||||||
widget.ctr!.onChoose(checkValue!, index),
|
widget.ctr!.onChoose(checkValue!, index),
|
||||||
),
|
),
|
||||||
@ -123,9 +116,8 @@ class _FavPanelState extends State<FavPanel> {
|
|||||||
onPressed: () => Get.back(),
|
onPressed: () => Get.back(),
|
||||||
style: TextButton.styleFrom(
|
style: TextButton.styleFrom(
|
||||||
padding: const EdgeInsets.only(left: 30, right: 30),
|
padding: const EdgeInsets.only(left: 30, right: 30),
|
||||||
backgroundColor: Theme.of(context)
|
backgroundColor:
|
||||||
.colorScheme
|
Theme.of(context).colorScheme.onInverseSurface, // 设置按钮背景色
|
||||||
.onInverseSurface, // 设置按钮背景色
|
|
||||||
),
|
),
|
||||||
child: const Text('取消'),
|
child: const Text('取消'),
|
||||||
),
|
),
|
||||||
@ -141,13 +133,12 @@ class _FavPanelState extends State<FavPanel> {
|
|||||||
backgroundColor:
|
backgroundColor:
|
||||||
Theme.of(context).colorScheme.primary, // 设置按钮背景色
|
Theme.of(context).colorScheme.primary, // 设置按钮背景色
|
||||||
),
|
),
|
||||||
child: const Text('确认选择'),
|
child: const Text('确认'),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -54,16 +54,7 @@ class _GroupPanelState extends State<GroupPanel> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return Column(
|
||||||
clipBehavior: Clip.hardEdge,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Theme.of(context).colorScheme.surface,
|
|
||||||
borderRadius: const BorderRadius.only(
|
|
||||||
topLeft: Radius.circular(16),
|
|
||||||
topRight: Radius.circular(16),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
child: Column(
|
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
AppBar(
|
AppBar(
|
||||||
centerTitle: false,
|
centerTitle: false,
|
||||||
@ -71,8 +62,7 @@ class _GroupPanelState extends State<GroupPanel> {
|
|||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
onPressed: () => Get.back(),
|
onPressed: () => Get.back(),
|
||||||
icon: const Icon(Icons.close_outlined)),
|
icon: const Icon(Icons.close_outlined)),
|
||||||
title:
|
title: Text('设置关注分组', style: Theme.of(context).textTheme.titleMedium),
|
||||||
Text('设置关注分组', style: Theme.of(context).textTheme.titleMedium),
|
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Material(
|
child: Material(
|
||||||
@ -108,8 +98,8 @@ class _GroupPanelState extends State<GroupPanel> {
|
|||||||
value: data['data'][index].checked,
|
value: data['data'][index].checked,
|
||||||
onChanged: (bool? checkValue) {
|
onChanged: (bool? checkValue) {
|
||||||
data['data'][index].checked = checkValue;
|
data['data'][index].checked = checkValue;
|
||||||
showDefault = !data['data']
|
showDefault =
|
||||||
.any((e) => e.checked == true);
|
!data['data'].any((e) => e.checked == true);
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -159,7 +149,6 @@ class _GroupPanelState extends State<GroupPanel> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,6 +26,7 @@ import 'widgets/app_bar_ani.dart';
|
|||||||
import 'widgets/backward_seek.dart';
|
import 'widgets/backward_seek.dart';
|
||||||
import 'widgets/bottom_control.dart';
|
import 'widgets/bottom_control.dart';
|
||||||
import 'widgets/common_btn.dart';
|
import 'widgets/common_btn.dart';
|
||||||
|
import 'widgets/control_bar.dart';
|
||||||
import 'widgets/forward_seek.dart';
|
import 'widgets/forward_seek.dart';
|
||||||
import 'widgets/play_pause_btn.dart';
|
import 'widgets/play_pause_btn.dart';
|
||||||
|
|
||||||
@ -484,104 +485,27 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
|||||||
|
|
||||||
/// 音量🔊 控制条展示
|
/// 音量🔊 控制条展示
|
||||||
Obx(
|
Obx(
|
||||||
() => Align(
|
() => ControlBar(
|
||||||
child: AnimatedOpacity(
|
visible: _volumeIndicator.value,
|
||||||
curve: Curves.easeInOut,
|
icon: _volumeValue.value < 1.0 / 3.0
|
||||||
opacity: _volumeIndicator.value ? 1.0 : 0.0,
|
? Icons.volume_mute
|
||||||
duration: const Duration(milliseconds: 150),
|
: _volumeValue.value < 2.0 / 3.0
|
||||||
child: Container(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: const Color(0x88000000),
|
|
||||||
borderRadius: BorderRadius.circular(64.0),
|
|
||||||
),
|
|
||||||
height: 34.0,
|
|
||||||
width: 70.0,
|
|
||||||
child: Row(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: <Widget>[
|
|
||||||
Container(
|
|
||||||
height: 34.0,
|
|
||||||
width: 28.0,
|
|
||||||
alignment: Alignment.centerRight,
|
|
||||||
child: Icon(
|
|
||||||
_volumeValue.value == 0.0
|
|
||||||
? Icons.volume_off
|
|
||||||
: _volumeValue.value < 0.5
|
|
||||||
? Icons.volume_down
|
? Icons.volume_down
|
||||||
: Icons.volume_up,
|
: Icons.volume_up,
|
||||||
color: const Color(0xFFFFFFFF),
|
value: _volumeValue.value,
|
||||||
size: 20.0,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Text(
|
|
||||||
'${(_volumeValue.value * 100.0).round()}%',
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
style: const TextStyle(
|
|
||||||
fontSize: 13.0,
|
|
||||||
color: Color(0xFFFFFFFF),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(width: 6.0),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
/// 亮度🌞 控制条展示
|
/// 亮度🌞 控制条展示
|
||||||
Obx(
|
Obx(
|
||||||
() => Align(
|
() => ControlBar(
|
||||||
child: AnimatedOpacity(
|
visible: _brightnessIndicator.value,
|
||||||
curve: Curves.easeInOut,
|
icon: _brightnessValue.value < 1.0 / 3.0
|
||||||
opacity: _brightnessIndicator.value ? 1.0 : 0.0,
|
|
||||||
duration: const Duration(milliseconds: 150),
|
|
||||||
child: Container(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: const Color(0x88000000),
|
|
||||||
borderRadius: BorderRadius.circular(64.0),
|
|
||||||
),
|
|
||||||
height: 34.0,
|
|
||||||
width: 70.0,
|
|
||||||
child: Row(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: <Widget>[
|
|
||||||
Container(
|
|
||||||
height: 30.0,
|
|
||||||
width: 28.0,
|
|
||||||
alignment: Alignment.centerRight,
|
|
||||||
child: Icon(
|
|
||||||
_brightnessValue.value < 1.0 / 3.0
|
|
||||||
? Icons.brightness_low
|
? Icons.brightness_low
|
||||||
: _brightnessValue.value < 2.0 / 3.0
|
: _brightnessValue.value < 2.0 / 3.0
|
||||||
? Icons.brightness_medium
|
? Icons.brightness_medium
|
||||||
: Icons.brightness_high,
|
: Icons.brightness_high,
|
||||||
color: const Color(0xFFFFFFFF),
|
value: _brightnessValue.value,
|
||||||
size: 18.0,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(width: 2.0),
|
|
||||||
Expanded(
|
|
||||||
child: Text(
|
|
||||||
'${(_brightnessValue.value * 100.0).round()}%',
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
style: const TextStyle(
|
|
||||||
fontSize: 13.0,
|
|
||||||
color: Color(0xFFFFFFFF),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(width: 6.0),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|||||||
50
lib/plugin/pl_player/widgets/control_bar.dart
Normal file
50
lib/plugin/pl_player/widgets/control_bar.dart
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class ControlBar extends StatelessWidget {
|
||||||
|
final bool visible;
|
||||||
|
final IconData icon;
|
||||||
|
final double value;
|
||||||
|
|
||||||
|
const ControlBar({
|
||||||
|
Key? key,
|
||||||
|
required this.visible,
|
||||||
|
required this.icon,
|
||||||
|
required this.value,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
Color color = const Color(0xFFFFFFFF);
|
||||||
|
return Align(
|
||||||
|
child: AnimatedOpacity(
|
||||||
|
curve: Curves.easeInOut,
|
||||||
|
opacity: visible ? 1.0 : 0.0,
|
||||||
|
duration: const Duration(milliseconds: 150),
|
||||||
|
child: IntrinsicWidth(
|
||||||
|
child: Container(
|
||||||
|
padding: const EdgeInsets.fromLTRB(10, 2, 10, 2),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: const Color(0x88000000),
|
||||||
|
borderRadius: BorderRadius.circular(64.0),
|
||||||
|
),
|
||||||
|
height: 34.0,
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Icon(icon, color: color, size: 18.0),
|
||||||
|
const SizedBox(width: 4.0),
|
||||||
|
Container(
|
||||||
|
constraints: const BoxConstraints(minWidth: 30.0),
|
||||||
|
child: Text(
|
||||||
|
'${(value * 100.0).round()}%',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(fontSize: 13.0, color: color),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,6 +3,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
|
import 'package:pilipala/pages/fav_edit/index.dart';
|
||||||
import 'package:pilipala/pages/follow_search/view.dart';
|
import 'package:pilipala/pages/follow_search/view.dart';
|
||||||
import 'package:pilipala/pages/message/at/index.dart';
|
import 'package:pilipala/pages/message/at/index.dart';
|
||||||
import 'package:pilipala/pages/message/like/index.dart';
|
import 'package:pilipala/pages/message/like/index.dart';
|
||||||
@ -183,6 +184,8 @@ class Routes {
|
|||||||
// 系统通知
|
// 系统通知
|
||||||
CustomGetPage(
|
CustomGetPage(
|
||||||
name: '/messageSystem', page: () => const MessageSystemPage()),
|
name: '/messageSystem', page: () => const MessageSystemPage()),
|
||||||
|
// 收藏夹编辑
|
||||||
|
CustomGetPage(name: '/favEdit', page: () => const FavEditPage()),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user