Flutter系统退出码管理插件sysexits的使用

Flutter系统退出码管理插件sysexits的使用

此库是从 <sysexits.h> 引入的端口,旨在促进退出码的标准使用。

使用

该库提供了一些常量,这些常量最初在 <sysexits.h> 中定义,并且可以与 dart:io exit()dart:io exitCode 一起使用。

import 'dart:io';
import 'package:sysexits/sysexits.dart';

void printUsage() {
  print('Usage:');
  print('-h, --[no-]help    显示帮助');
}

void main(List<String> argv) {
  exitCode = EX_OK; // 预设成功

  for (String arg in argv) {
    switch(arg) {
      case '-h':
      case '--help':
        printUsage();
        exit(EX_OK);
      default:
        printUsage();
        exit(EX_USAGE);
    }
  }

  print('执行一些操作');
}

更多关于Flutter系统退出码管理插件sysexits的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter系统退出码管理插件sysexits的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中,如果你需要管理系统退出码,sysexits 是一个非常有用的库,特别是在原生代码(如 Dart 以外的 C/C++ 代码)中处理系统退出状态码时。不过需要注意的是,sysexits 本身是一个传统的 UNIX 库,不是直接为 Flutter 或 Dart 设计的。为了在 Flutter 中使用类似的功能,我们通常会通过平台通道(Platform Channels)与原生代码进行交互。

下面是一个如何在 Flutter 项目中通过平台通道与原生代码交互,模拟 sysexits 功能的基本示例。这里我们将展示如何在 Android 和 iOS 原生代码中定义一些退出码,并通过平台通道将这些退出码传递到 Flutter 层。

1. 设置 Flutter 项目

首先,创建一个新的 Flutter 项目(如果你还没有的话):

flutter create flutter_sysexits_example
cd flutter_sysexits_example

2. 在原生代码中定义退出码

Android (Kotlin)

android/app/src/main/kotlin/.../MainActivity.kt 中添加退出码和平台通道代码:

package com.example.flutter_sysexits_example

import android.os.Bundle
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity: FlutterActivity() {
    private val CHANNEL = "com.example.flutter_sysexits_example/channel"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "getExitCode") {
                when (call.argument<String>("reason")) {
                    "EXIT_SUCCESS" -> result.success(0) // 成功退出
                    "EXIT_FAILURE" -> result.success(1) // 一般错误
                    "EXIT_USAGE" -> result.success(64) // 命令行使用错误
                    else -> result.error("INVALID_REASON", "Invalid exit reason provided", null)
                }
            } else {
                result.notImplemented()
            }
        }
    }
}

iOS (Swift)

ios/Runner/AppDelegate.swift 中添加退出码和平台通道代码:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)

    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
    let channel = FlutterMethodChannel(name: "com.example.flutter_sysexits_example/channel", binaryMessenger: controller.binaryMessenger)
    channel.setMethodCallHandler({
      (call: FlutterMethodCall, result: @escaping FlutterResult) in
      if call.method == "getExitCode" {
        if let reason = call.arguments as? String {
          switch reason {
          case "EXIT_SUCCESS":
            result(0) // 成功退出
          case "EXIT_FAILURE":
            result(1) // 一般错误
          case "EXIT_USAGE":
            result(64) // 命令行使用错误
          default:
            result(FlutterError(code: "INVALID_REASON", message: "Invalid exit reason provided", details: nil))
          }
        } else {
          result(FlutterError(code: "INVALID_REASON", message: "Invalid arguments", details: nil))
        }
      } else {
        result(FlutterMethodNotImplementedError(methodName: call.method))
      }
    })
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

3. 在 Dart 代码中调用原生方法

lib/main.dart 中,设置平台通道并调用原生定义的退出码:

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

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

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

  Future<void> _getExitCode(String reason) async {
    try {
      final int exitCode = await platform.invokeMethod('getExitCode', reason);
      print("Exit code for $reason: $exitCode");
    } on PlatformException catch (e) {
      print("Failed to get exit code: '${e.message}'.");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Sysexits Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () => _getExitCode('EXIT_SUCCESS'),
                child: Text('Success Exit'),
              ),
              ElevatedButton(
                onPressed: () => _getExitCode('EXIT_FAILURE'),
                child: Text('Failure Exit'),
              ),
              ElevatedButton(
                onPressed: () => _getExitCode('EXIT_USAGE'),
                child: Text('Usage Exit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

4. 运行项目

确保所有文件保存后,运行 Flutter 项目:

flutter run

现在,你应该能够在 Flutter 应用中看到三个按钮,分别对应不同的退出码。点击按钮时,应用将通过平台通道从原生代码获取相应的退出码,并在控制台中打印出来。

这个示例展示了如何在 Flutter 项目中模拟 sysexits 功能,通过平台通道与原生代码交互来获取系统退出码。虽然 sysexits 库本身不是为 Flutter 设计的,但这种方法可以让你在 Flutter 应用中利用类似的退出码管理机制。

回到顶部