feat: 稍后再看
This commit is contained in:
@ -128,4 +128,12 @@ class Api {
|
|||||||
|
|
||||||
// 正在直播的up & 关注的up
|
// 正在直播的up & 关注的up
|
||||||
// https://api.bilibili.com/x/polymer/web-dynamic/v1/portal
|
// https://api.bilibili.com/x/polymer/web-dynamic/v1/portal
|
||||||
|
|
||||||
|
// 关注的up动态
|
||||||
|
|
||||||
|
// 获取稍后再看
|
||||||
|
static const String seeYouLater = '/x/v2/history/toview';
|
||||||
|
|
||||||
|
// 获取历史记录
|
||||||
|
static const String historyList = '/x/web-interface/history/cursor';
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import 'package:pilipala/http/api.dart';
|
import 'package:pilipala/http/api.dart';
|
||||||
import 'package:pilipala/http/init.dart';
|
import 'package:pilipala/http/init.dart';
|
||||||
|
import 'package:pilipala/models/model_hot_video_item.dart';
|
||||||
import 'package:pilipala/models/user/fav_detail.dart';
|
import 'package:pilipala/models/user/fav_detail.dart';
|
||||||
import 'package:pilipala/models/user/fav_folder.dart';
|
import 'package:pilipala/models/user/fav_folder.dart';
|
||||||
import 'package:pilipala/models/user/info.dart';
|
import 'package:pilipala/models/user/info.dart';
|
||||||
@ -76,4 +77,21 @@ class UserHttp {
|
|||||||
return {'status': false, 'data': [], 'msg': res.data['message']};
|
return {'status': false, 'data': [], 'msg': res.data['message']};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 稍后再看
|
||||||
|
static Future<dynamic> seeYouLater() async {
|
||||||
|
var res = await Request().get(Api.seeYouLater);
|
||||||
|
if (res.data['code'] == 0) {
|
||||||
|
List<HotVideoItemModel> list = [];
|
||||||
|
for (var i in res.data['data']['list']) {
|
||||||
|
list.add(HotVideoItemModel.fromJson(i));
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
'status': true,
|
||||||
|
'data': {'list': list, 'count': res.data['data']['count']}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {'status': false, 'data': [], 'msg': res.data['message']};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ class HotVideoItemModel {
|
|||||||
pubLocation = json["pub_location"];
|
pubLocation = json["pub_location"];
|
||||||
seasontype = json["seasontype"];
|
seasontype = json["seasontype"];
|
||||||
isOgv = json["isOgv"];
|
isOgv = json["isOgv"];
|
||||||
rcmdReason = json['rcmd_reason'] != ''
|
rcmdReason = json['rcmd_reason'] != '' && json['rcmd_reason'] != null
|
||||||
? RcmdReason.fromJson(json['rcmd_reason'])
|
? RcmdReason.fromJson(json['rcmd_reason'])
|
||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
|
19
lib/pages/later/controller.dart
Normal file
19
lib/pages/later/controller.dart
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:pilipala/http/user.dart';
|
||||||
|
import 'package:pilipala/models/model_hot_video_item.dart';
|
||||||
|
|
||||||
|
class LaterController extends GetxController {
|
||||||
|
final ScrollController scrollController = ScrollController();
|
||||||
|
RxList<HotVideoItemModel> laterList = [HotVideoItemModel()].obs;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
Future queryLaterList() async {
|
||||||
|
var res = await UserHttp.seeYouLater();
|
||||||
|
if (res['status']) {
|
||||||
|
laterList.value = res['data']['list'];
|
||||||
|
count = res['data']['count'];
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
4
lib/pages/later/index.dart
Normal file
4
lib/pages/later/index.dart
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
library later;
|
||||||
|
|
||||||
|
export './controller.dart';
|
||||||
|
export './view.dart';
|
75
lib/pages/later/view.dart
Normal file
75
lib/pages/later/view.dart
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:pilipala/common/skeleton/video_card_h.dart';
|
||||||
|
import 'package:pilipala/common/widgets/http_error.dart';
|
||||||
|
import 'package:pilipala/common/widgets/video_card_h.dart';
|
||||||
|
import 'package:pilipala/pages/later/index.dart';
|
||||||
|
|
||||||
|
class LaterPage extends StatefulWidget {
|
||||||
|
const LaterPage({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<LaterPage> createState() => _LaterPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _LaterPageState extends State<LaterPage> {
|
||||||
|
final LaterController _laterController = Get.put(LaterController());
|
||||||
|
Future? _futureBuilderFuture;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
_futureBuilderFuture = _laterController.queryLaterList();
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text('稍后再看'),
|
||||||
|
centerTitle: false,
|
||||||
|
),
|
||||||
|
body: CustomScrollView(
|
||||||
|
controller: _laterController.scrollController,
|
||||||
|
slivers: [
|
||||||
|
FutureBuilder(
|
||||||
|
future: _futureBuilderFuture,
|
||||||
|
builder: (context, snapshot) {
|
||||||
|
if (snapshot.connectionState == ConnectionState.done) {
|
||||||
|
Map data = snapshot.data as Map;
|
||||||
|
if (data['status']) {
|
||||||
|
return Obx(
|
||||||
|
() => SliverList(
|
||||||
|
delegate: SliverChildBuilderDelegate((context, index) {
|
||||||
|
return VideoCardH(
|
||||||
|
videoItem: _laterController.laterList[index],
|
||||||
|
);
|
||||||
|
}, childCount: _laterController.laterList.length),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return HttpError(
|
||||||
|
errMsg: data['msg'],
|
||||||
|
fn: () => setState(() {}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 骨架屏
|
||||||
|
return SliverList(
|
||||||
|
delegate: SliverChildBuilderDelegate((context, index) {
|
||||||
|
return const VideoCardHSkeleton();
|
||||||
|
}, childCount: 5),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
SliverToBoxAdapter(
|
||||||
|
child: SizedBox(
|
||||||
|
height: MediaQuery.of(context).padding.bottom + 10,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -27,8 +27,8 @@ class MediaController extends GetxController {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
'icon': Icons.watch_later_outlined,
|
'icon': Icons.watch_later_outlined,
|
||||||
'title': '稍候再看',
|
'title': '稍后再看',
|
||||||
'onTap': () => {},
|
'onTap': () => Get.toNamed('/later'),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ import 'package:pilipala/pages/fav/index.dart';
|
|||||||
import 'package:pilipala/pages/favDetail/index.dart';
|
import 'package:pilipala/pages/favDetail/index.dart';
|
||||||
import 'package:pilipala/pages/home/index.dart';
|
import 'package:pilipala/pages/home/index.dart';
|
||||||
import 'package:pilipala/pages/hot/index.dart';
|
import 'package:pilipala/pages/hot/index.dart';
|
||||||
|
import 'package:pilipala/pages/later/index.dart';
|
||||||
import 'package:pilipala/pages/preview/index.dart';
|
import 'package:pilipala/pages/preview/index.dart';
|
||||||
import 'package:pilipala/pages/video/detail/index.dart';
|
import 'package:pilipala/pages/video/detail/index.dart';
|
||||||
import 'package:pilipala/pages/webview/index.dart';
|
import 'package:pilipala/pages/webview/index.dart';
|
||||||
@ -29,5 +30,7 @@ class Routes {
|
|||||||
GetPage(name: '/fav', page: () => const FavPage()),
|
GetPage(name: '/fav', page: () => const FavPage()),
|
||||||
//
|
//
|
||||||
GetPage(name: '/favDetail', page: () => const FavDetailPage()),
|
GetPage(name: '/favDetail', page: () => const FavDetailPage()),
|
||||||
|
// 稍后再看
|
||||||
|
GetPage(name: '/later', page: () => const LaterPage()),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -31,9 +31,9 @@ class Utils {
|
|||||||
int minute = time ~/ 60;
|
int minute = time ~/ 60;
|
||||||
double res = time / 60;
|
double res = time / 60;
|
||||||
if (minute != res) {
|
if (minute != res) {
|
||||||
return '$minute:${(time - minute * 60) < 10 ? '0${(time - minute * 60)}' : (time - minute * 60)}';
|
return '${minute < 10 ? '0$minute' : minute} :${(time - minute * 60) < 10 ? '0${(time - minute * 60)}' : (time - minute * 60)}';
|
||||||
} else {
|
} else {
|
||||||
return minute.toString();
|
return '$minute:00';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return '';
|
return '';
|
||||||
|
Reference in New Issue
Block a user