Showing
7 changed files
with
68 additions
and
22 deletions
ios/Podfile
0 → 100644
| 1 | +# Uncomment this line to define a global platform for your project | ||
| 2 | +# platform :ios, '9.0' | ||
| 3 | + | ||
| 4 | +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. | ||
| 5 | +ENV['COCOAPODS_DISABLE_STATS'] = 'true' | ||
| 6 | + | ||
| 7 | +project 'Runner', { | ||
| 8 | + 'Debug' => :debug, | ||
| 9 | + 'Profile' => :release, | ||
| 10 | + 'Release' => :release, | ||
| 11 | +} | ||
| 12 | + | ||
| 13 | +def flutter_root | ||
| 14 | + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) | ||
| 15 | + unless File.exist?(generated_xcode_build_settings_path) | ||
| 16 | + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" | ||
| 17 | + end | ||
| 18 | + | ||
| 19 | + File.foreach(generated_xcode_build_settings_path) do |line| | ||
| 20 | + matches = line.match(/FLUTTER_ROOT\=(.*)/) | ||
| 21 | + return matches[1].strip if matches | ||
| 22 | + end | ||
| 23 | + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" | ||
| 24 | +end | ||
| 25 | + | ||
| 26 | +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) | ||
| 27 | + | ||
| 28 | +flutter_ios_podfile_setup | ||
| 29 | + | ||
| 30 | +target 'Runner' do | ||
| 31 | + use_frameworks! | ||
| 32 | + use_modular_headers! | ||
| 33 | + | ||
| 34 | + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) | ||
| 35 | +end | ||
| 36 | + | ||
| 37 | +post_install do |installer| | ||
| 38 | + installer.pods_project.targets.each do |target| | ||
| 39 | + flutter_additional_ios_build_settings(target) | ||
| 40 | + end | ||
| 41 | +end |
| 1 | import 'dart:async'; | 1 | import 'dart:async'; |
| 2 | 2 | ||
| 3 | -import 'package:flutter/foundation.dart'; | ||
| 4 | import 'package:flutter/material.dart'; | 3 | import 'package:flutter/material.dart'; |
| 5 | import 'package:flutter/services.dart'; | 4 | import 'package:flutter/services.dart'; |
| 6 | import 'package:one_poem/res/resources.dart'; | 5 | import 'package:one_poem/res/resources.dart'; | ... | ... |
| ... | @@ -59,11 +59,7 @@ Future<void> main() async { | ... | @@ -59,11 +59,7 @@ Future<void> main() async { |
| 59 | SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, | 59 | SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, |
| 60 | overlays: [SystemUiOverlay.bottom]); | 60 | overlays: [SystemUiOverlay.bottom]); |
| 61 | // TODO(weilu): 启动体验不佳。状态栏、导航栏在冷启动开始的一瞬间为黑色,且无法通过隐藏、修改颜色等方式进行处理。。。 | 61 | // TODO(weilu): 启动体验不佳。状态栏、导航栏在冷启动开始的一瞬间为黑色,且无法通过隐藏、修改颜色等方式进行处理。。。 |
| 62 | - // 相关问题跟踪:https://github.com/flutter/flutter/issues/73351 | 62 | + // 相关问题跟踪:https://github.com/flukey: key) { |
| 63 | -} | ||
| 64 | - | ||
| 65 | -class MyApp extends StatelessWidget { | ||
| 66 | - MyApp({Key? key, this.home, this.theme}) : super(key: key) { | ||
| 67 | Log.init(); | 63 | Log.init(); |
| 68 | initDio(); | 64 | initDio(); |
| 69 | Routes.initRoutes(); | 65 | Routes.initRoutes(); | ... | ... |
| 1 | import 'dart:async'; | 1 | import 'dart:async'; |
| 2 | 2 | ||
| 3 | +import 'package:flutter/foundation.dart'; | ||
| 3 | import 'package:flutter/material.dart'; | 4 | import 'package:flutter/material.dart'; |
| 4 | import 'package:one_poem/tiktok/mock/video.dart'; | 5 | import 'package:one_poem/tiktok/mock/video.dart'; |
| 5 | import 'package:video_player/video_player.dart'; | 6 | import 'package:video_player/video_player.dart'; |
| ... | @@ -44,25 +45,33 @@ class TikTokVideoListController extends ChangeNotifier { | ... | @@ -44,25 +45,33 @@ class TikTokVideoListController extends ChangeNotifier { |
| 44 | // playerOfIndex(oldIndex)?.controller.addListener(_didUpdateValue); | 45 | // playerOfIndex(oldIndex)?.controller.addListener(_didUpdateValue); |
| 45 | // playerOfIndex(oldIndex)?.showPauseIcon.addListener(_didUpdateValue); | 46 | // playerOfIndex(oldIndex)?.showPauseIcon.addListener(_didUpdateValue); |
| 46 | playerOfIndex(oldIndex)?.pause(); | 47 | playerOfIndex(oldIndex)?.pause(); |
| 48 | + if (kDebugMode) { | ||
| 47 | print('暂停$oldIndex'); | 49 | print('暂停$oldIndex'); |
| 48 | } | 50 | } |
| 51 | + } | ||
| 49 | // 开始播放当前的视频 | 52 | // 开始播放当前的视频 |
| 50 | playerOfIndex(newIndex)?.controller.addListener(_didUpdateValue); | 53 | playerOfIndex(newIndex)?.controller.addListener(_didUpdateValue); |
| 51 | playerOfIndex(newIndex)?.showPauseIcon.addListener(_didUpdateValue); | 54 | playerOfIndex(newIndex)?.showPauseIcon.addListener(_didUpdateValue); |
| 52 | playerOfIndex(newIndex)?.play(); | 55 | playerOfIndex(newIndex)?.play(); |
| 56 | + if (kDebugMode) { | ||
| 53 | print('播放$newIndex'); | 57 | print('播放$newIndex'); |
| 58 | + } | ||
| 54 | // 处理预加载/释放内存 | 59 | // 处理预加载/释放内存 |
| 55 | for (var i = 0; i < playerList.length; i++) { | 60 | for (var i = 0; i < playerList.length; i++) { |
| 56 | // 需要释放[disposeCount]之前的视频 | 61 | // 需要释放[disposeCount]之前的视频 |
| 57 | if (i < newIndex - disposeCount || i > newIndex + disposeCount) { | 62 | if (i < newIndex - disposeCount || i > newIndex + disposeCount) { |
| 63 | + if (kDebugMode) { | ||
| 58 | print('释放$i'); | 64 | print('释放$i'); |
| 65 | + } | ||
| 59 | playerOfIndex(i)?.controller.removeListener(_didUpdateValue); | 66 | playerOfIndex(i)?.controller.removeListener(_didUpdateValue); |
| 60 | playerOfIndex(i)?.showPauseIcon.removeListener(_didUpdateValue); | 67 | playerOfIndex(i)?.showPauseIcon.removeListener(_didUpdateValue); |
| 61 | playerOfIndex(i)?.dispose(); | 68 | playerOfIndex(i)?.dispose(); |
| 62 | } else { | 69 | } else { |
| 63 | // 需要预加载 | 70 | // 需要预加载 |
| 64 | if (i > newIndex && i < newIndex + preloadCount) { | 71 | if (i > newIndex && i < newIndex + preloadCount) { |
| 72 | + if (kDebugMode) { | ||
| 65 | print('预加载$i'); | 73 | print('预加载$i'); |
| 74 | + } | ||
| 66 | playerOfIndex(i)?.init(); | 75 | playerOfIndex(i)?.init(); |
| 67 | } | 76 | } |
| 68 | } | 77 | } |
| ... | @@ -124,6 +133,7 @@ class TikTokVideoListController extends ChangeNotifier { | ... | @@ -124,6 +133,7 @@ class TikTokVideoListController extends ChangeNotifier { |
| 124 | VPVideoController get currentPlayer => playerList[index.value]; | 133 | VPVideoController get currentPlayer => playerList[index.value]; |
| 125 | 134 | ||
| 126 | /// 销毁全部 | 135 | /// 销毁全部 |
| 136 | + @override | ||
| 127 | void dispose() { | 137 | void dispose() { |
| 128 | // 销毁全部 | 138 | // 销毁全部 |
| 129 | for (var player in playerList) { | 139 | for (var player in playerList) { |
| ... | @@ -156,12 +166,12 @@ abstract class TikTokVideoController<T> { | ... | @@ -156,12 +166,12 @@ abstract class TikTokVideoController<T> { |
| 156 | Future<void> play(); | 166 | Future<void> play(); |
| 157 | 167 | ||
| 158 | /// 暂停 | 168 | /// 暂停 |
| 159 | - Future<void> pause({bool showPauseIcon: false}); | 169 | + Future<void> pause({bool showPauseIcon = false}); |
| 160 | } | 170 | } |
| 161 | 171 | ||
| 162 | class VPVideoController extends TikTokVideoController<VideoPlayerController> { | 172 | class VPVideoController extends TikTokVideoController<VideoPlayerController> { |
| 163 | VideoPlayerController? _controller; | 173 | VideoPlayerController? _controller; |
| 164 | - ValueNotifier<bool> _showPauseIcon = ValueNotifier<bool>(false); | 174 | + final ValueNotifier<bool> _showPauseIcon = ValueNotifier<bool>(false); |
| 165 | 175 | ||
| 166 | final UserVideo? videoInfo; | 176 | final UserVideo? videoInfo; |
| 167 | 177 | ||
| ... | @@ -171,19 +181,17 @@ class VPVideoController extends TikTokVideoController<VideoPlayerController> { | ... | @@ -171,19 +181,17 @@ class VPVideoController extends TikTokVideoController<VideoPlayerController> { |
| 171 | this.videoInfo, | 181 | this.videoInfo, |
| 172 | required ControllerBuilder<VideoPlayerController> builder, | 182 | required ControllerBuilder<VideoPlayerController> builder, |
| 173 | ControllerSetter<VideoPlayerController>? afterInit, | 183 | ControllerSetter<VideoPlayerController>? afterInit, |
| 174 | - }) : this._builder = builder, | 184 | + }) : _builder = builder, |
| 175 | - this._afterInit = afterInit; | 185 | + _afterInit = afterInit; |
| 176 | 186 | ||
| 177 | @override | 187 | @override |
| 178 | VideoPlayerController get controller { | 188 | VideoPlayerController get controller { |
| 179 | - if (_controller == null) { | 189 | + _controller ??= _builder.call(); |
| 180 | - _controller = _builder.call(); | ||
| 181 | - } | ||
| 182 | return _controller!; | 190 | return _controller!; |
| 183 | } | 191 | } |
| 184 | 192 | ||
| 185 | /// 阻止在init的时候dispose,或者在dispose前init | 193 | /// 阻止在init的时候dispose,或者在dispose前init |
| 186 | - List<Future> _actLocks = []; | 194 | + final List<Future> _actLocks = []; |
| 187 | 195 | ||
| 188 | bool get isDispose => _disposeLock != null; | 196 | bool get isDispose => _disposeLock != null; |
| 189 | bool get prepared => _prepared; | 197 | bool get prepared => _prepared; |
| ... | @@ -199,7 +207,7 @@ class VPVideoController extends TikTokVideoController<VideoPlayerController> { | ... | @@ -199,7 +207,7 @@ class VPVideoController extends TikTokVideoController<VideoPlayerController> { |
| 199 | var completer = Completer<void>(); | 207 | var completer = Completer<void>(); |
| 200 | _actLocks.add(completer.future); | 208 | _actLocks.add(completer.future); |
| 201 | _prepared = false; | 209 | _prepared = false; |
| 202 | - await this.controller.dispose(); | 210 | + await controller.dispose(); |
| 203 | _controller = null; | 211 | _controller = null; |
| 204 | _disposeLock = Completer<void>(); | 212 | _disposeLock = Completer<void>(); |
| 205 | completer.complete(); | 213 | completer.complete(); |
| ... | @@ -214,10 +222,10 @@ class VPVideoController extends TikTokVideoController<VideoPlayerController> { | ... | @@ -214,10 +222,10 @@ class VPVideoController extends TikTokVideoController<VideoPlayerController> { |
| 214 | _actLocks.clear(); | 222 | _actLocks.clear(); |
| 215 | var completer = Completer<void>(); | 223 | var completer = Completer<void>(); |
| 216 | _actLocks.add(completer.future); | 224 | _actLocks.add(completer.future); |
| 217 | - await this.controller.initialize(); | 225 | + await controller.initialize(); |
| 218 | - await this.controller.setLooping(true); | 226 | + await controller.setLooping(true); |
| 219 | - afterInit ??= this._afterInit; | 227 | + afterInit ??= _afterInit; |
| 220 | - await afterInit?.call(this.controller); | 228 | + await afterInit?.call(controller); |
| 221 | _prepared = true; | 229 | _prepared = true; |
| 222 | completer.complete(); | 230 | completer.complete(); |
| 223 | if (_disposeLock != null) { | 231 | if (_disposeLock != null) { |
| ... | @@ -227,7 +235,7 @@ class VPVideoController extends TikTokVideoController<VideoPlayerController> { | ... | @@ -227,7 +235,7 @@ class VPVideoController extends TikTokVideoController<VideoPlayerController> { |
| 227 | } | 235 | } |
| 228 | 236 | ||
| 229 | @override | 237 | @override |
| 230 | - Future<void> pause({bool showPauseIcon: false}) async { | 238 | + Future<void> pause({bool showPauseIcon = false}) async { |
| 231 | await Future.wait(_actLocks); | 239 | await Future.wait(_actLocks); |
| 232 | _actLocks.clear(); | 240 | _actLocks.clear(); |
| 233 | await init(); | 241 | await init(); |
| ... | @@ -235,7 +243,7 @@ class VPVideoController extends TikTokVideoController<VideoPlayerController> { | ... | @@ -235,7 +243,7 @@ class VPVideoController extends TikTokVideoController<VideoPlayerController> { |
| 235 | if (_disposeLock != null) { | 243 | if (_disposeLock != null) { |
| 236 | await _disposeLock?.future; | 244 | await _disposeLock?.future; |
| 237 | } | 245 | } |
| 238 | - await this.controller.pause(); | 246 | + await controller.pause(); |
| 239 | _showPauseIcon.value = true; | 247 | _showPauseIcon.value = true; |
| 240 | } | 248 | } |
| 241 | 249 | ||
| ... | @@ -248,7 +256,7 @@ class VPVideoController extends TikTokVideoController<VideoPlayerController> { | ... | @@ -248,7 +256,7 @@ class VPVideoController extends TikTokVideoController<VideoPlayerController> { |
| 248 | if (_disposeLock != null) { | 256 | if (_disposeLock != null) { |
| 249 | await _disposeLock?.future; | 257 | await _disposeLock?.future; |
| 250 | } | 258 | } |
| 251 | - await this.controller.play(); | 259 | + await controller.play(); |
| 252 | _showPauseIcon.value = false; | 260 | _showPauseIcon.value = false; |
| 253 | } | 261 | } |
| 254 | 262 | ... | ... |
This diff is collapsed. Click to expand it.
-
Please register or login to post a comment