betterplayer
betterplayer copied to clipboard
[BUG] reusable_video_list example fails on iOS
I run your reusable_video_list
sample without any changes on iOS simulator, and I'm getting the following error
======== Exception caught by rendering library =====================================================
The following assertion was thrown during paint():
RRect argument contained a NaN value.
'dart:ui/painting.dart':
Failed assertion: line 37 pos 10: '<optimized out>'
The relevant error-causing widget was:
BetterPlayer BetterPlayer:file:///Users/jakub/StudioProjects/betterplayer/example/lib/pages/reusable_video_list/reusable_video_list_widget.dart:135:25
When the exception was thrown, this was the stack:
#2 _rrectIsValid (dart:ui/painting.dart:37:10)
#3 Canvas.drawRRect (dart:ui/painting.dart:4516:12)
#4 _ProgressBarPainter.paint (package:better_player/src/controls/better_player_cupertino_progress_bar.dart:233:12)
#5 RenderCustomPaint._paintWithPainter (package:flutter/src/rendering/custom_paint.dart:563:13)
#6 RenderCustomPaint.paint (package:flutter/src/rendering/custom_paint.dart:605:7)
#7 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#8 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#9 _RenderColoredBox.paint (package:flutter/src/widgets/basic.dart:7510:15)
#10 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#11 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#12 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#13 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#14 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#15 RenderShiftedBox.paint (package:flutter/src/rendering/shifted_box.dart:79:15)
#16 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#17 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#18 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#19 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#20 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#21 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#22 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#23 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#24 RenderShiftedBox.paint (package:flutter/src/rendering/shifted_box.dart:79:15)
#25 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#26 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#27 RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2844:15)
#28 RenderFlex.paint (package:flutter/src/rendering/flex.dart:1078:7)
#29 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#30 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#31 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#32 RenderDecoratedBox.paint (package:flutter/src/rendering/proxy_box.dart:2191:11)
#33 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#34 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#35 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#36 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#37 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#38 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#39 PaintingContext.pushClipRRect.<anonymous closure> (package:flutter/src/rendering/object.dart:482:83)
#40 ClipContext._clipAndPaint (package:flutter/src/painting/clip.dart:29:12)
#41 ClipContext.clipRRectAndPaint (package:flutter/src/painting/clip.dart:49:5)
#42 PaintingContext.pushClipRRect (package:flutter/src/rendering/object.dart:482:7)
#43 RenderClipRRect.paint (package:flutter/src/rendering/proxy_box.dart:1551:25)
#44 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#45 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#46 RenderShiftedBox.paint (package:flutter/src/rendering/shifted_box.dart:79:15)
#47 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#48 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#49 RenderShiftedBox.paint (package:flutter/src/rendering/shifted_box.dart:79:15)
#50 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#51 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#52 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#53 PaintingContext.pushLayer (package:flutter/src/rendering/object.dart:387:12)
#54 PaintingContext.pushOpacity (package:flutter/src/rendering/object.dart:608:5)
#55 RenderAnimatedOpacityMixin.paint (package:flutter/src/rendering/proxy_box.dart:1008:23)
#56 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#57 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#58 RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2844:15)
#59 RenderFlex.paint (package:flutter/src/rendering/flex.dart:1078:7)
#60 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#61 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#62 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#63 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#64 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#65 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#66 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#67 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#68 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#69 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#70 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#71 RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2844:15)
#72 RenderStack.paintStack (package:flutter/src/rendering/stack.dart:611:5)
#73 RenderStack.paint (package:flutter/src/rendering/stack.dart:627:7)
#74 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#75 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#76 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#77 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#78 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#79 _RenderColoredBox.paint (package:flutter/src/widgets/basic.dart:7510:15)
#80 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#81 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#82 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#83 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#84 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#85 RenderShiftedBox.paint (package:flutter/src/rendering/shifted_box.dart:79:15)
#86 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#87 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#88 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#89 PaintingContext.pushLayer (package:flutter/src/rendering/object.dart:387:12)
#90 RenderVisibilityDetector.paint (package:visibility_detector/src/render_visibility_detector.dart:64:13)
#91 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#92 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#93 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#94 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#95 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#96 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#97 PaintingContext.pushLayer (package:flutter/src/rendering/object.dart:387:12)
#98 RenderVisibilityDetector.paint (package:visibility_detector/src/render_visibility_detector.dart:64:13)
#99 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#100 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#101 RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2844:15)
#102 RenderFlex.paint (package:flutter/src/rendering/flex.dart:1078:7)
#103 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#104 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#105 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#106 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#107 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#108 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#109 _RenderInkFeatures.paint (package:flutter/src/material/material.dart:598:11)
#110 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#111 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#112 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#113 RenderCustomPaint.paint (package:flutter/src/rendering/custom_paint.dart:608:11)
#114 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#115 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#116 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#117 PaintingContext.pushLayer (package:flutter/src/rendering/object.dart:387:12)
#118 RenderPhysicalShape.paint (package:flutter/src/rendering/proxy_box.dart:2050:15)
#119 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#120 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#121 RenderShiftedBox.paint (package:flutter/src/rendering/shifted_box.dart:79:15)
#122 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#123 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#124 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#125 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#126 PaintingContext.paintChild (package:flutter/src/rendering/object.dart:187:13)
#127 RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:140:15)
#128 RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2477:7)
#129 PaintingContext._repaintCompositedChild (package:flutter/src/rendering/object.dart:141:11)
#130 PaintingContext.repaintCompositedChild (package:flutter/src/rendering/object.dart:100:5)
#131 PipelineOwner.flushPaint (package:flutter/src/rendering/object.dart:995:29)
#132 RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:506:19)
#133 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:892:13)
#134 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:370:5)
#135 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1146:15)
#136 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1083:9)
#137 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:997:5)
#141 _invoke (dart:ui/hooks.dart:151:10)
#142 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:308:5)
#143 _drawFrame (dart:ui/hooks.dart:115:31)
(elided 5 frames from class _AssertionError and dart:async)
The following RenderObject was being processed when the exception was fired: RenderCustomPaint#b5908
... parentData: <none> (can use size)
... constraints: BoxConstraints(w=97.8, h=48.0)
... size: Size(97.8, 48.0)
... painter: _ProgressBarPainter#d43d7()
RenderObject: RenderCustomPaint#b5908
parentData: <none> (can use size)
constraints: BoxConstraints(w=97.8, h=48.0)
size: Size(97.8, 48.0)
painter: _ProgressBarPainter#d43d7()
====================================================================================================
This error occurs also to me, it happens when drawing the progress bar. It computes the progress bar as:
for (final DurationRange range in value.buffered) {
final double start = range.startFraction(value.duration!) * size.width;
final double end = range.endFraction(value.duration!) * size.width;
canvas.drawRRect(
RRect.fromRectAndRadius(
Rect.fromPoints(
Offset(start, baseOffset),
Offset(end, baseOffset + barHeight),
),
const Radius.circular(4.0),
),
colors.bufferedPaint,
);
}
The problem is caused because start
is NaN
. So if we dig into the implementation of startFraction(duration)
we find this.
double startFraction(Duration duration) {
return start.inMilliseconds / duration.inMilliseconds;
}
So, what is the problem, the problem is that some times (I don't know why yet), the reported video duration is 00:00:00
, so in that case the division is a division by 0, which returns 0.
So next step is to try to find why is the video reporting a 00:00:00
video duration.
Any solutions there ?
any fix
I implemented minor fix for it by:
double startFraction(Duration duration) {
if (start.inMicroseconds == 0 || duration.inMilliseconds == 0) return 0.0;
return start.inMilliseconds / duration.inMilliseconds;
}