Flutter命令行工具插件cli_tools的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter命令行工具插件cli_tools的使用

标题

CLI Tools

内容

这个包包含用于构建优秀命令行界面的工具。这些工具最初为Serverpod CLI开发,但可以在任何Dart项目中使用。

示例代码

import 'package:cli_tools/cli_tools.dart';

void main() async {
  /// 简单示例,使用[StdOutLogger]类。
  var logger = StdOutLogger(LogLevel.info);

  logger.info('An info message');
  logger.error('An error message');
  logger.debug(
    'A debug message that will not be shown because log level is info',
  );
  await logger.progress(
    'A progress message',
    () async => Future.delayed(
      const Duration(seconds: 3),
      () =&gt true,
    ),
  );
}

使用说明

1 package:cli_tools; import ‘package:cli_tools/cli_tools.dart’;

在你的Dart项目中,首先需要导入cli_tools包。然后你可以创建一个StdOutLogger实例来记录信息、错误和调试消息。此外,你还可以使用progress方法来显示进度条。

void main() async {
  var logger = StdOutLogger(LogLevel.info);
  
  logger.info('An info message');
  logger.error('An error message');
  logger.debug(
    'A debug message that will not be shown because log level is info',
  );
  await logger.progress(
    'A progress message',
    () async => Future.delayed(
      const Duration(seconds: 3),
      () =&gt true,
    ),
  );
}

更多关于Flutter命令行工具插件cli_tools的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter命令行工具插件cli_tools的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter命令行工具插件 cli_tools 的使用,下面是一个基本的示例代码案例,展示了如何在Flutter项目中集成并使用一个自定义的命令行工具插件。请注意,由于Flutter本身并没有一个官方的名为 cli_tools 的插件,这里的示例将假设我们创建了一个简单的命令行工具插件,名为 cli_tools

1. 创建Flutter插件

首先,我们需要在Flutter项目中创建一个插件。你可以使用Flutter提供的插件模板生成器:

flutter create --template=plugin cli_tools

这将创建一个名为 cli_tools 的Flutter插件项目。

2. 实现插件功能

在插件的 lib/cli_tools.dart 文件中,我们定义一个简单的类来执行命令行操作。例如,我们可以创建一个方法来运行系统命令并返回结果。

// cli_tools/lib/cli_tools.dart
import 'dart:io';
import 'package:flutter/services.dart';

class CliTools {
  static const MethodChannel _channel = const MethodChannel('cli_tools');

  // 调用原生代码执行命令
  static Future<String> executeCommand(String command) async {
    final result = await _channel.invokeMethod('executeCommand', command);
    return result as String;
  }
}

3. 在原生代码中实现命令执行

iOS

ios/Classes/CliToolsPlugin.m 文件中,添加对 executeCommand 方法的实现:

// cli_tools/ios/Classes/CliToolsPlugin.m
#import "CliToolsPlugin.h"
#import <Flutter/Flutter.h>

@implementation CliToolsPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
    FlutterMethodChannel* channel = [FlutterMethodChannel
                                     methodChannelWithName:@"cli_tools"
                                     binaryMessenger:[registrar messenger]];
    CliToolsPlugin *instance = [[CliToolsPlugin alloc] init];
    [channel setMethodCallHandler:[instance onMethodCall:error:]];
}

- (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
  if ([@"executeCommand" isEqualToString:call.method]) {
    NSString *command = call.arguments;
    NSString *output = [self runCommand:command];
    result(output);
  } else {
    result(FlutterMethodNotImplemented);
  }
}

- (NSString *)runCommand:(NSString *)command {
    NSTask *task = [[NSTask alloc] init];
    [task setLaunchPath:@"/bin/bash"];
    
    NSArray *arguments = @[@"-c", command];
    [task setArguments:arguments];
    
    NSPipe *pipe = [NSPipe pipe];
    [task setStandardOutput:pipe];
    
    [task launch];
    
    NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile];
    NSString *output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    
    return output;
}
@end

Android

android/src/main/kotlin/com/example/cli_tools/CliToolsPlugin.kt 文件中,添加对 executeCommand 方法的实现:

// cli_tools/android/src/main/kotlin/com/example/cli_tools/CliToolsPlugin.kt
package com.example.cli_tools

import android.content.Context
import androidx.annotation.NonNull
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import java.io.BufferedReader
import java.io.InputStreamReader

class CliToolsPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
  private var channel: MethodChannel? = null
  private var context: Context? = null

  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPluginBinding) {
    channel = MethodChannel(flutterPluginBinding.binaryMessenger, "cli_tools")
    channel?.setMethodCallHandler(this)
    context = flutterPluginBinding.applicationContext
  }

  override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
    if (call.method == "executeCommand") {
      val command = call.argument<String>("command") ?: ""
      val output = executeCommand(command)
      result.success(output)
    } else {
      result.notImplemented()
    }
  }

  override fun onDetachedFromEngine(@NonNull binding: FlutterPluginBinding) {
    channel?.setMethodCallHandler(null)
    channel = null
  }

  private fun executeCommand(command: String): String {
    val process = Runtime.getRuntime().exec(command)
    val reader = BufferedReader(InputStreamReader(process.inputStream))
    val sb = StringBuilder()
    var line: String?
    while (reader.readLine().also { line = it } != null) {
      sb.append(line).append("\n")
    }
    return sb.toString()
  }

  override fun onAttachedToActivity(binding: ActivityPluginBinding) {}

  override fun onDetachedFromActivityForConfigChanges() {}

  override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {}

  override fun onDetachedFromActivity() {}
}

4. 在Flutter应用中使用插件

最后,在你的Flutter项目中添加对 cli_tools 插件的依赖,并在代码中使用它。

首先,在 pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  cli_tools:
    path: ../cli_tools  # 指向你的插件路径

然后,在你的Flutter应用代码中使用插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Cli Tools Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              String command = "ls -l"; // 示例命令
              String result = await CliTools.executeCommand(command);
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(
                  content: Text("Command Output:\n$result"),
                ),
              );
            },
            child: Text('Run Command'),
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何创建一个简单的命令行工具插件,并在Flutter应用中使用它。你可以根据需要扩展这个插件的功能,比如添加错误处理、支持更多的命令等。

回到顶部