优雅关闭

当 Flutter 应用关闭时,Rust 侧的整个异步运行时默认不会被丢弃。

在某些情况下,您可能需要在关闭应用之前正确地释放所有 Rust 资源。这可能包括实现了 Drop trait 的结构体实例,这些实例负责保存文件或释放资源等任务。

为此,您可以使用 Flutter 的 AppLifecycleListener,在关闭 Flutter 应用之前调用 finalizeRust 函数。

lib/main.dart
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:rinf/rinf.dart';

class MyApp extends StatefulWidget {
  const MyApp({super.key});
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late final AppLifecycleListener _listener;

  @override
  void initState() {
    super.initState();
    _listener = AppLifecycleListener(
      onExitRequested: () async {
        finalizeRust(); // 关闭异步 Rust 运行时。
        return AppExitResponse.exit;
      },
    );
  }

  @override
  void dispose() {
    _listener.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // 返回一个 widget。
  }
}

值得注意的是,AppLifecycleListener 在应用关闭时并不总是可靠的。以下是引自官方 Flutter 文档 的一段文字:

无法预测应用何时会终止。例如,用户的电池可能起火,或者用户可能将设备掉入游泳池,或者操作系统可能因内存压力而单方面终止应用进程。应用有责任确保即使面对快速、计划外的终止,也能保持良好的行为。