androidflutterdartrelease

Why my flutter app works in debug mode but not after release


I have read some other topics in stackovwrflow with similar problems, But none is answered. So I'm asking here. I am developing an airhockey game using flutter in android studio. Everything is normal in debbuging mode. But when I build a release version, it's not working correctly.

Maybe this informations help:

I tested the app on a Xiaomi which uses android 4. In that device, sometimes the app will open. but most of the time only a black screen appears and nothing else. (about 70% of the time it fails.) An other device is a Samsung galaxy J7 with android 8. In that case, the black screen happens more. (about 90%). The third device is a Xiaomi POCO X3 Pro with android 11. In that case, I could not use the app for just a single time.

The libraries I used are:

'package:flutter/services.dart'
'dart:async'
'dart:math'

let me know if you need more information. By the way you can get code from github to look in case you need.


Solution

  • Before Fixing

    void main() {
      runApp(const MyApp());
    }
    

    Please change it to the Following:

    If your environment sdk: '>=2.x <3.0.0' you can use the following code:

    import 'dart:ui';
    
    Future<void> main() async {
      if (window.physicalSize.isEmpty) {
        window.onMetricsChanged = () {
          if (!window.physicalSize.isEmpty) {
            window.onMetricsChanged = null;
            runApp(const MyApp());
          }
        };
      } else {
        runApp(const MyApp());
      }
    }
    

    If your environment sdk: ^3.0.0 can use the following code:

    Future<void> main() async {
      FlutterView? flutterView = PlatformDispatcher.instance.views.firstOrNull;
      if (flutterView == null || flutterView.physicalSize.isEmpty) {
        PlatformDispatcher.instance.onMetricsChanged = () {
          flutterView = PlatformDispatcher.instance.views.firstOrNull;
          if (flutterView != null && !flutterView!.physicalSize.isEmpty) {
            PlatformDispatcher.instance.onMetricsChanged = null;
            runApp(const MyApp());
          }
        };
      } else {
        runApp(const MyApp());
      }
    }