flutter_screenutil icon indicating copy to clipboard operation
flutter_screenutil copied to clipboard

[5.5.3+2] ScreenUtil.ensureScreenSize() randomly produces a Stack Overflow exception

Open scottinet opened this issue 3 years ago • 3 comments

Report

ScreenUtil version: 5.5.3+2 OS: Android (did not test on iOS yet) Environment: reproduced in debug sessions, I cannot say for sure that this cannot happen in release builds Reproducable: yes, but it's random, and not very common

Context: I don't know if this is relevant (see below), but my app is an hybrid android/flutter app with a pre-warmed flutter engine. This error occurs when starting a flutter activity for the first time.

Minimum code to reproduce:

void main() async {
  await ScreenUtil.ensureScreenSize();
  runApp(FooApp());
}

Stacktrace:

[ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Stack Overflow
    #0      _completeOnAsyncError (dart:async-patch/async_patch.dart:266:1)
    #1      ScreenUtil.ensureScreenSize.<anonymous closure> (package:flutter_screenutil/src/screen_util.dart)
    #2      _rootRunUnary (dart:async/zone.dart:1434:47)
    #3      _CustomZone.runUnary (dart:async/zone.dart:1335:19)
    #4      _FutureListener.handleValue (dart:async/future_impl.dart:159:18)
    #5      Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:766:45)
    #6      Future._propagateToListeners (dart:async/future_impl.dart:795:13)
    #7      Future._completeWithValue (dart:async/future_impl.dart:601:5)
    #8      _completeOnAsyncReturn (dart:async-patch/async_patch.dart:262:13)
    #9      ScreenUtil.ensureScreenSize.<anonymous closure> (package:flutter_screenutil/src/screen_util.dart)
    #10     _rootRunUnary (dart:async/zone.dart:1434:47)
    #11     _CustomZone.runUnary (dart:async/zone.dart:1335:19)
    #12     _FutureListener.handleValue (dart:async/future_impl.dart:159:18)
    #13     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:766:45)
    #14     Future._propagateToListeners (dart:async/future_impl.dart:795:13)
    #15     Future._completeWithValue (dart:async/future_impl.dart:601:5)
    #16     _completeOnAsyncReturn (dart:async-patch/async_patch.dart:262:13)
    #17     ScreenUtil.ensureScreenSize.<anonymous closure> (package:flutter_screenutil/src/screen_util.dart)
    #18     _rootRunUnary (dart:async/zone.dart:1434:47)
    #19     _CustomZone.runUnary (dart:async/zone.dart:1335:19)
    #20     _FutureListener.handleValue (dart:async/future_impl.dart:159:18)
    #21     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:766:45)
    #22     Future._propagateToListeners (dart:async/future_impl.dart:795:13)
    #23     Future._completeWithValue (dart:async/future_impl.dart:601:5)
    #24     _completeOnAsyncReturn (dart:async-patch/async_patch.dart:262:13)
    #25     ScreenUtil.ensureScreenSize.<anonymous closure> (package:flutter_screenutil/src/screen_util.dart)
    #26     _rootRunUnary (dart:async/zone.dart:1434:47)
    #27     _CustomZone.runUnary (dart:async/zone.dart:1335:19)
    #28     _FutureListener.handleValue (dart:async/future_impl.dart:159:18)
    #29     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:766:45)
    #30     Future._propagateToListeners (dart:async/future_impl.dart:795:13)
    #31     Future._completeWithValue (dart:async/future_impl.dart:601:5)
    #32     _completeOnAsyncReturn (dart:async-patch/async_patch.dart:262:13)
    #33     ScreenUtil.ensureScreenSize.<anonymous closure> (package:flutter_screenutil/src/screen_util.dart)
    #34     _rootRunUnary (dart:async/zone.dart:1434:47)
    #35     _CustomZone.runUnary (dart:async/zone.dart:1335:19)
    #36     _FutureListener.handleValue (dart:async/future_impl.dart:159:18)
    #37     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:766:45)
    #38     Future._propagateToListeners (dart:async/future_impl.dart:795:13)
    ...
    ...
    #8230   _completeOnAsyncReturn (dart:async-patch/async_patch.dart:262:13)
    #8231   ScreenUtil.ensureScreenSize.<anonymous closure> (package:flutter_screenutil/src/screen_util.dart)
    #8232   _rootRunUnary (dart:async/zone.dart:1434:47)
    #8233   _CustomZone.runUnary (dart:async/zone.dart:1335:19)
    #8234   _FutureListener.handleValue (dart:async/future_impl.dart:159:18)
    #8235   Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:766:45)
    #8236   Future._propagateToListeners (dart:async/future_impl.dart:795:13)
    #8237   Future._completeWithValue (dart:async/future_impl.dart:601:5)
    #8238   _completeOnAsyncReturn (dart:async-patch/async_patch.dart:262:13)
    #8239   ScreenUtil.ensureScreenSize.<anonymous closure> (package:flutter_screenutil/src/screen_util.dart)
    #8240   _rootRunUnary (dart:async/zone.dart:1434:47)
    #8241   _CustomZone.runUnary (dart:async/zone.dart:1335:19)
    #8242   _FutureListener.handleValue (dart:async/future_impl.dart:159:18)

Analysis & workaround

It obviously comes from https://github.com/OpenFlutter/flutter_screenutil/blob/master/lib/src/screen_util.dart#L65 : if the app takes too much time to initialize its rendering environment, the ensureScreenSize performs too many iterations, or rather, too many recursive calls to itself.

In the meantime, I've added this in my code as a workaround:

  final binding = WidgetsFlutterBinding.ensureInitialized();
  final FlutterWindow window = binding.window;
  while (window.viewConfiguration.geometry.isEmpty) {
    await Future.delayed(const Duration(milliseconds: 10));
  }

  await ScreenUtil.ensureScreenSize();

scottinet avatar May 30 '22 07:05 scottinet

This issue is stale because it has been open for 30 days with no activity.

github-actions[bot] avatar Jun 30 '22 02:06 github-actions[bot]

Thanks, we'll work on it.

Mounir-Bouaiche avatar Jul 08 '22 12:07 Mounir-Bouaiche

This issue is stale because it has been open for 30 days with no activity.

github-actions[bot] avatar Aug 08 '22 02:08 github-actions[bot]

This issue was closed because it has been inactive for 14 days since being marked as stale.

github-actions[bot] avatar Aug 22 '22 02:08 github-actions[bot]