jhomlala / betterplayer

Better video player for Flutter, with multiple configuration options. Solving typical use cases!
Apache License 2.0
923 stars 999 forks source link

[BUG] reusable_video_list example fails on iOS #1044

Open qbait opened 2 years ago

qbait commented 2 years ago

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()
====================================================================================================
marioloko commented 2 years ago

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.

zhukeev commented 1 year ago

Any solutions there ?

basemkhirat commented 10 months ago

any fix

M97Chahboun commented 8 months ago

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;
}

here updated version

ProIEZRush1 commented 3 months ago

Anything on this?