You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在iOS平台以编程方式关闭Flutter应用?

Flutter iOS 编程式关闭应用解决方案

你用SystemNavigator.pop()在Android能正常关闭应用,但iOS上无效是因为iOS系统设计不允许应用主动退出,不过可以用以下两种方法实现需求:

方法一:使用dart:io的exit()方法

这是最直接的方式,强制终止应用进程,在iOS上可以生效。修改你的代码如下:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:io'; // 新增导入

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: GestureDetector(
              onTap: () {
                Future.delayed(const Duration(milliseconds: 2000), () {
                  // 替换为exit(0)实现强制退出
                  exit(0);
                  print('应用已关闭'); 
                });
              },
              child: Text('关闭应用')),
        ),
      ),
    );
  }
}

注意:exit(0)是强制退出行为,iOS的App Store审核可能会关注这类操作,建议仅在测试场景、特定业务流程等必要场景使用,普通场景尽量遵循iOS设计规范,让用户手动通过系统手势或Home键退出应用。

方法二:通过MethodChannel调用原生iOS代码(可选)

如果需要和原生交互,也可以通过通道调用原生代码触发退出,本质效果和exit()一致:

Flutter端代码

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

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

class MyApp extends StatelessWidget {
  static const platform = MethodChannel('com.example.app/exit');

  const MyApp({super.key});

  Future<void> _exitApp() async {
    try {
      await platform.invokeMethod('exit');
    } on PlatformException catch (e) {
      print("调用失败: ${e.message}");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: GestureDetector(
              onTap: () {
                Future.delayed(const Duration(milliseconds: 2000), _exitApp);
              },
              child: Text('关闭应用')),
        ),
      ),
    );
  }
}

iOS原生端代码(在AppDelegate.swift中添加)

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
    let exitChannel = FlutterMethodChannel(name: "com.example.app/exit", binaryMessenger: controller.binaryMessenger)
    exitChannel.setMethodCallHandler({
      (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
      if call.method == "exit" {
        exit(0)
      } else {
        result(FlutterMethodNotImplemented)
      }
    })
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

内容的提问来源于stack exchange,提问作者HMAD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 09:02:27