Flutter命令行交互插件interact_cli的功能使用

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

Flutter命令行交互插件 interact_cli 的功能使用

interact_cli 是一个用于 Dart/Flutter 项目的命令行交互库,提供了多种可定制的交互组件,如输入框、选择器、进度条等。本文将详细介绍该库的主要功能及使用方法,并提供完整的示例代码。

概述

interact_cli 提供了丰富的命令行交互组件,包括文本输入、密码输入、单选、多选、进度条等。每个组件都支持自定义主题和异常处理。以下是一些常用组件的示例:

安装

pubspec.yaml 文件中添加 interact 依赖:

dependencies:
  interact: ^latest_version

然后运行 flutter pub get 来安装依赖。

API 文档

组件

Confirm 组件

Confirm 组件用于获取用户的确认信息(是或否),并返回布尔值。

import 'package:interact/interact.dart';

void main() async {
  final answer = Confirm(
    prompt: 'Does it work?',
    defaultValue: true, // 可选,默认为 false
    waitForNewLine: true, // 可选,默认为 false
  ).interact();

  print('User answered: $answer');
}

Input 组件

Input 组件用于获取用户输入的字符串,并可以进行验证。

import 'package:interact/interact.dart';

void main() async {
  final email = Input(
    prompt: 'Your email',
    validator: (String x) {
      if (x.contains('@')) {
        return true;
      } else {
        throw ValidationError('Not a valid email');
      }
    },
  ).interact();

  print('Email entered: $email');
}

Password 组件

Password 组件用于获取用户输入的密码,并隐藏输入内容。

import 'package:interact/interact.dart';

void main() async {
  final password = Password(
    prompt: 'Password',
    confirmation: true, // 可选,默认为 false
    confirmPrompt: 'Repeat password', // 可选
    confirmError: 'Passwords do not match', // 可选
  ).interact();

  print('Password entered successfully.');
}

Select 组件

Select 组件用于让用户从多个选项中选择一个。

import 'package:interact/interact.dart';

void main() async {
  final languages = ['Rust', 'Dart', 'TypeScript'];
  final selection = Select(
    prompt: 'Your favorite programming language',
    options: languages,
  ).interact();

  print('Selected language: ${languages[selection]}');
}

MultiSelect 组件

MultiSelect 组件允许用户选择多个选项。

import 'package:interact/interact.dart';

void main() async {
  final answers = MultiSelect(
    prompt: 'Let me know your answers',
    options: ['A', 'B', 'C'],
    defaults: [false, true, false], // 可选,默认全为 false
  ).interact();

  print('Selected options: ${answers.map((index) => 'ABC'[index])}');
}

Sort 组件

Sort 组件用于让用户对给定列表进行排序。

import 'package:interact/interact.dart';

void main() async {
  final sorted = Sort(
    prompt: 'Sort Tesla models from favorite to least',
    options: ['S', '3', 'X', 'Y'],
    showOutput: false, // 可选,默认为 false
  ).interact();

  print('Sorted list: $sorted');
}

Spinner 和 MultiSpinner 组件

Spinner 组件用于显示一个加载指示器,直到调用 done() 方法。

import 'package:interact/interact.dart';
import 'dart:async';

void main() async {
  final gift = Spinner(
    icon: '🏆',
    leftPrompt: (done) => '',
    rightPrompt: (state) {
      switch (state) {
        case SpinnerStateType.inProgress:
          return 'Processing...';
        case SpinnerStateType.done:
          return 'Done!';
        case SpinnerStateType.failed:
          return 'Failed!';
      }
    },
  ).interact();

  await Future.delayed(const Duration(seconds: 5));
  gift.done();
}

Progress 和 MultiProgress 组件

Progress 组件用于显示进度条。

import 'package:interact/interact.dart';
import 'dart:async';

void main() async {
  final progress = Progress(
    length: 1000,
    size: 0.5, // 可选,默认为 1
    rightPrompt: (current) => ' ${current.toString().padLeft(3)}/1000',
  ).interact();

  for (var i = 0; i < 500; i++) {
    await Future.delayed(const Duration(milliseconds: 5));
    progress.increase(2);
  }

  progress.done();
}

自定义主题

你可以通过 withTheme 构造函数来自定义组件的主题。

import 'package:interact/interact.dart';

void main() async {
  final progress = Progress.withTheme(
    theme: Theme.basicTheme.copyWith(
      activeItemPrefix: '👉',
      activeItemStyle: (x) => x.yellow().underline(),
    ),
    length: 1000,
    rightPrompt: (current) => ' ${current.toString().padLeft(3)}/1000',
  ).interact();

  for (var i = 0; i < 500; i++) {
    await Future.delayed(const Duration(milliseconds: 5));
    progress.increase(2);
  }

  progress.done();
}

异常处理

当程序抛出异常时,确保捕获异常并调用 reset() 函数来重置终端状态。

import 'package:interact/interact.dart';

void main() async {
  try {
    Spinner(icon: '🚨').interact();
    throw Exception(); // spinner couldn't finish
  } catch (e) {
    reset(); // Reset everything to terminal defaults
    rethrow;
  }
}

示例项目

更多示例可以参考官方仓库中的 example 目录。例如,可以通过以下命令查看 Select 组件的示例:

dart example/select.dart

希望这些示例能帮助你更好地理解和使用 interact_cli 插件!


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用interact_cli插件来实现命令行交互功能的示例代码。请注意,interact_cli并非一个官方或广泛认可的Flutter插件,所以我将假设它是一个自定义的或假设的插件,其功能是通过命令行与用户进行交互。

首先,确保你已经在pubspec.yaml文件中添加了interact_cli依赖(假设它存在于pub.dev上或你的本地路径中):

dependencies:
  flutter:
    sdk: flutter
  interact_cli: ^1.0.0  # 假设版本号为1.0.0,根据实际情况修改

然后运行flutter pub get来安装依赖。

接下来,我们编写一个简单的Flutter应用,展示如何使用interact_cli插件。

import 'package:flutter/material.dart';
import 'package:interact_cli/interact_cli.dart';  // 假设这是插件的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Interact CLI Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _commandOutput = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Interact CLI Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Command Output:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 16),
            Text(
              _commandOutput,
              style: TextStyle(fontSize: 16),
            ),
            SizedBox(height: 32),
            ElevatedButton(
              onPressed: _execCommand,
              child: Text('Execute Command'),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> _execCommand() async {
    setState(() {
      _commandOutput = 'Executing command...';
    });

    try {
      // 假设interactCli是一个InteractCli类的实例,提供了execute方法
      final InteractCli interactCli = InteractCli();
      String result = await interactCli.execute('your-command-here');
      
      setState(() {
        _commandOutput = 'Command Output: $result';
      });
    } catch (e) {
      setState(() {
        _commandOutput = 'Error: ${e.toString()}';
      });
    }
  }
}

// 假设的InteractCli类定义(通常这个类会在interact_cli插件中定义)
class InteractCli {
  Future<String> execute(String command) async {
    // 这里应该是执行命令并与命令行交互的逻辑
    // 例如,使用Dart的Process类来运行系统命令
    ProcessResult result = await Process.run(command.split(' ')[0], command.split(' ').sublist(1));
    return result.stdout;
  }
}

注意

  1. 上面的代码假设InteractCli类有一个execute方法,该方法接受一个命令字符串并返回命令的输出。实际上,interact_cli插件的API可能会有所不同,所以你需要参考插件的官方文档来调整代码。
  2. Process.run用于在Dart中执行系统命令。在Flutter的桌面或命令行应用中,这种方法是可行的,但在移动应用中,出于安全考虑,直接执行系统命令通常是不被允许的。
  3. 由于interact_cli可能是一个虚构的插件,因此上面的InteractCli类是一个假设的实现。在实际使用中,你需要根据插件的实际API来调整代码。

希望这个示例能帮助你理解如何在Flutter项目中使用命令行交互插件。如果你有任何进一步的问题或需要关于特定插件的帮助,请提供更多细节。

回到顶部