Flutter Git操作扩展插件gits_extension的使用

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

Flutter Git操作扩展插件gits_extension的使用

Gits Extension

gits_extension 是一个从 dartx 扩展而来,并且导入了 time 包的 Flutter 插件。它提供了许多实用的功能来简化开发过程。

Scope Functions

.run

.run 方法调用指定的函数 block 并以当前值为接收者返回其结果。

String? getValue() => '1';
final value = getValue();

value?.run((it) => print(it)); // 输出 "1"

.let

.let 方法调用指定的函数 block 并以当前值作为参数返回其结果。

String? getValue() => '1';
final value = getValue();
final let = value?.let((it) => int.parse(it)); // 1 (int)

print(let); // 输出 "1"

.also

.also 方法调用指定的函数 block 并以当前值作为参数返回 block 的值。

String? getValue() => '1';
final value = getValue();
int itValue = 0;
final also = value?.also((it) {
    itValue = int.parse(it);
});

print(also);        // 输出 "1" (String)
print(itValue);     // 输出 "1" (int)

.takeIf

.takeIf 方法如果当前值满足给定的 predicate 函数,则返回该值,否则返回 null

final a = 10.takeIf((it) => it % 2 == 0); // 10
final b = 9.takeIf((it) => it % 2 == 0); // null

.takeUnless

.takeUnless 方法如果当前值不满足给定的 predicate 函数,则返回该值,否则返回 null

final value = 10.takeUnless((it) => it % 2 == 0); // null
final value = 9.takeUnless((it) => it % 2 == 0); // 9

int

.plus

.plus 方法返回当前整数与指定值相加的结果。

final a = 1.plus(1);  // 2
final b = 200.plus(50);  // 250

.minus

.minus 方法返回当前整数与指定值相减的结果。

final a = 1.minus(1);  // 0
final b = 200.minus(50);  // 150

.ordinal

.ordinal 方法返回任何整数的序数字符串形式。

final a = 1.ordinal();  // "1st"
final b = 108.ordinal();  // "108th"

double

.plus

.plus 方法返回当前双精度浮点数与指定值相加的结果。

final a = 1.0.plus(1.5);  // 2.5
final b = 200.5.plus(50.5);  // 251.0

.minus

.minus 方法返回当前双精度浮点数与指定值相减的结果。

final a = 1.5.minus(1.0);  // 0.5
final b = 200.5.minus(50.5);  // 150

String

.isEmail

.isEmail 方法检查字符串是否为有效的电子邮件地址。

final isEmail = 'example@gmail.com'.isEmail; // true
final isNotEmail = 'example@'.isEmail; // false

.capitalize

.capitalize 方法返回字符串首字母大写后的副本,如果字符串为空或已以大写字母开头则返回原字符串。

final word = 'abcd'.capitalize(); // "Abcd"
final anotherWord = 'Abcd'.capitalize(); // "Abcd"

.decapitalize

.decapitalize 方法返回字符串首字母小写后的副本,如果字符串为空或已以小写字母开头则返回原字符串。

final word = 'abcd'.decapitalize(); // "abcd"
final anotherWord = 'Abcd'.decapitalize(); // "abcd"

.isBlank

.isBlank 方法检查字符串是否为空或仅包含空白字符。

final notBlank = '   .'.isBlank; // false
final blank = '  '.isBlank; // true

.isDouble

.isDouble 方法检查字符串是否可以解析为双精度浮点数。

final a = ''.isDouble; // false
final b = 'a'.isDouble; // false
final c = '1'.isDouble; // true
final d = '1.0'.isDouble; // true
final e = '123456789.987654321'.isDouble; // true
final f = '1,000'.isDouble; // false

.isInt

.isInt 方法检查字符串是否可以解析为整数。

final a = ''.isInt; // false
final b = 'a'.isInt; // false
final c = '1'.isInt; // true
final d = '1.0'.isInt; // false
final e = '1,000'.isInt; // false

.isLowerCase

.isLowerCase 方法检查整个字符串是否均为小写字母。

final a = 'abc'.isLowerCase; // true
final b = 'abC'.isLowerCase; // false
final c = '   '.isLowerCase; // true
final d = ''.isLowerCase; // false

.isNotBlank

.isNotBlank 方法检查字符串是否非空且包含非空白字符。

final blank = '  '.isNotBlank; // false
final notBlank = '   .'.isNotBlank; // true

.isNullOrEmpty

.isNullOrEmpty 方法检查字符串是否为 null 或空。

final isNull = null.isNullOrEmpty; // true
final isEmpty = ''.isNullOrEmpty; // true
final isBlank = ' '.isNullOrEmpty; // false
final isLineBreak = '\n'.isNullOrEmpty; // false

.isNotNullOrEmpty

.isNotNullOrEmpty 方法检查字符串是否既不是 null 也不是空。

final isNull = null.isNotNullOrEmpty; // false
final isEmpty = ''.isNotNullOrEmpty; // false
final isBlank = ' '.isNotNullOrEmpty; // true
final isLineBreak = '\n'.isNotNullOrEmpty; // true

.isNullOrBlank

.isNullOrBlank 方法检查字符串是否为 null 或空白。

final isNull = null.isNullOrBlank; // true
final isEmpty = ''.isNullOrBlank; // true
final isBlank = ' '.isNullOrBlank; // true
final isLineBreak = '\n'.isNullOrBlank; // true
final isFoo = ' foo '.isNullOrBlank; // false

.isNotNullOrBlank

.isNotNullOrBlank 方法检查字符串是否既不是 null 也不是空白。

final isNull = null.isNotNullOrBlank; // false
final isEmpty = ''.isNotNullOrBlank; // false
final isBlank = ' '.isNotNullOrBlank; // false
final isLineBreak = '\n'.isNotNullOrBlank; // false
final isFoo = ' foo '.isNotNullOrBlank; // true

.isUpperCase

.isUpperCase 方法检查整个字符串是否均为大写字母。

final a = 'ABC'.isUpperCase; // true
final b = 'ABc'.isUpperCase; // false
final c = '   '.isUpperCase; // true
final d = ''.isUpperCase; // false

.urlEncode

.urlEncode 方法将字符串编码为 application/x-www-form-urlencoded 格式。

const originalUrl = 'Hello Ladies + Gentlemen, a signed OAuth request!';
final encodedUrl = originalUrl.urlEncode;
// 'Hello%20Ladies%20+%20Gentlemen,%20a%20signed%20OAuth%20request!'

.urlDecode

.urlDecode 方法解码 application/x-www-form-urlencoded 格式的字符串。

const encodedUrl = 'Hello%20Ladies%20+%20Gentlemen,%20a%20signed%20OAuth%20request!';
final decodedUrl = encodedUrl.urlDecode;
// 'Hello Ladies + Gentlemen, a signed OAuth request!'

.slice()

.slice() 方法返回包含起始索引和结束索引之间所有字符的新子字符串。

final sliceOne = 'awesomeString'.slice(0,6)); // "awesome"
final sliceTwo = 'awesomeString'.slice(7)); // "String"

.toDoubleOrNull()

.toDoubleOrNull() 方法尝试将字符串解析为 double 类型并返回结果,如果字符串不是有效的数字表示,则返回 null

final numOne = '1'.toDoubleOrNull(); // 1.0
final numTwo = '1.2'.toDoubleOrNull(); // 1.2
final blank = ''.toDoubleOrNull(); // null

.toInt()

.toInt() 方法将字符串解析为整数,默认基数为10。如果解析失败会抛出 FormatException 异常。

final a = '1'.toInt(); // 1
final b = '100'.toInt(radix: 2); // 4
final c = '100'.toInt(radix: 16); // 256
final d = '1.0'.toInt(); // 抛出 FormatException

.toIntOrNull()

.toIntOrNull() 方法将字符串解析为整数,如果字符串不是有效的数字表示则返回 null

final number = '12345'.toIntOrNull(); // 12345
final notANumber = '123-45'.toIntOrNull(); // null

.toUtf8()

.toUtf8() 方法将字符串转换为 UTF-8 编码。

final emptyString = ''.toUtf8(); // []
final hi = 'hi'.toUtf8(); // [104, 105]
final emoji = '😄'.toUtf8(); // [240, 159, 152, 132]

.toUtf16()

.toUtf16() 方法将字符串转换为 UTF-16 编码。

final emptyString = ''.toUtf16(); // []
final hi = 'hi'.toUtf16(); // [104, 105]
final emoji = '😄'.toUtf16(); // [55357, 56836]

.orEmpty()

.orEmpty() 方法如果字符串不为 null 则返回该字符串,否则返回空字符串。

String? nullableStr;
final str = nullableStr.orEmpty(); // ""

.matches()

.matches() 方法检查当前字符序列是否匹配给定的正则表达式。

print('as'.matches(RegExp('^.s\$'))); // true
print('mst'.matches(RegExp('^.s\$'))); // false

Iterable Num

.sum

.sum 方法返回可迭代对象中所有元素的总和。

final a = [50, 10, 40].sum();  // 100

.average

.average 方法返回可迭代对象中所有元素的平均值。

final a = [50, 10].average();  // 30.0

.median

.median 方法返回可迭代对象中所有元素的中位数。

final a = [1, 2, 3, 4, 5].median();  // 3
final b = [5, 4, 3, 2, 1].median();  // 3

Time utils

gits_extension 导入了 time 包,允许你执行时间相关的操作。

int secondsInADay = 1.days.inSeconds;

Duration totalTime = [12.5.seconds, 101.milliseconds, 2.5.minutes].sum();

DateTime oneWeekLater = DateTime.now() + 1.week;

更多关于 time 包的信息和示例,请查看 时间库

完整示例

以下是一个完整的示例代码,展示了如何使用 gits_extension 中的一些功能:

// ignore_for_file: avoid_print

import 'package:gits_extension/gits_extension.dart';

void main() {
  String? getValue() => '1';
  final value = getValue();

  value?.run((it) => print(it));
  final let = value?.let((it) => int.parse(it));
  print(let);

  int itValue = 0;
  final also = value?.also((it) {
    itValue = int.parse(it);
  });

  print(also);
  print(itValue);
}

上述代码的输出结果如下:

1
1
1
1

更多关于Flutter Git操作扩展插件gits_extension的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Git操作扩展插件gits_extension的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中,使用gits_extension插件可以方便地进行Git操作。以下是一个基本的代码案例,展示如何在Flutter应用中使用gits_extension插件来进行一些常见的Git操作,比如克隆仓库、获取仓库状态等。

首先,确保你已经在pubspec.yaml文件中添加了gits_extension依赖:

dependencies:
  flutter:
    sdk: flutter
  gits_extension: ^最新版本号 # 请替换为最新的版本号

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

接下来,在你的Flutter项目中,你可以这样使用gits_extension

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String gitStatus = "";

  @override
  void initState() {
    super.initState();
    _cloneRepo();
    // 你可以在这里添加其他初始化操作,比如获取仓库状态等
    // _getGitStatus();
  }

  Future<void> _cloneRepo() async {
    try {
      // 替换为你的Git仓库URL和本地存储路径
      String repoUrl = "https://github.com/your-username/your-repo.git";
      String localPath = "/path/to/local/repo";

      await Git().clone(repoUrl, localPath);
      setState(() {
        gitStatus = "Repository cloned successfully!";
      });
    } catch (e) {
      setState(() {
        gitStatus = "Failed to clone repository: ${e.message}";
      });
    }
  }

  Future<void> _getGitStatus() async {
    try {
      // 替换为你的本地仓库路径
      String localRepoPath = "/path/to/local/repo";

      var status = await Git(localRepoPath).status();
      setState(() {
        gitStatus = "Git status:\n${status.toString()}";
      });
    } catch (e) {
      setState(() {
        gitStatus = "Failed to get Git status: ${e.message}";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Git Operations'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(gitStatus, style: TextStyle(fontSize: 18)),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  // 你可以在这里调用其他Git操作函数
                  await _getGitStatus();
                },
                child: Text('Get Git Status'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们在initState方法中调用了_cloneRepo函数来克隆一个Git仓库。你需要替换repoUrllocalPath为你自己的Git仓库URL和本地存储路径。

  2. _cloneRepo函数使用Git().clone(repoUrl, localPath)来克隆仓库,并在成功后更新状态。

  3. _getGitStatus函数用于获取本地仓库的状态,并更新UI显示状态信息。你需要替换localRepoPath为你的本地仓库路径。

  4. 在UI中,我们有一个按钮来触发获取Git状态的操作,以及一个文本区域来显示Git状态或错误信息。

请注意,由于gits_extension插件的具体API可能会随着版本更新而变化,因此建议查阅最新的官方文档以获取最准确的信息。此外,实际开发中可能需要进行更多的错误处理和用户交互设计。

回到顶部