From bc17019baa61084bb7fcb6e0f52e8d8a881f314c Mon Sep 17 00:00:00 2001 From: Alex Li Date: Fri, 21 Jul 2023 11:00:55 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Be=20able=20to=20update=20?= =?UTF-8?q?items=20builder=20page=20(#417)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves #416. --- CHANGELOG.md | 7 +++- .../widget/builder/audio_page_builder.dart | 39 +++++++++++++------ .../widget/builder/image_page_builder.dart | 14 +++++++ .../builder/locally_available_builder.dart | 11 ++++++ .../widget/builder/video_page_builder.dart | 18 +++++++++ 5 files changed, 77 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8ef45a1..661ef4d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,12 @@ that can be found in the LICENSE file. --> ### New features - Sync all UI details from WeChat 8.3.x. (#458) -- Fix semantics interactions for videos preview. (#458) +- Add Turkish language text delegate. (#331). + +### Fixes + +- Fix semantics interactions for video preview. (#458) +- Be able to update the items builder page. (#417) ## 8.5.0 diff --git a/lib/src/widget/builder/audio_page_builder.dart b/lib/src/widget/builder/audio_page_builder.dart index f02a6728..f026e968 100644 --- a/lib/src/widget/builder/audio_page_builder.dart +++ b/lib/src/widget/builder/audio_page_builder.dart @@ -32,7 +32,8 @@ class _AudioPageBuilderState extends State { /// Create a [VideoPlayerController] instance for the page builder state. /// 创建一个 [VideoPlayerController] 的实例 - late final VideoPlayerController _controller; + VideoPlayerController get controller => _controller!; + VideoPlayerController? _controller; /// Whether the audio loaded. /// 音频是否已经加载完成 @@ -44,11 +45,11 @@ class _AudioPageBuilderState extends State { /// Whether the controller is playing. /// 播放控制器是否在播放 - bool get isControllerPlaying => _controller.value.isPlaying; + bool get isControllerPlaying => _controller?.value.isPlaying == true; /// Duration of the audio. /// 音频的时长 - late final Duration assetDuration; + Duration assetDuration = Duration.zero; @override void initState() { @@ -56,14 +57,30 @@ class _AudioPageBuilderState extends State { openAudioFile(); } + @override + void didUpdateWidget(AudioPageBuilder oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.asset != oldWidget.asset) { + _controller + ?..removeListener(audioPlayerListener) + ..pause() + ..dispose(); + isLoaded = false; + isPlaying = false; + assetDuration = Duration.zero; + openAudioFile(); + } + } + @override void dispose() { /// Stop and dispose player instance to stop playing /// when dispose (e.g. page switched). /// 状态销毁时停止并销毁实例(例如页面切换时) - _controller.pause(); - _controller.removeListener(audioPlayerListener); - _controller.dispose(); + _controller + ?..removeListener(audioPlayerListener) + ..pause() + ..dispose(); super.dispose(); } @@ -74,8 +91,8 @@ class _AudioPageBuilderState extends State { final String? url = await widget.asset.getMediaUrl(); assetDuration = Duration(seconds: widget.asset.duration); _controller = VideoPlayerController.networkUrl(Uri.parse(url!)); - await _controller.initialize(); - _controller.addListener(audioPlayerListener); + await controller.initialize(); + controller.addListener(audioPlayerListener); } catch (e) { realDebugPrint('Error when opening audio file: $e'); } finally { @@ -97,14 +114,14 @@ class _AudioPageBuilderState extends State { } /// Add the current position into the stream. - durationStreamController.add(_controller.value.position); + durationStreamController.add(controller.value.position); } void playButtonCallback() { if (isPlaying) { - _controller.pause(); + controller.pause(); } else { - _controller.play(); + controller.play(); } } diff --git a/lib/src/widget/builder/image_page_builder.dart b/lib/src/widget/builder/image_page_builder.dart index d75eb4ab..6efc5b5b 100644 --- a/lib/src/widget/builder/image_page_builder.dart +++ b/lib/src/widget/builder/image_page_builder.dart @@ -41,6 +41,19 @@ class _ImagePageBuilderState extends State { bool get _isLivePhoto => widget.asset.isLivePhoto; + @override + void didUpdateWidget(ImagePageBuilder oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.asset != oldWidget.asset || + widget.previewThumbnailSize != oldWidget.previewThumbnailSize) { + _isLocallyAvailable = false; + _controller + ?..pause() + ..dispose(); + _controller = null; + } + } + @override void dispose() { _controller?.dispose(); @@ -153,6 +166,7 @@ class _ImagePageBuilderState extends State { @override Widget build(BuildContext context) { return LocallyAvailableBuilder( + key: ValueKey(widget.asset.id), asset: widget.asset, isOriginal: _isOriginal, builder: (BuildContext context, AssetEntity asset) { diff --git a/lib/src/widget/builder/locally_available_builder.dart b/lib/src/widget/builder/locally_available_builder.dart index f42cd1de..1f32e91e 100644 --- a/lib/src/widget/builder/locally_available_builder.dart +++ b/lib/src/widget/builder/locally_available_builder.dart @@ -38,6 +38,17 @@ class _LocallyAvailableBuilderState extends State { _checkLocallyAvailable(); } + @override + void didUpdateWidget(LocallyAvailableBuilder oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.asset != oldWidget.asset || + widget.isOriginal != oldWidget.isOriginal) { + _isLocallyAvailable = false; + _progressHandler = null; + _checkLocallyAvailable(); + } + } + Future _checkLocallyAvailable() async { _isLocallyAvailable = await widget.asset.isLocallyAvailable( isOrigin: widget.isOriginal, diff --git a/lib/src/widget/builder/video_page_builder.dart b/lib/src/widget/builder/video_page_builder.dart index cf9d706d..9a2825cf 100644 --- a/lib/src/widget/builder/video_page_builder.dart +++ b/lib/src/widget/builder/video_page_builder.dart @@ -61,6 +61,23 @@ class _VideoPageBuilderState extends State { bool _isInitializing = false; bool _isLocallyAvailable = false; + @override + void didUpdateWidget(VideoPageBuilder oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.asset != oldWidget.asset) { + _controller + ?..removeListener(videoPlayerListener) + ..pause() + ..dispose(); + _controller = null; + hasLoaded = false; + hasErrorWhenInitializing = false; + isPlaying.value = false; + _isInitializing = false; + _isLocallyAvailable = false; + } + } + @override void dispose() { /// Remove listener from the controller and dispose it when widget dispose. @@ -194,6 +211,7 @@ class _VideoPageBuilderState extends State { @override Widget build(BuildContext context) { return LocallyAvailableBuilder( + key: ValueKey(widget.asset.id), asset: widget.asset, builder: (BuildContext context, AssetEntity asset) { if (hasErrorWhenInitializing) {