window_manager icon indicating copy to clipboard operation
window_manager copied to clipboard

[Bug] window_manager breaks AppLifecycleListener's onExitRequested

Open Merrit opened this issue 1 year ago • 4 comments

Having window_manager installed as a dependency breaks onExitRequested from Flutter's AppLifecycleListener.

Tested so far on Linux (Fedora 40 KDE, Wayland). Not sure of other platforms.

import 'dart:ui';

import 'package:flutter/material.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  final windowService = WindowService();

  runApp(const MainApp());
}

class MainApp extends StatelessWidget {
  const MainApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: Scaffold(
        body: Center(
          child: Text('Hello World!'),
        ),
      ),
    );
  }
}

class WindowService {
  late final AppLifecycleListener _appLifecycleListener;

  WindowService() {
    _appLifecycleListener = AppLifecycleListener(
      onExitRequested: _handleExitRequest,
    );
  }

  Future<AppExitResponse> _handleExitRequest() async {
    print('Exit requested');
    return AppExitResponse.cancel;
  }
}
  • Run the example, without window_manager as a dependency
  • Try to close the window, Exit requested is printed instead of it closing (expected behaviour)
  • Add window_manager as a dependency
  • Run the example again, and again try to close the window
  • Instead of printing Exit requested, the window closes with a message Lost connection to device. (unexpected behaviour)

Merrit avatar Jun 19 '24 17:06 Merrit

I'm getting the same issue on Windows

Levi-Lesches avatar Jul 02 '24 20:07 Levi-Lesches

+1 any workaround?

azlekov avatar Jul 04 '24 12:07 azlekov

I did not realize it, but window_manager ended up giving me exactly what I need anyway, in the form of windowManager.setPreventClose(true). I used that instead of AppLifecycleListener.onExitRequested and it works very well.

Levi-Lesches avatar Jul 04 '24 19:07 Levi-Lesches

Seems like onWindowClose isn't reliable, but if you check for eventName == 'close' in onWindowEvent along with setting setPreventClose(true), it works to manually handle closing the app as a workaround.

Merrit avatar Jul 26 '24 19:07 Merrit