Flutter 退出回调处理程序在所有情况下都是跨平台的

问题描述 投票:0回答:3

我正在寻找一种方法在我的申请关闭之前处理一些最后的事情。我希望这种情况发生在网络关闭、本机窗口关闭和移动关闭时。

我以为我会这样做,但是 flutter 引擎拿走了我的小部件并结束了主要功能。

void main() {
  try {
    runApp(MyApp());
  }
  finally {
    customDisposeFunction(); // TODO: Oh no, this function is called right away!
  }
}

class MyApp extends StatelessWidget {
}

我也尝试过使用flutter_window_close,但是当我在 Visual Studio 代码中按下停止按钮时,它不会被释放。

我也尝试通过 ProcessSignal 观看,但这根本不是跨平台的。

我也尝试过将应用程序设为

StatefulWidget
,但是关闭窗口时不会调用
dispose
中的
State
(在Windows上)。

有一些好的方法来处理这个跨平台吗?

flutter dart sigterm
3个回答
0
投票

是的,因为这样写出来后,finally 就会直接命中。 相反,您应该尝试将其编写在主类的 dispose 方法中(尽管您必须使其有状态)


0
投票

您可以将您的

MyApp
设为
StatefulWidget
并覆盖其
dispose()
方法。


0
投票

特定于平台的解决方案:

对于网络:

在网络上,您可以监听 before-unload 事件来处理清理。

import 'dart:html' as html;

void main() {
  html.window.onBeforeUnload.listen((event) {
    customDisposeFunction();
  });
  runApp(MyApp());
}

桌面版(Windows/macOS/Linux):

如果您想在桌面上以更稳健的方式处理窗口关闭,您可以使用

window_manager
包(比
flutter_window_close
更稳健)。

import 'package:window_manager/window_manager.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await windowManager.ensureInitialized();
  
  windowManager.addListener(WindowListener(
    onWindowClose: () async {
      customDisposeFunction();
      windowManager.destroy();
    },
  ));

  runApp(MyApp());
}
© www.soinside.com 2019 - 2024. All rights reserved.