Showing
7 changed files
with
72 additions
and
26 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(); |
47 | - print('暂停$oldIndex'); | 48 | + if (kDebugMode) { |
49 | + print('暂停$oldIndex'); | ||
50 | + } | ||
48 | } | 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(); |
53 | - print('播放$newIndex'); | 56 | + if (kDebugMode) { |
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) { |
58 | - print('释放$i'); | 63 | + if (kDebugMode) { |
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) { |
65 | - print('预加载$i'); | 72 | + if (kDebugMode) { |
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