diff --git a/.github/workflows/beta_ci.yml b/.github/workflows/beta_ci.yml
new file mode 100644
index 00000000..e839aca1
--- /dev/null
+++ b/.github/workflows/beta_ci.yml
@@ -0,0 +1,208 @@
+name: Pilipala Beta
+
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - "main"
+ paths-ignore:
+ - "**.md"
+ - "**.txt"
+ - ".github/**"
+ - ".idea/**"
+ - "!.github/workflows/**"
+
+jobs:
+ update_version:
+ name: Read and update version
+ runs-on: ubuntu-latest
+
+ outputs:
+ # 定义输出变量 version,以便在其他job中引用
+ new_version: ${{ steps.version.outputs.new_version }}
+ last_commit: ${{ steps.get-last-commit.outputs.last_commit }}
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ github.ref_name }}
+ fetch-depth: 0
+
+ - name: 获取first parent commit次数
+ id: get-first-parent-commit-count
+ run: |
+ version=$(yq e .version pubspec.yaml | cut -d "+" -f 1)
+ recent_release_tag=$(git tag -l | grep $version | egrep -v "[-|+]" || true)
+ if [[ "x$recent_release_tag" == "x" ]]; then
+ echo "当前版本tag不存在,请手动生成tag."
+ exit 1
+ fi
+ git log --oneline --first-parent $recent_release_tag..HEAD
+ first_parent_commit_count=$(git rev-list --first-parent --count $recent_release_tag..HEAD)
+ echo "count=$first_parent_commit_count" >> $GITHUB_OUTPUT
+
+ - name: 获取最后一次提交
+ id: get-last-commit
+ run: |
+ last_commit=$(git log -1 --pretty="%h %s" --first-parent)
+ echo "last_commit=$last_commit" >> $GITHUB_OUTPUT
+
+ - name: 更新版本号
+ id: version
+ run: |
+ # 读取版本号
+ VERSION=$(yq e .version pubspec.yaml | cut -d "+" -f 1)
+
+ # 获取GitHub Actions的run_number
+ #RUN_NUMBER=${{ github.run_number }}
+
+ # 构建新版本号
+ NEW_VERSION=$VERSION-beta.${{ steps.get-first-parent-commit-count.outputs.count }}
+
+ # 输出新版本号
+ echo "New version: $NEW_VERSION"
+
+ # 设置新版本号为输出变量
+ echo "new_version=$NEW_VERSION" >>$GITHUB_OUTPUT
+
+ android:
+ name: Build CI (Android)
+ needs: update_version
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ github.ref_name }}
+
+ - name: 构建Java环境
+ uses: actions/setup-java@v3
+ with:
+ distribution: "zulu"
+ java-version: "17"
+ token: ${{secrets.GIT_TOKEN}}
+
+ - name: 检查缓存
+ uses: actions/cache@v2
+ id: cache-flutter
+ with:
+ path: /root/flutter-sdk
+ key: ${{ runner.os }}-flutter-${{ hashFiles('**/pubspec.lock') }}
+
+ - name: 安装Flutter
+ if: steps.cache-flutter.outputs.cache-hit != 'true'
+ uses: subosito/flutter-action@v2
+ with:
+ flutter-version: 3.16.5
+ channel: any
+
+ - name: 下载项目依赖
+ run: flutter pub get
+
+ - name: 解码生成 jks
+ run: echo $KEYSTORE_BASE64 | base64 -di > android/app/vvex.jks
+ env:
+ KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}
+
+ - name: 更新版本号
+ id: version
+ run: |
+ # 更新pubspec.yaml文件中的版本号
+ sed -i "s/version: .*+/version: ${{ needs.update_version.outputs.new_version }}+/g" pubspec.yaml
+
+ - name: flutter build apk
+ run: flutter build apk --release --split-per-abi
+ env:
+ KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
+ KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
+ KEY_PASSWORD: ${{ secrets.KEY_PASSWORD}}
+
+ - name: 重命名应用
+ run: |
+ for file in build/app/outputs/flutter-apk/app-*.apk; do
+ if [[ $file =~ app-(.?*)release.apk ]]; then
+ new_file_name="build/app/outputs/flutter-apk/Pili-${BASH_REMATCH[1]}v${{ needs.update_version.outputs.new_version }}.apk"
+ mv "$file" "$new_file_name"
+ fi
+ done
+
+ - name: 上传
+ uses: actions/upload-artifact@v3
+ with:
+ name: Pilipala-Beta
+ path: |
+ build/app/outputs/flutter-apk/Pili-*.apk
+
+ iOS:
+ name: Build CI (iOS)
+ needs: update_version
+ runs-on: macos-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ github.ref_name }}
+
+ - name: 安装Flutter
+ if: steps.cache-flutter.outputs.cache-hit != 'true'
+ uses: subosito/flutter-action@v2.10.0
+ with:
+ cache: true
+ flutter-version: 3.16.5
+
+ - name: 更新版本号
+ id: version
+ run: |
+ # 更新pubspec.yaml文件中的版本号
+ sed -i "" "s/version: .*+/version: ${{ needs.update_version.outputs.new_version }}+/g" pubspec.yaml
+
+ - name: flutter build ipa
+ run: |
+ flutter build ios --release --no-codesign
+ ln -sf ./build/ios/iphoneos Payload
+ zip -r9 app.ipa Payload/runner.app
+
+ - name: 重命名应用
+ run: |
+ DATE=${{ steps.date.outputs.date }}
+ for file in app.ipa; do
+ new_file_name="build/Pili-v${{ needs.update_version.outputs.new_version }}.ipa"
+ mv "$file" "$new_file_name"
+ done
+
+ - name: 上传
+ uses: actions/upload-artifact@v3
+ with:
+ if-no-files-found: error
+ name: Pilipala-Beta
+ path: |
+ build/Pili-*.ipa
+
+ upload:
+ runs-on: ubuntu-latest
+
+ needs:
+ - update_version
+ - android
+ - iOS
+ steps:
+ - uses: actions/download-artifact@v3
+ with:
+ name: Pilipala-Beta
+ path: ./Pilipala-Beta
+
+ - name: 发送到Telegram频道
+ uses: xireiki/channel-post@v1.0.7
+ with:
+ bot_token: ${{ secrets.BOT_TOKEN }}
+ chat_id: ${{ secrets.CHAT_ID }}
+ large_file: true
+ api_id: ${{ secrets.TELEGRAM_API_ID }}
+ api_hash: ${{ secrets.TELEGRAM_API_HASH }}
+ method: sendFile
+ path: Pilipala-Beta/*
+ parse_mode: Markdown
+ context: "*Beta版本: v${{ needs.update_version.outputs.new_version }}*\n更新内容: [${{ needs.update_version.outputs.last_commit }}](${{ github.event.head_commit.url }})"
diff --git a/.github/workflows/main.yml b/.github/workflows/release_ci.yml
similarity index 100%
rename from .github/workflows/main.yml
rename to .github/workflows/release_ci.yml
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index d82845fe..c52d8447 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -223,6 +223,10 @@
android:pathPattern="/mobile/video/.*" />
+
+
diff --git a/assets/images/video/danmu_close.svg b/assets/images/video/danmu_close.svg
new file mode 100644
index 00000000..9f48027b
--- /dev/null
+++ b/assets/images/video/danmu_close.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/video/danmu_open.svg b/assets/images/video/danmu_open.svg
new file mode 100644
index 00000000..24e8d7a9
--- /dev/null
+++ b/assets/images/video/danmu_open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/change_log/1.0.20.0303.md b/change_log/1.0.20.0303.md
new file mode 100644
index 00000000..1d8c4e00
--- /dev/null
+++ b/change_log/1.0.20.0303.md
@@ -0,0 +1,31 @@
+## 1.0.20
+
+
+### 功能
++ 评论区增加表情
++ 首页渐变背景开关
++ 媒体库显示「我的订阅」
++ 评论区链接解析
++ 默认启动页设置
+
+### 修复
++ 评论区内容重复
++ pip相关问题
++ 播放多p视频评论不刷新
++ 视频评论翻页重复
+
+### 优化
++ url scheme优化
++ 图片预览放大
++ 图片加载速度
++ 视频评论区复制
++ 全屏显示视频标题
++ 网络异常处理
+
+
+
+
+
+
+更多更新日志可在Github上查看
+问题反馈、功能建议请查看「关于」页面。
diff --git a/change_log/1.0.21.0306.md b/change_log/1.0.21.0306.md
new file mode 100644
index 00000000..3a582dbb
--- /dev/null
+++ b/change_log/1.0.21.0306.md
@@ -0,0 +1,9 @@
+## 1.0.21
+
+### 修复
++ 推荐视频全屏问题
++ 番剧全屏播放时灰屏问题
++ 评论回调导致页面卡死问题
+
+更多更新日志可在Github上查看
+问题反馈、功能建议请查看「关于」页面。
diff --git a/lib/common/widgets/video_card_h.dart b/lib/common/widgets/video_card_h.dart
index c78643db..99059a9e 100644
--- a/lib/common/widgets/video_card_h.dart
+++ b/lib/common/widgets/video_card_h.dart
@@ -38,6 +38,10 @@ class VideoCardH extends StatelessWidget {
Widget build(BuildContext context) {
final int aid = videoItem.aid;
final String bvid = videoItem.bvid;
+ String type = 'video';
+ try {
+ type = videoItem.type;
+ } catch (_) {}
final String heroTag = Utils.makeHeroTag(aid);
return GestureDetector(
onLongPress: () {
@@ -53,6 +57,10 @@ class VideoCardH extends StatelessWidget {
child: InkWell(
onTap: () async {
try {
+ if (type == 'ketang') {
+ SmartDialog.showToast('课堂视频暂不支持播放');
+ return;
+ }
final int cid =
videoItem.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid);
Get.toNamed('/video?bvid=$bvid&cid=$cid',
@@ -95,12 +103,20 @@ class VideoCardH extends StatelessWidget {
height: maxHeight,
),
),
- PBadge(
- text: Utils.timeFormat(videoItem.duration!),
- right: 6.0,
- bottom: 6.0,
- type: 'gray',
- ),
+ if (videoItem.duration != 0)
+ PBadge(
+ text: Utils.timeFormat(videoItem.duration!),
+ right: 6.0,
+ bottom: 6.0,
+ type: 'gray',
+ ),
+ if (type != 'video')
+ PBadge(
+ text: type,
+ left: 6.0,
+ bottom: 6.0,
+ type: 'primary',
+ ),
// if (videoItem.rcmdReason != null &&
// videoItem.rcmdReason.content != '')
// pBadge(videoItem.rcmdReason.content, context,
diff --git a/lib/common/widgets/video_card_v.dart b/lib/common/widgets/video_card_v.dart
index 43dd05ca..0d96f7b7 100644
--- a/lib/common/widgets/video_card_v.dart
+++ b/lib/common/widgets/video_card_v.dart
@@ -231,6 +231,7 @@ class VideoContent extends StatelessWidget {
const SizedBox(height: 2),
VideoStat(
videoItem: videoItem,
+ crossAxisCount: crossAxisCount,
),
],
if (crossAxisCount == 1) const SizedBox(height: 4),
@@ -294,6 +295,7 @@ class VideoContent extends StatelessWidget {
),
VideoStat(
videoItem: videoItem,
+ crossAxisCount: crossAxisCount,
),
const Spacer(),
],
@@ -317,10 +319,12 @@ class VideoContent extends StatelessWidget {
class VideoStat extends StatelessWidget {
final dynamic videoItem;
+ final int crossAxisCount;
const VideoStat({
Key? key,
required this.videoItem,
+ required this.crossAxisCount,
}) : super(key: key);
@override
@@ -337,7 +341,7 @@ class VideoStat extends StatelessWidget {
danmu: videoItem.stat.danmu,
),
if (videoItem is RecVideoItemModel) ...[
- const Spacer(),
+ crossAxisCount > 1 ? const Spacer() : const SizedBox(width: 8),
RichText(
maxLines: 1,
text: TextSpan(
diff --git a/lib/http/api.dart b/lib/http/api.dart
index 3a23ef80..8aa62233 100644
--- a/lib/http/api.dart
+++ b/lib/http/api.dart
@@ -499,4 +499,8 @@ class Api {
/// 发送私信
static const String sendMsg = '${HttpString.tUrl}/web_im/v1/web_im/send_msg';
+
+ /// 排行榜
+ static const String getRankApi = "/x/web-interface/ranking/v2";
+
}
diff --git a/lib/http/interceptor.dart b/lib/http/interceptor.dart
index 362ff17a..a5359283 100644
--- a/lib/http/interceptor.dart
+++ b/lib/http/interceptor.dart
@@ -45,10 +45,13 @@ class ApiInterceptor extends Interceptor {
void onError(DioException err, ErrorInterceptorHandler handler) async {
// 处理网络请求错误
// handler.next(err);
- SmartDialog.showToast(
- await dioError(err),
- displayType: SmartToastType.onlyRefresh,
- );
+ String url = err.requestOptions.uri.toString();
+ if (!url.contains('heartBeat')) {
+ SmartDialog.showToast(
+ await dioError(err),
+ displayType: SmartToastType.onlyRefresh,
+ );
+ }
super.onError(err, handler);
}
@@ -75,23 +78,24 @@ class ApiInterceptor extends Interceptor {
}
static Future checkConnect() async {
- final ConnectivityResult connectivityResult =
+ final List connectivityResult =
await Connectivity().checkConnectivity();
- switch (connectivityResult) {
- case ConnectivityResult.mobile:
- return '正在使用移动流量';
- case ConnectivityResult.wifi:
- return '正在使用wifi';
- case ConnectivityResult.ethernet:
- return '正在使用局域网';
- case ConnectivityResult.vpn:
- return '正在使用代理网络';
- case ConnectivityResult.other:
- return '正在使用其他网络';
- case ConnectivityResult.none:
- return '未连接到任何网络';
- default:
- return '';
+ if (connectivityResult.contains(ConnectivityResult.mobile)) {
+ return '正在使用移动流量';
+ } else if (connectivityResult.contains(ConnectivityResult.wifi)) {
+ return '正在使用wifi';
+ } else if (connectivityResult.contains(ConnectivityResult.ethernet)) {
+ return '正在使用局域网';
+ } else if (connectivityResult.contains(ConnectivityResult.vpn)) {
+ return '正在使用代理网络';
+ } else if (connectivityResult.contains(ConnectivityResult.bluetooth)) {
+ return '正在使用蓝牙网络';
+ } else if (connectivityResult.contains(ConnectivityResult.other)) {
+ return '正在使用其他网络';
+ } else if (connectivityResult.contains(ConnectivityResult.none)) {
+ return '未连接到任何网络';
+ } else {
+ return '';
}
}
}
diff --git a/lib/http/msg.dart b/lib/http/msg.dart
index 4ba2f818..d1d31958 100644
--- a/lib/http/msg.dart
+++ b/lib/http/msg.dart
@@ -31,14 +31,14 @@ class MsgHttp {
} catch (err) {
return {
'status': false,
- 'date': [],
+ 'data': [],
'msg': err.toString(),
};
}
} else {
return {
'status': false,
- 'date': [],
+ 'data': [],
'msg': res.data['message'],
};
}
diff --git a/lib/http/video.dart b/lib/http/video.dart
index 30df62c3..73e8b698 100644
--- a/lib/http/video.dart
+++ b/lib/http/video.dart
@@ -475,4 +475,27 @@ class VideoHttp {
return {'status': false, 'data': []};
}
}
+
+ // 视频排行
+ static Future getRankVideoList(int rid) async {
+ try {
+ var rankApi = "${Api.getRankApi}?rid=$rid&type=all";
+ var res = await Request().get(rankApi);
+ if (res.data['code'] == 0) {
+ List list = [];
+ List blackMidsList =
+ setting.get(SettingBoxKey.blackMidsList, defaultValue: [-1]);
+ for (var i in res.data['data']['list']) {
+ if (!blackMidsList.contains(i['owner']['mid'])) {
+ list.add(HotVideoItemModel.fromJson(i));
+ }
+ }
+ return {'status': true, 'data': list};
+ } else {
+ return {'status': false, 'data': [], 'msg': res.data['message']};
+ }
+ } catch (err) {
+ return {'status': false, 'data': [], 'msg': err};
+ }
+ }
}
diff --git a/lib/main.dart b/lib/main.dart
index fc2149de..44bb1dcd 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -16,6 +16,7 @@ import 'package:pilipala/pages/search/index.dart';
import 'package:pilipala/pages/video/detail/index.dart';
import 'package:pilipala/router/app_pages.dart';
import 'package:pilipala/pages/main/view.dart';
+import 'package:pilipala/services/disable_battery_opt.dart';
import 'package:pilipala/services/service_locator.dart';
import 'package:pilipala/utils/app_scheme.dart';
import 'package:pilipala/utils/data.dart';
@@ -71,6 +72,7 @@ void main() async {
));
Data.init();
PiliSchame.init();
+ DisableBatteryOpt();
});
}
diff --git a/lib/models/common/dynamics_type.dart b/lib/models/common/dynamics_type.dart
index 337f6aec..f4e20a4b 100644
--- a/lib/models/common/dynamics_type.dart
+++ b/lib/models/common/dynamics_type.dart
@@ -7,5 +7,5 @@ enum DynamicsType {
extension BusinessTypeExtension on DynamicsType {
String get values => ['all', 'video', 'pgc', 'article'][index];
- String get labels => ['全部', '视频', '追番', '专栏'][index];
+ String get labels => ['全部', '投稿', '番剧', '专栏'][index];
}
diff --git a/lib/models/common/gesture_mode.dart b/lib/models/common/gesture_mode.dart
new file mode 100644
index 00000000..1149ae12
--- /dev/null
+++ b/lib/models/common/gesture_mode.dart
@@ -0,0 +1,12 @@
+enum FullScreenGestureMode {
+ /// 从上滑到下
+ fromToptoBottom,
+
+ /// 从下滑到上
+ fromBottomtoTop,
+}
+
+extension FullScreenGestureModeExtension on FullScreenGestureMode {
+ String get values => ['fromToptoBottom', 'fromBottomtoTop'][index];
+ String get labels => ['从上往下滑进入全屏', '从下往上滑进入全屏'][index];
+}
diff --git a/lib/models/common/index.dart b/lib/models/common/index.dart
new file mode 100644
index 00000000..89a05076
--- /dev/null
+++ b/lib/models/common/index.dart
@@ -0,0 +1,4 @@
+library commonn_model;
+
+export './business_type.dart';
+export './gesture_mode.dart';
diff --git a/lib/models/common/nav_bar_config.dart b/lib/models/common/nav_bar_config.dart
new file mode 100644
index 00000000..9ebe8e6f
--- /dev/null
+++ b/lib/models/common/nav_bar_config.dart
@@ -0,0 +1,56 @@
+import 'package:flutter/material.dart';
+
+List defaultNavigationBars = [
+ {
+ 'id': 0,
+ 'icon': const Icon(
+ Icons.home_outlined,
+ size: 21,
+ ),
+ 'selectIcon': const Icon(
+ Icons.home,
+ size: 21,
+ ),
+ 'label': "首页",
+ 'count': 0,
+ },
+ {
+ 'id': 1,
+ 'icon': const Icon(
+ Icons.trending_up,
+ size: 21,
+ ),
+ 'selectIcon': const Icon(
+ Icons.trending_up_outlined,
+ size: 21,
+ ),
+ 'label': "排行榜",
+ 'count': 0,
+ },
+ {
+ 'id': 2,
+ 'icon': const Icon(
+ Icons.motion_photos_on_outlined,
+ size: 21,
+ ),
+ 'selectIcon': const Icon(
+ Icons.motion_photos_on,
+ size: 21,
+ ),
+ 'label': "动态",
+ 'count': 0,
+ },
+ {
+ 'id': 3,
+ 'icon': const Icon(
+ Icons.video_collection_outlined,
+ size: 20,
+ ),
+ 'selectIcon': const Icon(
+ Icons.video_collection,
+ size: 21,
+ ),
+ 'label': "媒体库",
+ 'count': 0,
+ }
+];
diff --git a/lib/models/common/rank_type.dart b/lib/models/common/rank_type.dart
new file mode 100644
index 00000000..2ce6d3b5
--- /dev/null
+++ b/lib/models/common/rank_type.dart
@@ -0,0 +1,240 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:pilipala/pages/rank/zone/index.dart';
+
+enum RandType {
+ all,
+ creation,
+ animation,
+ music,
+ dance,
+ game,
+ knowledge,
+ technology,
+ sport,
+ car,
+ life,
+ food,
+ animal,
+ madness,
+ fashion,
+ entertainment,
+ film,
+ origin,
+ rookie
+}
+
+extension RankTypeDesc on RandType {
+ String get description => [
+ '全站',
+ '国创相关',
+ '动画',
+ '音乐',
+ '舞蹈',
+ '游戏',
+ '知识',
+ '科技',
+ '运动',
+ '汽车',
+ '生活',
+ '美食',
+ '动物圈',
+ '鬼畜',
+ '时尚',
+ '娱乐',
+ '影视'
+ ][index];
+
+ String get id => [
+ 'all',
+ 'creation',
+ 'animation',
+ 'music',
+ 'dance',
+ 'game',
+ 'knowledge',
+ 'technology',
+ 'sport',
+ 'car',
+ 'life',
+ 'food',
+ 'animal',
+ 'madness',
+ 'fashion',
+ 'entertainment',
+ 'film'
+ ][index];
+}
+
+List tabsConfig = [
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '全站',
+ 'type': RandType.all,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 0),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '国创相关',
+ 'type': RandType.creation,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 168),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '动画',
+ 'type': RandType.animation,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 1),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '音乐',
+ 'type': RandType.music,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 3),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '舞蹈',
+ 'type': RandType.dance,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 129),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '游戏',
+ 'type': RandType.game,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 4),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '知识',
+ 'type': RandType.knowledge,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 36),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '科技',
+ 'type': RandType.technology,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 188),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '运动',
+ 'type': RandType.sport,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 234),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '汽车',
+ 'type': RandType.car,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 223),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '生活',
+ 'type': RandType.life,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 160),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '美食',
+ 'type': RandType.food,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 211),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '动物圈',
+ 'type': RandType.animal,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 217),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '鬼畜',
+ 'type': RandType.madness,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 119),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '时尚',
+ 'type': RandType.fashion,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 155),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '娱乐',
+ 'type': RandType.entertainment,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 5),
+ },
+ {
+ 'icon': const Icon(
+ Icons.live_tv_outlined,
+ size: 15,
+ ),
+ 'label': '影视',
+ 'type': RandType.film,
+ 'ctr': Get.put,
+ 'page': const ZonePage(rid: 181),
+ }
+];
diff --git a/lib/models/dynamics/up.dart b/lib/models/dynamics/up.dart
index cfd1fa7d..9bb82f70 100644
--- a/lib/models/dynamics/up.dart
+++ b/lib/models/dynamics/up.dart
@@ -2,18 +2,28 @@ class FollowUpModel {
FollowUpModel({
this.liveUsers,
this.upList,
+ this.liveList,
+ this.myInfo,
});
LiveUsers? liveUsers;
List? upList;
+ List? liveList;
+ MyInfo? myInfo;
FollowUpModel.fromJson(Map json) {
liveUsers = json['live_users'] != null
? LiveUsers.fromJson(json['live_users'])
: null;
+ liveList = json['live_users'] != null
+ ? json['live_users']['items']
+ .map((e) => LiveUserItem.fromJson(e))
+ .toList()
+ : [];
upList = json['up_list'] != null
? json['up_list'].map((e) => UpItem.fromJson(e)).toList()
: [];
+ myInfo = json['my_info'] != null ? MyInfo.fromJson(json['my_info']) : null;
}
}
@@ -93,3 +103,21 @@ class UpItem {
uname = json['uname'];
}
}
+
+class MyInfo {
+ MyInfo({
+ this.face,
+ this.mid,
+ this.name,
+ });
+
+ String? face;
+ int? mid;
+ String? name;
+
+ MyInfo.fromJson(Map json) {
+ face = json['face'];
+ mid = json['mid'];
+ name = json['name'];
+ }
+}
diff --git a/lib/models/live/quality.dart b/lib/models/live/quality.dart
new file mode 100644
index 00000000..677d615b
--- /dev/null
+++ b/lib/models/live/quality.dart
@@ -0,0 +1,43 @@
+enum LiveQuality {
+ dolby,
+ super4K,
+ origin,
+ bluRay,
+ superHD,
+ smooth,
+ flunt,
+}
+
+extension LiveQualityCode on LiveQuality {
+ static final List _codeList = [
+ 30000,
+ 20000,
+ 10000,
+ 400,
+ 250,
+ 150,
+ 80,
+ ];
+ int get code => _codeList[index];
+
+ static LiveQuality? fromCode(int code) {
+ final index = _codeList.indexOf(code);
+ if (index != -1) {
+ return LiveQuality.values[index];
+ }
+ return null;
+ }
+}
+
+extension VideoQualityDesc on LiveQuality {
+ static final List _descList = [
+ '杜比',
+ '4K',
+ '原画',
+ '蓝光',
+ '超清',
+ '高清',
+ '流畅',
+ ];
+ get description => _descList[index];
+}
diff --git a/lib/models/search/result.dart b/lib/models/search/result.dart
index 3d381ed9..0067791c 100644
--- a/lib/models/search/result.dart
+++ b/lib/models/search/result.dart
@@ -85,7 +85,9 @@ class SearchVideoItemModel {
// title = json['title'].replaceAll(RegExp(r'<.*?>'), '');
title = Em.regTitle(json['title']);
description = json['description'];
- pic = 'https:${json['pic']}';
+ pic = json['pic'] != null && json['pic'].startsWith('//')
+ ? 'https:${json['pic']}'
+ : json['pic'] ?? '';
videoReview = json['video_review'];
pubdate = json['pubdate'];
senddate = json['senddate'];
diff --git a/lib/models/user/fav_folder.dart b/lib/models/user/fav_folder.dart
index 6d3f9975..c45e2de9 100644
--- a/lib/models/user/fav_folder.dart
+++ b/lib/models/user/fav_folder.dart
@@ -15,7 +15,7 @@ class FavFolderData {
? json['list']
.map((e) => FavFolderItemData.fromJson(e))
.toList()
- : [FavFolderItemData()];
+ : [];
hasMore = json['has_more'];
}
}
diff --git a/lib/pages/about/index.dart b/lib/pages/about/index.dart
index 7c42f5aa..b381691a 100644
--- a/lib/pages/about/index.dart
+++ b/lib/pages/about/index.dart
@@ -201,7 +201,6 @@ class _AboutPageState extends State {
var cleanStatus = await CacheManage().clearCacheAll();
if (cleanStatus) {
getCacheSize();
- SmartDialog.showToast('清除成功');
}
},
title: const Text('清除缓存'),
@@ -254,12 +253,16 @@ class AboutController extends GetxController {
// 获取远程版本
Future getRemoteApp() async {
var result = await Request().get(Api.latestApp, extra: {'ua': 'pc'});
+ isLoading.value = false;
+ if (result.data == null || result.data.isEmpty) {
+ SmartDialog.showToast('获取远程版本失败,请检查网络');
+ return;
+ }
data = LatestDataModel.fromJson(result.data);
remoteAppInfo = data;
remoteVersion.value = data.tagName!;
isUpdate.value =
Utils.needUpdate(currentVersion.value, remoteVersion.value);
- isLoading.value = false;
}
// 跳转下载/本地更新
@@ -277,7 +280,7 @@ class AboutController extends GetxController {
githubRelease() {
launchUrl(
- Uri.parse('https://github.com/guozhigq/pilipala/release'),
+ Uri.parse('https://github.com/guozhigq/pilipala/releases'),
mode: LaunchMode.externalApplication,
);
}
diff --git a/lib/pages/bangumi/controller.dart b/lib/pages/bangumi/controller.dart
index 09afc43a..e5748d6c 100644
--- a/lib/pages/bangumi/controller.dart
+++ b/lib/pages/bangumi/controller.dart
@@ -7,8 +7,8 @@ import 'package:pilipala/utils/storage.dart';
class BangumiController extends GetxController {
final ScrollController scrollController = ScrollController();
- RxList bangumiList = [BangumiListItemModel()].obs;
- RxList bangumiFollowList = [BangumiListItemModel()].obs;
+ RxList bangumiList = [].obs;
+ RxList bangumiFollowList = [].obs;
int _currentPage = 1;
bool isLoadingMore = true;
Box userInfoCache = GStrorage.userInfo;
diff --git a/lib/pages/bangumi/introduction/controller.dart b/lib/pages/bangumi/introduction/controller.dart
index 6b3123ea..12f0c053 100644
--- a/lib/pages/bangumi/introduction/controller.dart
+++ b/lib/pages/bangumi/introduction/controller.dart
@@ -25,13 +25,6 @@ class BangumiIntroController extends GetxController {
? int.tryParse(Get.parameters['epId']!)
: null;
- // 是否预渲染 骨架屏
- bool preRender = false;
-
- // 视频详情 上个页面传入
- Map? videoItem = {};
- BangumiInfoModel? bangumiItem;
-
// 请求状态
RxBool isLoading = false.obs;
@@ -63,27 +56,6 @@ class BangumiIntroController extends GetxController {
@override
void onInit() {
super.onInit();
- if (Get.arguments.isNotEmpty as bool) {
- if (Get.arguments.containsKey('bangumiItem') as bool) {
- preRender = true;
- bangumiItem = Get.arguments['bangumiItem'];
- // bangumiItem!['pic'] = args.pic;
- // if (args.title is String) {
- // videoItem!['title'] = args.title;
- // } else {
- // String str = '';
- // for (Map map in args.title) {
- // str += map['text'];
- // }
- // videoItem!['title'] = str;
- // }
- // if (args.stat != null) {
- // videoItem!['stat'] = args.stat;
- // }
- // videoItem!['pubdate'] = args.pubdate;
- // videoItem!['owner'] = args.owner;
- }
- }
userInfo = userInfoCache.get('userInfoCache');
userLogin = userInfo != null;
}
@@ -183,20 +155,21 @@ class BangumiIntroController extends GetxController {
actions: [
TextButton(onPressed: () => Get.back(), child: const Text('取消')),
TextButton(
- onPressed: () async {
- var res = await VideoHttp.coinVideo(
- bvid: bvid, multiply: _tempThemeValue);
- if (res['status']) {
- SmartDialog.showToast('投币成功 👏');
- hasCoin.value = true;
- bangumiDetail.value.stat!['coins'] =
- bangumiDetail.value.stat!['coins'] + _tempThemeValue;
- } else {
- SmartDialog.showToast(res['msg']);
- }
- Get.back();
- },
- child: const Text('确定'))
+ onPressed: () async {
+ var res = await VideoHttp.coinVideo(
+ bvid: bvid, multiply: _tempThemeValue);
+ if (res['status']) {
+ SmartDialog.showToast('投币成功 👏');
+ hasCoin.value = true;
+ bangumiDetail.value.stat!['coins'] =
+ bangumiDetail.value.stat!['coins'] + _tempThemeValue;
+ } else {
+ SmartDialog.showToast(res['msg']);
+ }
+ Get.back();
+ },
+ child: const Text('确定'),
+ )
],
);
});
diff --git a/lib/pages/bangumi/introduction/view.dart b/lib/pages/bangumi/introduction/view.dart
index f9efc66c..6255ffda 100644
--- a/lib/pages/bangumi/introduction/view.dart
+++ b/lib/pages/bangumi/introduction/view.dart
@@ -12,11 +12,10 @@ import 'package:pilipala/models/bangumi/info.dart';
import 'package:pilipala/pages/bangumi/widgets/bangumi_panel.dart';
import 'package:pilipala/pages/video/detail/index.dart';
import 'package:pilipala/pages/video/detail/introduction/widgets/action_item.dart';
-import 'package:pilipala/pages/video/detail/introduction/widgets/action_row_item.dart';
import 'package:pilipala/pages/video/detail/introduction/widgets/fav_panel.dart';
import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/storage.dart';
-
+import '../../../common/widgets/http_error.dart';
import 'controller.dart';
import 'widgets/intro_detail.dart';
@@ -51,9 +50,6 @@ class _BangumiIntroPanelState extends State
cid = widget.cid!;
bangumiIntroController = Get.put(BangumiIntroController(), tag: heroTag);
videoDetailCtr = Get.find(tag: heroTag);
- bangumiIntroController.bangumiDetail.listen((BangumiInfoModel value) {
- bangumiDetail = value;
- });
_futureBuilderFuture = bangumiIntroController.queryBangumiIntro();
videoDetailCtr.cid.listen((int p0) {
cid = p0;
@@ -68,27 +64,32 @@ class _BangumiIntroPanelState extends State
future: _futureBuilderFuture,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
+ if (snapshot.data == null) {
+ return const SliverToBoxAdapter(child: SizedBox());
+ }
if (snapshot.data['status']) {
// 请求成功
-
- return BangumiInfo(
- loadingStatus: false,
- bangumiDetail: bangumiDetail,
- cid: cid,
+ return Obx(
+ () => BangumiInfo(
+ bangumiDetail: bangumiIntroController.bangumiDetail.value,
+ cid: cid,
+ ),
);
} else {
// 请求错误
- // return HttpError(
- // errMsg: snapshot.data['msg'],
- // fn: () => Get.back(),
- // );
- return const SizedBox();
+ return HttpError(
+ errMsg: snapshot.data['msg'],
+ fn: () => Get.back(),
+ );
}
} else {
- return BangumiInfo(
- loadingStatus: true,
- bangumiDetail: bangumiDetail,
- cid: cid,
+ return const SliverToBoxAdapter(
+ child: SizedBox(
+ height: 100,
+ child: Center(
+ child: CircularProgressIndicator(),
+ ),
+ ),
);
}
},
@@ -99,12 +100,10 @@ class _BangumiIntroPanelState extends State
class BangumiInfo extends StatefulWidget {
const BangumiInfo({
super.key,
- this.loadingStatus = false,
this.bangumiDetail,
this.cid,
});
- final bool loadingStatus;
final BangumiInfoModel? bangumiDetail;
final int? cid;
@@ -117,7 +116,6 @@ class _BangumiInfoState extends State {
late final BangumiIntroController bangumiIntroController;
late final VideoDetailController videoDetailCtr;
Box localCache = GStrorage.localCache;
- late final BangumiInfoModel? bangumiItem;
late double sheetHeight;
int? cid;
bool isProcessing = false;
@@ -136,13 +134,10 @@ class _BangumiInfoState extends State {
super.initState();
bangumiIntroController = Get.put(BangumiIntroController(), tag: heroTag);
videoDetailCtr = Get.find(tag: heroTag);
- bangumiItem = bangumiIntroController.bangumiItem;
sheetHeight = localCache.get('sheetHeight');
cid = widget.cid!;
- print('cid: $cid');
videoDetailCtr.cid.listen((p0) {
cid = p0;
- print('cid: $cid');
setState(() {});
});
}
@@ -182,207 +177,155 @@ class _BangumiInfoState extends State {
padding: const EdgeInsets.only(
left: StyleString.safeSpace, right: StyleString.safeSpace, top: 20),
sliver: SliverToBoxAdapter(
- child: !widget.loadingStatus || bangumiItem != null
- ? Column(
- crossAxisAlignment: CrossAxisAlignment.start,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Stack(
children: [
- Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Stack(
- children: [
- NetworkImgLayer(
- width: 105,
- height: 160,
- src: !widget.loadingStatus
- ? widget.bangumiDetail!.cover!
- : bangumiItem!.cover!,
- ),
- if (bangumiItem != null &&
- bangumiItem!.rating != null)
- PBadge(
- text:
- '评分 ${!widget.loadingStatus ? widget.bangumiDetail!.rating!['score']! : bangumiItem!.rating!['score']!}',
- top: null,
- right: 6,
- bottom: 6,
- left: null,
+ NetworkImgLayer(
+ width: 105,
+ height: 160,
+ src: widget.bangumiDetail!.cover!,
+ ),
+ PBadge(
+ text: '评分 ${widget.bangumiDetail!.rating!['score']!}',
+ top: null,
+ right: 6,
+ bottom: 6,
+ left: null,
+ ),
+ ],
+ ),
+ const SizedBox(width: 10),
+ Expanded(
+ child: InkWell(
+ onTap: () => showIntroDetail(),
+ child: SizedBox(
+ height: 158,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Row(
+ children: [
+ Expanded(
+ child: Text(
+ widget.bangumiDetail!.title!,
+ style: const TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ ),
+ maxLines: 1,
+ overflow: TextOverflow.ellipsis,
+ ),
),
- ],
- ),
- const SizedBox(width: 10),
- Expanded(
- child: InkWell(
- onTap: () => showIntroDetail(),
- child: SizedBox(
- height: 158,
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- mainAxisSize: MainAxisSize.min,
- children: [
- Row(
- children: [
- Expanded(
- child: Text(
- !widget.loadingStatus
- ? widget.bangumiDetail!.title!
- : bangumiItem!.title!,
- style: const TextStyle(
- fontSize: 16,
- fontWeight: FontWeight.w500,
- ),
- maxLines: 1,
- overflow: TextOverflow.ellipsis,
- ),
- ),
- const SizedBox(width: 20),
- SizedBox(
- width: 34,
- height: 34,
- child: IconButton(
- style: ButtonStyle(
- padding: MaterialStateProperty.all(
- EdgeInsets.zero),
- backgroundColor:
- MaterialStateProperty.resolveWith(
- (Set states) {
- return t
- .colorScheme.primaryContainer
- .withOpacity(0.7);
- }),
- ),
- onPressed: () =>
- bangumiIntroController.bangumiAdd(),
- icon: Icon(
- Icons.favorite_border_rounded,
- color: t.colorScheme.primary,
- size: 22,
- ),
- ),
- ),
- ],
+ const SizedBox(width: 20),
+ SizedBox(
+ width: 34,
+ height: 34,
+ child: IconButton(
+ style: ButtonStyle(
+ padding: MaterialStateProperty.all(
+ EdgeInsets.zero),
+ backgroundColor:
+ MaterialStateProperty.resolveWith(
+ (Set states) {
+ return t.colorScheme.primaryContainer
+ .withOpacity(0.7);
+ }),
),
- Row(
- children: [
- StatView(
- theme: 'gray',
- view: !widget.loadingStatus
- ? widget.bangumiDetail!.stat!['views']
- : bangumiItem!.stat!['views'],
- size: 'medium',
- ),
- const SizedBox(width: 6),
- StatDanMu(
- theme: 'gray',
- danmu: !widget.loadingStatus
- ? widget
- .bangumiDetail!.stat!['danmakus']
- : bangumiItem!.stat!['danmakus'],
- size: 'medium',
- ),
- ],
+ onPressed: () =>
+ bangumiIntroController.bangumiAdd(),
+ icon: Icon(
+ Icons.favorite_border_rounded,
+ color: t.colorScheme.primary,
+ size: 22,
),
- const SizedBox(height: 6),
- Row(
- children: [
- Text(
- !widget.loadingStatus
- ? (widget.bangumiDetail!.areas!
- .isNotEmpty
- ? widget.bangumiDetail!.areas!
- .first['name']
- : '')
- : (bangumiItem!.areas!.isNotEmpty
- ? bangumiItem!
- .areas!.first['name']
- : ''),
- style: TextStyle(
- fontSize: 12,
- color: t.colorScheme.outline,
- ),
- ),
- const SizedBox(width: 6),
- Text(
- !widget.loadingStatus
- ? widget.bangumiDetail!
- .publish!['pub_time_show']
- : bangumiItem!
- .publish!['pub_time_show'],
- style: TextStyle(
- fontSize: 12,
- color: t.colorScheme.outline,
- ),
- ),
- ],
- ),
- // const SizedBox(height: 4),
- Text(
- !widget.loadingStatus
- ? widget.bangumiDetail!.newEp!['desc']
- : bangumiItem!.newEp!['desc'],
- style: TextStyle(
- fontSize: 12,
- color: t.colorScheme.outline,
- ),
- ),
- // const SizedBox(height: 10),
- const Spacer(),
- Text(
- '简介:${!widget.loadingStatus ? widget.bangumiDetail!.evaluate! : bangumiItem!.evaluate!}',
- maxLines: 3,
- overflow: TextOverflow.ellipsis,
- style: TextStyle(
- fontSize: 13,
- color: t.colorScheme.outline,
- ),
- ),
- ],
+ ),
),
+ ],
+ ),
+ Row(
+ children: [
+ StatView(
+ theme: 'gray',
+ view: widget.bangumiDetail!.stat!['views'],
+ size: 'medium',
+ ),
+ const SizedBox(width: 6),
+ StatDanMu(
+ theme: 'gray',
+ danmu: widget.bangumiDetail!.stat!['danmakus'],
+ size: 'medium',
+ ),
+ ],
+ ),
+ const SizedBox(height: 6),
+ Row(
+ children: [
+ Text(
+ (widget.bangumiDetail!.areas!.isNotEmpty
+ ? widget.bangumiDetail!.areas!.first['name']
+ : ''),
+ style: TextStyle(
+ fontSize: 12,
+ color: t.colorScheme.outline,
+ ),
+ ),
+ const SizedBox(width: 6),
+ Text(
+ widget.bangumiDetail!.publish!['pub_time_show'],
+ style: TextStyle(
+ fontSize: 12,
+ color: t.colorScheme.outline,
+ ),
+ ),
+ ],
+ ),
+ Text(
+ widget.bangumiDetail!.newEp!['desc'],
+ style: TextStyle(
+ fontSize: 12,
+ color: t.colorScheme.outline,
),
),
- ),
- ],
+ const Spacer(),
+ Text(
+ '简介:${widget.bangumiDetail!.evaluate!}',
+ maxLines: 3,
+ overflow: TextOverflow.ellipsis,
+ style: TextStyle(
+ fontSize: 13,
+ color: t.colorScheme.outline,
+ ),
+ ),
+ ],
+ ),
),
- const SizedBox(height: 6),
- // 点赞收藏转发 布局样式1
- // SingleChildScrollView(
- // padding: const EdgeInsets.only(top: 7, bottom: 7),
- // scrollDirection: Axis.horizontal,
- // child: actionRow(
- // context,
- // bangumiIntroController,
- // videoDetailCtr,
- // ),
- // ),
- // 点赞收藏转发 布局样式2
- actionGrid(context, bangumiIntroController),
- // 番剧分p
- if ((!widget.loadingStatus &&
- widget.bangumiDetail!.episodes!.isNotEmpty) ||
- bangumiItem != null &&
- bangumiItem!.episodes!.isNotEmpty) ...[
- BangumiPanel(
- pages: bangumiItem != null
- ? bangumiItem!.episodes!
- : widget.bangumiDetail!.episodes!,
- cid: cid ??
- (bangumiItem != null
- ? bangumiItem!.episodes!.first.cid
- : widget.bangumiDetail!.episodes!.first.cid),
- sheetHeight: sheetHeight,
- changeFuc: (bvid, cid, aid) => bangumiIntroController
- .changeSeasonOrbangu(bvid, cid, aid),
- )
- ],
- ],
- )
- : const SizedBox(
- height: 100,
- child: Center(
- child: CircularProgressIndicator(),
),
),
- ),
+ ],
+ ),
+ const SizedBox(height: 6),
+
+ /// 点赞收藏转发
+ actionGrid(context, bangumiIntroController),
+ // 番剧分p
+ if (widget.bangumiDetail!.episodes!.isNotEmpty) ...[
+ BangumiPanel(
+ pages: widget.bangumiDetail!.episodes!,
+ cid: cid ?? widget.bangumiDetail!.episodes!.first.cid,
+ sheetHeight: sheetHeight,
+ changeFuc: (bvid, cid, aid) =>
+ bangumiIntroController.changeSeasonOrbangu(bvid, cid, aid),
+ bangumiDetail: bangumiIntroController.bangumiDetail.value,
+ )
+ ],
+ ],
+ )),
);
}
@@ -402,57 +345,44 @@ class _BangumiInfoState extends State {
children: [
Obx(
() => ActionItem(
- icon: const Icon(FontAwesomeIcons.thumbsUp),
- selectIcon: const Icon(FontAwesomeIcons.solidThumbsUp),
- onTap:
- handleState(bangumiIntroController.actionLikeVideo),
- selectStatus: bangumiIntroController.hasLike.value,
- loadingStatus: false,
- text: !widget.loadingStatus
- ? widget.bangumiDetail!.stat!['likes']!.toString()
- : bangumiItem!.stat!['likes']!.toString()),
+ icon: const Icon(FontAwesomeIcons.thumbsUp),
+ selectIcon: const Icon(FontAwesomeIcons.solidThumbsUp),
+ onTap: handleState(bangumiIntroController.actionLikeVideo),
+ selectStatus: bangumiIntroController.hasLike.value,
+ text: widget.bangumiDetail!.stat!['likes']!.toString(),
+ ),
),
Obx(
() => ActionItem(
- icon: const Icon(FontAwesomeIcons.b),
- selectIcon: const Icon(FontAwesomeIcons.b),
- onTap:
- handleState(bangumiIntroController.actionCoinVideo),
- selectStatus: bangumiIntroController.hasCoin.value,
- loadingStatus: false,
- text: !widget.loadingStatus
- ? widget.bangumiDetail!.stat!['coins']!.toString()
- : bangumiItem!.stat!['coins']!.toString()),
+ icon: const Icon(FontAwesomeIcons.b),
+ selectIcon: const Icon(FontAwesomeIcons.b),
+ onTap: handleState(bangumiIntroController.actionCoinVideo),
+ selectStatus: bangumiIntroController.hasCoin.value,
+ text: widget.bangumiDetail!.stat!['coins']!.toString(),
+ ),
),
Obx(
() => ActionItem(
- icon: const Icon(FontAwesomeIcons.star),
- selectIcon: const Icon(FontAwesomeIcons.solidStar),
- onTap: () => showFavBottomSheet(),
- selectStatus: bangumiIntroController.hasFav.value,
- loadingStatus: false,
- text: !widget.loadingStatus
- ? widget.bangumiDetail!.stat!['favorite']!.toString()
- : bangumiItem!.stat!['favorite']!.toString()),
+ icon: const Icon(FontAwesomeIcons.star),
+ selectIcon: const Icon(FontAwesomeIcons.solidStar),
+ onTap: () => showFavBottomSheet(),
+ selectStatus: bangumiIntroController.hasFav.value,
+ text: widget.bangumiDetail!.stat!['favorite']!.toString(),
+ ),
),
ActionItem(
icon: const Icon(FontAwesomeIcons.comment),
selectIcon: const Icon(FontAwesomeIcons.reply),
onTap: () => videoDetailCtr.tabCtr.animateTo(1),
selectStatus: false,
- loadingStatus: false,
- text: !widget.loadingStatus
- ? widget.bangumiDetail!.stat!['reply']!.toString()
- : bangumiItem!.stat!['reply']!.toString(),
+ text: widget.bangumiDetail!.stat!['reply']!.toString(),
),
ActionItem(
- icon: const Icon(FontAwesomeIcons.shareFromSquare),
- onTap: () => bangumiIntroController.actionShareVideo(),
- selectStatus: false,
- loadingStatus: false,
- text: !widget.loadingStatus
- ? widget.bangumiDetail!.stat!['share']!.toString()
- : bangumiItem!.stat!['share']!.toString()),
+ icon: const Icon(FontAwesomeIcons.shareFromSquare),
+ onTap: () => bangumiIntroController.actionShareVideo(),
+ selectStatus: false,
+ text: widget.bangumiDetail!.stat!['share']!.toString(),
+ ),
],
),
),
@@ -460,63 +390,4 @@ class _BangumiInfoState extends State {
);
});
}
-
- Widget actionRow(BuildContext context, videoIntroController, videoDetailCtr) {
- return Row(children: [
- Obx(
- () => ActionRowItem(
- icon: const Icon(FontAwesomeIcons.thumbsUp),
- onTap: handleState(videoIntroController.actionLikeVideo),
- selectStatus: videoIntroController.hasLike.value,
- loadingStatus: widget.loadingStatus,
- text: !widget.loadingStatus
- ? widget.bangumiDetail!.stat!['likes']!.toString()
- : '-',
- ),
- ),
- const SizedBox(width: 8),
- Obx(
- () => ActionRowItem(
- icon: const Icon(FontAwesomeIcons.b),
- onTap: handleState(videoIntroController.actionCoinVideo),
- selectStatus: videoIntroController.hasCoin.value,
- loadingStatus: widget.loadingStatus,
- text: !widget.loadingStatus
- ? widget.bangumiDetail!.stat!['coins']!.toString()
- : '-',
- ),
- ),
- const SizedBox(width: 8),
- Obx(
- () => ActionRowItem(
- icon: const Icon(FontAwesomeIcons.heart),
- onTap: () => showFavBottomSheet(),
- selectStatus: videoIntroController.hasFav.value,
- loadingStatus: widget.loadingStatus,
- text: !widget.loadingStatus
- ? widget.bangumiDetail!.stat!['favorite']!.toString()
- : '-',
- ),
- ),
- const SizedBox(width: 8),
- ActionRowItem(
- icon: const Icon(FontAwesomeIcons.comment),
- onTap: () {
- videoDetailCtr.tabCtr.animateTo(1);
- },
- selectStatus: false,
- loadingStatus: widget.loadingStatus,
- text: !widget.loadingStatus
- ? widget.bangumiDetail!.stat!['reply']!.toString()
- : '-',
- ),
- const SizedBox(width: 8),
- ActionRowItem(
- icon: const Icon(FontAwesomeIcons.share),
- onTap: () => videoIntroController.actionShareVideo(),
- selectStatus: false,
- loadingStatus: widget.loadingStatus,
- text: '转发'),
- ]);
- }
}
diff --git a/lib/pages/bangumi/widgets/bangumi_panel.dart b/lib/pages/bangumi/widgets/bangumi_panel.dart
index 5996d6c8..05fd814c 100644
--- a/lib/pages/bangumi/widgets/bangumi_panel.dart
+++ b/lib/pages/bangumi/widgets/bangumi_panel.dart
@@ -14,12 +14,14 @@ class BangumiPanel extends StatefulWidget {
this.cid,
this.sheetHeight,
this.changeFuc,
+ this.bangumiDetail,
});
final List pages;
final int? cid;
final double? sheetHeight;
final Function? changeFuc;
+ final BangumiInfoModel? bangumiDetail;
@override
State createState() => _BangumiPanelState();
@@ -65,6 +67,47 @@ class _BangumiPanelState extends State {
super.dispose();
}
+ Widget buildPageListItem(
+ EpisodeItem page,
+ int index,
+ bool isCurrentIndex,
+ ) {
+ Color primary = Theme.of(context).colorScheme.primary;
+ return ListTile(
+ onTap: () {
+ Get.back();
+ setState(() {
+ changeFucCall(page, index);
+ });
+ },
+ dense: false,
+ leading: isCurrentIndex
+ ? Image.asset(
+ 'assets/images/live.gif',
+ color: primary,
+ height: 12,
+ )
+ : null,
+ title: Text(
+ '第${page.title}话 ${page.longTitle!}',
+ style: TextStyle(
+ fontSize: 14,
+ color: isCurrentIndex
+ ? primary
+ : Theme.of(context).colorScheme.onSurface,
+ ),
+ ),
+ trailing: page.badge != null
+ ? Text(
+ page.badge!,
+ style: TextStyle(
+ color: Theme.of(context).colorScheme.primary,
+ ),
+ )
+ : const SizedBox(),
+ );
+ }
+
void showBangumiPanel() {
showBottomSheet(
context: context,
@@ -105,38 +148,22 @@ class _BangumiPanelState extends State {
Expanded(
child: Material(
child: ScrollablePositionedList.builder(
- itemCount: widget.pages.length,
- itemBuilder: (BuildContext context, int index) =>
- ListTile(
- onTap: () {
- setState(() {
- changeFucCall(widget.pages[index], index);
- });
- },
- dense: false,
- leading: index == currentIndex
- ? Image.asset(
- 'assets/images/live.gif',
- color: Theme.of(context).colorScheme.primary,
- height: 12,
+ itemCount: widget.pages.length + 1,
+ itemBuilder: (BuildContext context, int index) {
+ bool isLastItem = index == widget.pages.length;
+ bool isCurrentIndex = currentIndex == index;
+ return isLastItem
+ ? SizedBox(
+ height:
+ MediaQuery.of(context).padding.bottom +
+ 20,
)
- : null,
- title: Text(
- '第${index + 1}话 ${widget.pages[index].longTitle!}',
- style: TextStyle(
- fontSize: 14,
- color: index == currentIndex
- ? Theme.of(context).colorScheme.primary
- : Theme.of(context).colorScheme.onSurface,
- ),
- ),
- trailing: widget.pages[index].badge != null
- ? Image.asset(
- 'assets/images/big-vip.png',
- height: 20,
- )
- : const SizedBox(),
- ),
+ : buildPageListItem(
+ widget.pages[index],
+ index,
+ isCurrentIndex,
+ );
+ },
itemScrollController: itemScrollController,
),
),
@@ -178,11 +205,11 @@ class _BangumiPanelState extends State {
return Column(
children: [
Padding(
- padding: const EdgeInsets.only(top: 10, bottom: 6),
+ padding: const EdgeInsets.only(top: 10, bottom: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- const Text('合集 '),
+ const Text('选集 '),
Expanded(
child: Text(
' 正在播放:${widget.pages[currentIndex].longTitle}',
@@ -202,7 +229,7 @@ class _BangumiPanelState extends State {
),
onPressed: () => showBangumiPanel(),
child: Text(
- '全${widget.pages.length}话',
+ '${widget.bangumiDetail!.newEp!['desc']}',
style: const TextStyle(fontSize: 13),
),
),
@@ -255,23 +282,15 @@ class _BangumiPanelState extends State {
),
const SizedBox(width: 2),
if (widget.pages[i].badge != null) ...[
- if (widget.pages[i].badge == '会员') ...[
- Image.asset(
- 'assets/images/big-vip.png',
- height: 16,
+ const Spacer(),
+ Text(
+ widget.pages[i].badge!,
+ style: TextStyle(
+ fontSize: 12,
+ color:
+ Theme.of(context).colorScheme.primary,
),
- ],
- if (widget.pages[i].badge != '会员') ...[
- const Spacer(),
- Text(
- widget.pages[i].badge!,
- style: TextStyle(
- fontSize: 11,
- color:
- Theme.of(context).colorScheme.primary,
- ),
- ),
- ],
+ ),
]
],
),
diff --git a/lib/pages/blacklist/index.dart b/lib/pages/blacklist/index.dart
index 3bf64146..402790f5 100644
--- a/lib/pages/blacklist/index.dart
+++ b/lib/pages/blacklist/index.dart
@@ -139,7 +139,7 @@ class BlackListController extends GetxController {
int currentPage = 1;
int pageSize = 50;
RxInt total = 0.obs;
- RxList blackList = [BlackListItem()].obs;
+ RxList blackList = [].obs;
Future queryBlacklist({type = 'init'}) async {
if (type == 'init') {
diff --git a/lib/pages/dynamics/controller.dart b/lib/pages/dynamics/controller.dart
index 26ba2b22..b7676663 100644
--- a/lib/pages/dynamics/controller.dart
+++ b/lib/pages/dynamics/controller.dart
@@ -20,7 +20,7 @@ import 'package:pilipala/utils/utils.dart';
class DynamicsController extends GetxController {
int page = 1;
String? offset = '';
- RxList dynamicsList = [DynamicItemModel()].obs;
+ RxList dynamicsList = [].obs;
Rx dynamicsType = DynamicsType.values[0].obs;
RxString dynamicsTypeLabel = '全部'.obs;
final ScrollController scrollController = ScrollController();
@@ -105,7 +105,7 @@ class DynamicsController extends GetxController {
onSelectType(value) async {
dynamicsType.value = filterTypeList[value]['value'];
- dynamicsList.value = [DynamicItemModel()];
+ dynamicsList.value = [];
page = 1;
initialValue.value = value;
await queryFollowDynamic();
@@ -249,8 +249,8 @@ class DynamicsController extends GetxController {
return {'status': false, 'msg': '账号未登录'};
}
if (type == 'init') {
- upData.value.upList = [];
- upData.value.liveUsers = LiveUsers();
+ upData.value.upList = [];
+ upData.value.liveList = [];
}
var res = await DynamicsHttp.followUp();
if (res['status']) {
@@ -258,20 +258,23 @@ class DynamicsController extends GetxController {
if (upData.value.upList!.isEmpty) {
mid.value = -1;
}
+ upData.value.upList!.insertAll(0, [
+ UpItem(face: '', uname: '全部动态', mid: -1),
+ UpItem(face: userInfo.face, uname: '我', mid: userInfo.mid),
+ ]);
}
return res;
}
onSelectUp(mid) async {
dynamicsType.value = DynamicsType.values[0];
- dynamicsList.value = [DynamicItemModel()];
+ dynamicsList.value = [];
page = 1;
queryFollowDynamic();
}
onRefresh() async {
page = 1;
- print('onRefresh');
await queryFollowUp();
await queryFollowDynamic();
}
@@ -293,7 +296,7 @@ class DynamicsController extends GetxController {
dynamicsType.value = DynamicsType.values[0];
initialValue.value = 0;
SmartDialog.showToast('还原默认加载');
- dynamicsList.value = [DynamicItemModel()];
+ dynamicsList.value = [];
queryFollowDynamic();
}
}
diff --git a/lib/pages/dynamics/detail/controller.dart b/lib/pages/dynamics/detail/controller.dart
index 4c5f35d6..8e117383 100644
--- a/lib/pages/dynamics/detail/controller.dart
+++ b/lib/pages/dynamics/detail/controller.dart
@@ -17,7 +17,7 @@ class DynamicDetailController extends GetxController {
int currentPage = 0;
bool isLoadingMore = false;
RxString noMore = ''.obs;
- RxList replyList = [ReplyItemModel()].obs;
+ RxList replyList = [].obs;
RxInt acount = 0.obs;
final ScrollController scrollController = ScrollController();
diff --git a/lib/pages/dynamics/view.dart b/lib/pages/dynamics/view.dart
index 4a92cdfb..fe594a43 100644
--- a/lib/pages/dynamics/view.dart
+++ b/lib/pages/dynamics/view.dart
@@ -14,6 +14,7 @@ import 'package:pilipala/pages/main/index.dart';
import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/storage.dart';
+import '../mine/controller.dart';
import 'controller.dart';
import 'widgets/dynamic_panel.dart';
import 'widgets/up_panel.dart';
@@ -28,6 +29,7 @@ class DynamicsPage extends StatefulWidget {
class _DynamicsPageState extends State
with AutomaticKeepAliveClientMixin {
final DynamicsController _dynamicsController = Get.put(DynamicsController());
+ final MineController mineController = Get.put(MineController());
late Future _futureBuilderFuture;
late Future _futureBuilderFutureUp;
Box userInfoCache = GStrorage.userInfo;
@@ -256,6 +258,14 @@ class _DynamicsPageState extends State
}
},
);
+ } else if (data['msg'] == "账号未登录") {
+ return HttpError(
+ errMsg: data['msg'],
+ btnText: "去登录",
+ fn: () {
+ mineController.onLogin();
+ },
+ );
} else {
return HttpError(
errMsg: data['msg'],
diff --git a/lib/pages/dynamics/widgets/article_panel.dart b/lib/pages/dynamics/widgets/article_panel.dart
index e68d966d..19707435 100644
--- a/lib/pages/dynamics/widgets/article_panel.dart
+++ b/lib/pages/dynamics/widgets/article_panel.dart
@@ -34,25 +34,25 @@ Widget articlePanel(item, context, {floor = 1}) {
),
const SizedBox(height: 8),
],
- Text(
- item.modules.moduleDynamic.major.opus.title,
- style: Theme.of(context)
- .textTheme
- .titleMedium!
- .copyWith(fontWeight: FontWeight.bold),
- ),
- const SizedBox(height: 2),
- if (item.modules.moduleDynamic.major.opus.summary.text !=
- 'undefined') ...[
- Text(
- item.modules.moduleDynamic.major.opus.summary.richTextNodes.first
- .text,
- maxLines: 4,
- style: const TextStyle(height: 1.55),
- overflow: TextOverflow.ellipsis,
- ),
- const SizedBox(height: 2),
- ],
+ // Text(
+ // item.modules.moduleDynamic.major.opus.title,
+ // style: Theme.of(context)
+ // .textTheme
+ // .titleMedium!
+ // .copyWith(fontWeight: FontWeight.bold),
+ // ),
+ // const SizedBox(height: 2),
+ // if (item.modules.moduleDynamic.major.opus.summary.text !=
+ // 'undefined') ...[
+ // Text(
+ // item.modules.moduleDynamic.major.opus.summary.richTextNodes.first
+ // .text,
+ // maxLines: 4,
+ // style: const TextStyle(height: 1.55),
+ // overflow: TextOverflow.ellipsis,
+ // ),
+ // const SizedBox(height: 2),
+ // ],
picWidget(item, context)
],
),
diff --git a/lib/pages/dynamics/widgets/up_panel.dart b/lib/pages/dynamics/widgets/up_panel.dart
index 84753ff9..fd0ae642 100644
--- a/lib/pages/dynamics/widgets/up_panel.dart
+++ b/lib/pages/dynamics/widgets/up_panel.dart
@@ -1,16 +1,14 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
-import 'package:hive/hive.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/models/dynamics/up.dart';
import 'package:pilipala/models/live/item.dart';
import 'package:pilipala/pages/dynamics/controller.dart';
import 'package:pilipala/utils/feed_back.dart';
-import 'package:pilipala/utils/storage.dart';
import 'package:pilipala/utils/utils.dart';
class UpPanel extends StatefulWidget {
- final FollowUpModel? upData;
+ final FollowUpModel upData;
const UpPanel(this.upData, {Key? key}) : super(key: key);
@override
@@ -24,38 +22,22 @@ class _UpPanelState extends State {
List upList = [];
List liveList = [];
static const itemPadding = EdgeInsets.symmetric(horizontal: 5, vertical: 0);
- Box userInfoCache = GStrorage.userInfo;
- var userInfo;
+ late MyInfo userInfo;
- @override
- void initState() {
- super.initState();
- upList = widget.upData!.upList!;
- if (widget.upData!.liveUsers != null) {
- liveList = widget.upData!.liveUsers!.items!;
- }
- upList.insert(
- 0,
- UpItem(face: '', uname: '全部动态', mid: -1),
- );
- userInfo = userInfoCache.get('userInfoCache');
- upList.insert(
- 1,
- UpItem(
- face: userInfo.face,
- uname: '我',
- mid: userInfo.mid,
- ),
- );
+ void listFormat() {
+ userInfo = widget.upData.myInfo!;
+ upList = widget.upData.upList!;
+ liveList = widget.upData.liveList!;
}
@override
Widget build(BuildContext context) {
+ listFormat();
return SliverPersistentHeader(
floating: true,
pinned: false,
delegate: _SliverHeaderDelegate(
- height: 126,
+ height: liveList.isNotEmpty || upList.isNotEmpty ? 126 : 0,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
@@ -90,7 +72,7 @@ class _UpPanelState extends State {
color: Theme.of(context).colorScheme.background,
child: Row(
children: [
- Expanded(
+ Flexible(
child: ListView(
scrollDirection: Axis.horizontal,
controller: scrollController,
diff --git a/lib/pages/fan/controller.dart b/lib/pages/fan/controller.dart
index 8675ada7..c1c2a427 100644
--- a/lib/pages/fan/controller.dart
+++ b/lib/pages/fan/controller.dart
@@ -10,7 +10,7 @@ class FansController extends GetxController {
int pn = 1;
int ps = 20;
int total = 0;
- RxList fansList = [FansItemModel()].obs;
+ RxList fansList = [].obs;
late int mid;
late String name;
var userInfo;
diff --git a/lib/pages/fav_detail/controller.dart b/lib/pages/fav_detail/controller.dart
index 69cc939e..55d5b884 100644
--- a/lib/pages/fav_detail/controller.dart
+++ b/lib/pages/fav_detail/controller.dart
@@ -16,7 +16,7 @@ class FavDetailController extends GetxController {
RxMap favInfo = {}.obs;
RxList favList = [].obs;
RxString loadingText = '加载中...'.obs;
- int mediaCount = 0;
+ RxInt mediaCount = 0.obs;
@override
void onInit() {
@@ -29,7 +29,7 @@ class FavDetailController extends GetxController {
}
Future queryUserFavFolderDetail({type = 'init'}) async {
- if (type == 'onLoad' && favList.length >= mediaCount) {
+ if (type == 'onLoad' && favList.length >= mediaCount.value) {
loadingText.value = '没有更多了';
return;
}
@@ -43,11 +43,11 @@ class FavDetailController extends GetxController {
favInfo.value = res['data'].info;
if (currentPage == 1 && type == 'init') {
favList.value = res['data'].medias;
- mediaCount = res['data'].info['media_count'];
+ mediaCount.value = res['data'].info['media_count'];
} else if (type == 'onLoad') {
favList.addAll(res['data'].medias);
}
- if (favList.length >= mediaCount) {
+ if (favList.length >= mediaCount.value) {
loadingText.value = '没有更多了';
}
}
diff --git a/lib/pages/fav_detail/view.dart b/lib/pages/fav_detail/view.dart
index 27d7182b..d94f5149 100644
--- a/lib/pages/fav_detail/view.dart
+++ b/lib/pages/fav_detail/view.dart
@@ -84,7 +84,7 @@ class _FavDetailPageState extends State {
style: Theme.of(context).textTheme.titleMedium,
),
Text(
- '共${_favDetailController.item!.mediaCount!}条视频',
+ '共${_favDetailController.mediaCount}条视频',
style: Theme.of(context).textTheme.labelMedium,
)
],
@@ -175,7 +175,7 @@ class _FavDetailPageState extends State {
padding: const EdgeInsets.only(top: 15, bottom: 8, left: 14),
child: Obx(
() => Text(
- '共${_favDetailController.favList.length}条视频',
+ '共${_favDetailController.mediaCount}条视频',
style: TextStyle(
fontSize:
Theme.of(context).textTheme.labelMedium!.fontSize,
diff --git a/lib/pages/history/controller.dart b/lib/pages/history/controller.dart
index e7822cd9..a1f18113 100644
--- a/lib/pages/history/controller.dart
+++ b/lib/pages/history/controller.dart
@@ -88,8 +88,10 @@ class HistoryController extends GetxController {
// 观看历史暂停状态
Future historyStatus() async {
var res = await UserHttp.historyStatus();
- pauseStatus.value = res.data['data'];
- localCache.put(LocalCacheKey.historyPause, res.data['data']);
+ if (res.data['code'] == 0) {
+ pauseStatus.value = res.data['data'];
+ localCache.put(LocalCacheKey.historyPause, res.data['data']);
+ }
}
// 清空观看历史
diff --git a/lib/pages/home/controller.dart b/lib/pages/home/controller.dart
index 9f6f8ac5..fb85be0b 100644
--- a/lib/pages/home/controller.dart
+++ b/lib/pages/home/controller.dart
@@ -34,8 +34,6 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
userInfo = userInfoCache.get('userInfoCache');
userLogin.value = userInfo != null;
userFace.value = userInfo != null ? userInfo.face : '';
- // 进行tabs配置
- setTabConfig();
hideSearchBar =
setting.get(SettingBoxKey.hideSearchBar, defaultValue: true);
if (setting.get(SettingBoxKey.enableSearchWord, defaultValue: true)) {
@@ -43,6 +41,8 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
}
enableGradientBg =
setting.get(SettingBoxKey.enableGradientBg, defaultValue: true);
+ // 进行tabs配置
+ setTabConfig();
}
void onRefresh() {
@@ -91,19 +91,21 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
vsync: this,
);
// 监听 tabController 切换
- tabController.animation!.addListener(() {
- if (tabController.indexIsChanging) {
- if (initialIndex.value != tabController.index) {
- initialIndex.value = tabController.index;
+ if (enableGradientBg) {
+ tabController.animation!.addListener(() {
+ if (tabController.indexIsChanging) {
+ if (initialIndex.value != tabController.index) {
+ initialIndex.value = tabController.index;
+ }
+ } else {
+ final int temp = tabController.animation!.value.round();
+ if (initialIndex.value != temp) {
+ initialIndex.value = temp;
+ tabController.index = initialIndex.value;
+ }
}
- } else {
- final int temp = tabController.animation!.value.round();
- if (initialIndex.value != temp) {
- initialIndex.value = temp;
- tabController.index = initialIndex.value;
- }
- }
- });
+ });
+ }
}
void searchDefault() async {
diff --git a/lib/pages/home/view.dart b/lib/pages/home/view.dart
index 020cb355..b0cef90b 100644
--- a/lib/pages/home/view.dart
+++ b/lib/pages/home/view.dart
@@ -415,13 +415,16 @@ class SearchBar extends StatelessWidget {
),
const SizedBox(width: 10),
Obx(
- () => Text(
- ctr!.defaultSearch.value,
- maxLines: 1,
- overflow: TextOverflow.ellipsis,
- style: TextStyle(color: colorScheme.outline),
+ () => Expanded(
+ child: Text(
+ ctr!.defaultSearch.value,
+ maxLines: 1,
+ overflow: TextOverflow.ellipsis,
+ style: TextStyle(color: colorScheme.outline),
+ ),
),
),
+ const SizedBox(width: 15),
],
),
),
diff --git a/lib/pages/hot/controller.dart b/lib/pages/hot/controller.dart
index 65706c32..85072475 100644
--- a/lib/pages/hot/controller.dart
+++ b/lib/pages/hot/controller.dart
@@ -7,7 +7,7 @@ class HotController extends GetxController {
final ScrollController scrollController = ScrollController();
final int _count = 20;
int _currentPage = 1;
- RxList videoList = [HotVideoItemModel()].obs;
+ RxList videoList = [].obs;
bool isLoadingMore = false;
bool flag = false;
OverlayEntry? popupDialog;
diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart
index 2bb1cd0a..5c2a9800 100644
--- a/lib/pages/live_room/controller.dart
+++ b/lib/pages/live_room/controller.dart
@@ -1,6 +1,8 @@
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:pilipala/http/constants.dart';
import 'package:pilipala/http/live.dart';
+import 'package:pilipala/models/live/quality.dart';
import 'package:pilipala/models/live/room_info.dart';
import 'package:pilipala/plugin/pl_player/index.dart';
import '../../models/live/room_info_h5.dart';
@@ -19,10 +21,16 @@ class LiveRoomController extends GetxController {
PlPlayerController.getInstance(videoType: 'live');
Rx roomInfoH5 = RoomInfoH5Model().obs;
late bool enableCDN;
+ late int currentQn;
+ int? tempCurrentQn;
+ late List