Parcourir la source

[feat]完善视频教程页

hezihao il y a 7 mois
Parent
commit
abc8eb3241

BIN
assets/videos/keyboard_tutorial_video.mp4


+ 0 - 5
lib/di/get_it.config.dart

@@ -71,8 +71,6 @@ import '../module/keyboard/keyboard_controller.dart' as _i161;
 import '../module/keyboard_guide/keyboard_guide_controller.dart' as _i248;
 import '../module/keyboard_manage/keyboard_manage_controller.dart' as _i922;
 import '../module/keyboard_tutorial/keyboard_tutorial_controller.dart' as _i507;
-import '../module/keyboard_tutorial/video/keyboard_tutorial_video_controller.dart'
-    as _i101;
 import '../module/login/login_controller.dart' as _i1008;
 import '../module/main/main_controller.dart' as _i731;
 import '../module/mine/mine_controller.dart' as _i732;
@@ -133,9 +131,6 @@ extension GetItInjectableX on _i174.GetIt {
     gh.factory<_i507.KeyboardTutorialController>(
       () => _i507.KeyboardTutorialController(),
     );
-    gh.factory<_i101.KeyboardTutorialVideoController>(
-      () => _i101.KeyboardTutorialVideoController(),
-    );
     gh.factory<_i973.SplashController>(() => _i973.SplashController());
     gh.factory<_i333.DiscountController>(() => _i333.DiscountController());
     gh.factory<_i1060.ZodiacLoveIntimacyController>(

+ 2 - 3
lib/module/keyboard_tutorial/video/keyboard_tutorial_video_controller.dart

@@ -4,10 +4,9 @@ import 'package:keyboard/base/base_controller.dart';
 import 'package:video_player/video_player.dart';
 
 /// 键盘使用教程-视频引导页Controller
-@injectable
 class KeyboardTutorialVideoController extends BaseController {
   /// 视频是否初始化
-  final Rx<bool> _isVideoInitialized = false.obs;
+  final Rx<bool> isVideoInitialized = false.obs;
 
   /// 视频是否正在播放
   final Rx<bool> isVideoPlaying = false.obs;
@@ -36,7 +35,7 @@ class KeyboardTutorialVideoController extends BaseController {
         'assets/videos/keyboard_tutorial_video.mp4',
       )
       ..initialize().then((_) {
-        _isVideoInitialized.value = true;
+        isVideoInitialized.value = true;
         // 视频初始化完成后,自动播放
         videoController.play();
       });

+ 44 - 41
lib/module/keyboard_tutorial/video/keyboard_tutorial_video_page.dart

@@ -6,7 +6,6 @@ import 'package:keyboard/resource/assets.gen.dart';
 import 'package:keyboard/resource/colors.gen.dart';
 import 'package:video_player/video_player.dart';
 
-import '../../../di/get_it.dart';
 import '../../../router/app_pages.dart';
 import '../../../utils/status_bar_util.dart';
 import 'keyboard_tutorial_video_controller.dart';
@@ -14,9 +13,11 @@ import 'keyboard_tutorial_video_controller.dart';
 /// 键盘使用教程-视频引导页
 class KeyboardTutorialVideoPage
     extends BasePage<KeyboardTutorialVideoController> {
-  KeyboardTutorialVideoPage({super.key}) {
-    Get.lazyPut(() => getIt.get<KeyboardTutorialVideoController>());
-  }
+  KeyboardTutorialVideoPage({super.key});
+
+  final KeyboardTutorialVideoController _controller = Get.put(
+    KeyboardTutorialVideoController(),
+  );
 
   static void start() {
     Get.toNamed(RoutePath.keyboardTutorialVideo);
@@ -39,8 +40,14 @@ class KeyboardTutorialVideoPage
       backgroundColor: backgroundColor(),
       body: Stack(
         children: [
-          // 头部
-          Positioned(left: 0, top: 0, right: 0, child: _buildHeader(context)),
+          // 内容,填充剩余部分
+          Positioned.fill(
+            top: 0,
+            left: 0,
+            right: 0,
+            bottom: 0,
+            child: SingleChildScrollView(child: _buildContent(context)),
+          ),
           // 状态栏和标题栏
           Positioned(
             left: 0,
@@ -51,14 +58,6 @@ class KeyboardTutorialVideoPage
               children: [_buildStatusBar(), _buildTopBar()],
             ),
           ),
-          // 内容,填充剩余部分
-          Positioned.fill(
-            top: 180.h + StatusBarUtil.getStatusBarHeight(Get.context!),
-            left: 0,
-            right: 0,
-            bottom: 0,
-            child: SingleChildScrollView(child: _buildContent()),
-          ),
         ],
       ),
     );
@@ -90,7 +89,7 @@ class KeyboardTutorialVideoPage
             Positioned(
               left: 16.w,
               child: GestureDetector(
-                onTap: controller.clickBack,
+                onTap: _controller.clickBack,
                 child: Assets.images.iconBlackBackArrow.image(
                   width: 24.w,
                   height: 24.h,
@@ -107,7 +106,7 @@ class KeyboardTutorialVideoPage
   Widget _buildHeader(BuildContext context) {
     return SizedBox(
       width: double.infinity,
-      height: 260.h,
+      height: 230.h,
       child: Stack(
         alignment: Alignment.center,
         children: [
@@ -130,7 +129,7 @@ class KeyboardTutorialVideoPage
   }
 
   /// 内容
-  Widget _buildContent() {
+  Widget _buildContent(BuildContext context) {
     return Container(
       // 渐变背景
       decoration: BoxDecoration(
@@ -141,40 +140,44 @@ class KeyboardTutorialVideoPage
         ),
         shape: BoxShape.rectangle,
       ),
-      child: Column(children: [_buildTutorialVideo()]),
+      child: Column(
+        children: [
+          // 头部
+          _buildHeader(context),
+          _buildTutorialVideo(),
+        ],
+      ),
     );
   }
 
   /// 教程视频
   Widget _buildTutorialVideo() {
     return Container(
-      margin: EdgeInsets.only(left: 16, right: 16, top: 12, bottom: 23),
+      margin: EdgeInsets.only(left: 16, right: 16, bottom: 23),
       padding: EdgeInsets.all(12.w),
       decoration: BoxDecoration(
         color: ColorName.white,
         borderRadius: BorderRadius.all(Radius.circular(24.w)),
       ),
-      child: LayoutBuilder(
-        builder: (context, constraints) {
-          double maxWidth = constraints.maxWidth - 24.w;
-          double videoRatio = controller.videoController.value.aspectRatio;
-          return Stack(
-            alignment: Alignment.center,
-            children: [
-              // 视频容器(动态宽高 + 裁剪)
-              SizedBox(
-                width: maxWidth,
-                height: maxWidth / videoRatio,
+      child: Stack(
+        alignment: Alignment.center,
+        children: [
+          Obx(() {
+            if (!_controller.isVideoInitialized.value) {
+              return SizedBox(width: double.infinity, height: 542.h);
+            } else {
+              return AspectRatio(
+                aspectRatio: _controller.videoController.value.aspectRatio,
                 child: ClipRRect(
                   borderRadius: BorderRadius.circular(12.w),
-                  child: VideoPlayer(controller.videoController),
+                  child: VideoPlayer(_controller.videoController),
                 ),
-              ),
-              // 操作按钮
-              _buildActionBtn(),
-            ],
-          );
-        },
+              );
+            }
+          }),
+          // 操作按钮
+          _buildActionBtn(),
+        ],
       ),
     );
   }
@@ -185,11 +188,11 @@ class KeyboardTutorialVideoPage
       return Stack(
         children: [
           Visibility(
-            visible: !controller.isVideoPlaying.value,
+            visible: !_controller.isVideoPlaying.value,
             child: _buildPlayBtn(),
           ),
           Visibility(
-            visible: controller.isVideoPlaying.value,
+            visible: _controller.isVideoPlaying.value,
             child: _buildPauseBtn(),
           ),
         ],
@@ -201,7 +204,7 @@ class KeyboardTutorialVideoPage
   Widget _buildPlayBtn() {
     return GestureDetector(
       onTap: () {
-        controller.clickPlay();
+        _controller.clickPlay();
       },
       child: Assets.images.iconPlay.image(width: 52.w, height: 52.w),
     );
@@ -211,7 +214,7 @@ class KeyboardTutorialVideoPage
   Widget _buildPauseBtn() {
     return GestureDetector(
       onTap: () {
-        controller.clickPause();
+        _controller.clickPause();
       },
       child: Assets.images.iconPause.image(width: 52.w, height: 52.w),
     );

+ 48 - 0
pubspec.lock

@@ -1118,6 +1118,54 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.3.0"
+  permission_handler:
+    dependency: "direct main"
+    description:
+      name: permission_handler
+      sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f"
+      url: "https://pub.dev"
+    source: hosted
+    version: "12.0.0+1"
+  permission_handler_android:
+    dependency: transitive
+    description:
+      name: permission_handler_android
+      sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6"
+      url: "https://pub.dev"
+    source: hosted
+    version: "13.0.1"
+  permission_handler_apple:
+    dependency: transitive
+    description:
+      name: permission_handler_apple
+      sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023
+      url: "https://pub.dev"
+    source: hosted
+    version: "9.4.7"
+  permission_handler_html:
+    dependency: transitive
+    description:
+      name: permission_handler_html
+      sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.1.3+5"
+  permission_handler_platform_interface:
+    dependency: transitive
+    description:
+      name: permission_handler_platform_interface
+      sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878
+      url: "https://pub.dev"
+    source: hosted
+    version: "4.3.0"
+  permission_handler_windows:
+    dependency: transitive
+    description:
+      name: permission_handler_windows
+      sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.2.1"
   petitparser:
     dependency: transitive
     description: