Flutter色彩管理插件pastel的使用

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

Flutter色彩管理插件pastel的使用

简介

Pastel 是一个用于简化代码编写的库。它提供了一系列函数,使得你的代码更加简洁和有趣。

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  pastel: ^版本号

然后运行以下命令来安装:

dart pub get

背景

我喜欢 Lisp 的编程风格,但由于不适应 Lisp 的语法,所以我编写了这个库来使 Dart 更像 Lisp。

使用

Pastel 是一个编码风格库。它提供了一组函数,使得代码更加简洁有趣。

Monad

Monad 是一组用于链式调用函数的类型。

Option<T>

Option<T> 是一种可以为 null 的类型。

import 'package:pastel/pastel.dart';

void main() {
  Option<int> some = Some(1); // Some 是包含值的 Option 构造函数。
  Option<int> none = None(); // None 是不包含任何值的 Option 构造函数。

  some = some.map((p) => p + 1); // map 是用于转换值的函数。
  none = none.map((p) => p + 1); // none 仍然是 none。

  if (some.isSome()) {
    // isSome 是检查 Option 是否包含值的函数。
    print(some.unwrap()); // unwrap 是从 Option 中获取值的函数。
  }

  if (none.isNone()) {
    // isNone 是检查 Option 是否不包含任何值的函数。
    try {
      print(none.unwrap()); // unwrap 是从 Option 中获取值的函数。
    } catch (e) {
      print(e); // 从 none 解包将抛出错误。
    }
  }
}

输出结果:

2
Exception: Cannot unwrap None

Exited.

Either<L, R>

Either<L, R> 是一种可以是左或右的类型。通常用于处理联合类型。

import 'package:pastel/pastel.dart';

void main() {
  Either<String, int> left = Left('left'); // Left 包含 A 类型的值
  Either<String, int> right = Right(1); // Right 包含 B 类型的值

  left = left.map((lv) => '$lv $lv', (rv) => rv * 2); // map() 对 Either 的值应用函数
  right = right.map((lv) => '$lv $lv', (rv) => rv * 2);

  if (left.isLeft()) {
    // isLeft() 返回 true 如果 Either 是 Left
    print(left.unwrapLeft()); // unwrapLeft() 返回 Left 的值
  }

  if (right.isRight()) {
    // isRight() 返回 true 如果 Either 是 Right
    print(right.unwrapRight()); // unwrapRight() 返回 Right 的值
  }
}

输出结果:

left left
2

Exited.

Result<T>

Result<T> 可以是 Ok<T>Err

  • Ok<T> 包含一个值。
  • Err 包含一个错误。
import 'package:pastel/pastel.dart';

void main() {
  Result<int> ok = Ok(123); // Ok<T>() 是成功的结果类
  Result<int> err = Err(StringError('error message')); // Err<T>() 是错误类

  ok = ok.map((p) => Ok(p * 200)); // map() 应用于值
  err = err.map((p) => Ok(p * 200)); // map() 对于错误不做任何操作

  if (ok.isOk()) {
    // isOk() 返回 true 如果结果是 Ok<T>()
    print(ok.unwrap()); // unwrap() 返回 Ok<T>() 的值
  }
  if (err.isErr()) {
    // isErr() 返回 true 如果结果是 Err<T>()
    print(err.unwrapErr()); // unwrapErr() 返回 Err<T>() 的错误
  }
}

PastelError

pastelError 是一个抽象类,用于表示错误。

import 'package:pastel/pastel.dart';

class CustomError extends PastelError {
  final String message;

  CustomError(this.message);

  [@override](/user/override)
  String toString() => message;
}

这是一个自定义错误的例子。

下面是使用 Result<T>PastelError 的例子:

import 'dart:io';

import 'package:pastel/pastel.dart';

class FileNotExistsError extends PastelError {
  final String path;

  FileNotExistsError(this.path);

  [@override](/user/override)
  String toString() => 'File $path does not exist';
}

class FileSystemError extends PastelError {
  final FileSystemException exception;

  FileSystemError(this.exception);

  [@override](/user/override)
  String toString() => exception.toString();
}

void main() {
  const filename = 'pubspec.yaml';
  var result = Ok(File(filename)).map((file) {
    if (file.existsSync()) {
      return Ok(file);
    } else {
      return Err<File>(FileNotExistsError(file.path));
    }
  }).map((file) {
    try {
      return Ok(file.readAsStringSync());
    } on FileSystemException catch (e) {
      return Err<String>(FileSystemError(e));
    }
  });

  switch (result) {
    case Ok<String>():
      print(result.unwrap());
      break;
    case Err<String>():
      print(result.unwrapErr());
      break;
  }
}

Scope

Scope 是一个包含某些变量的函数。

import 'package:pastel/pastel.dart';

void main() => Scope((a: 50, b: 50)); 
// Scope 构造函数接受任何类型。
// 但建议使用 Tuple 类型。

let

let 方法可以在作用域内使用变量。

import 'package:pastel/pastel.dart';

void main() => Scope((a: 50, b: 50)).let((p) => print(p.a + p.b));
// let 方法的参数是一个接收作用域作为参数的函数。
// 当 Scope 接收到命名元组时,let 可以像这样使用命名变量。

输出结果:

100

Exited.

Iterable

Iterable 是一组用于 Iterable<T> 类型的函数。

numbers

numbers 函数返回从 startendIterable<int>

import 'package:pastel/pastel.dart';

void main() => Scope((start: 0, end: 100))
    .let((p) => Some(
        numbers(p.start, p.end).reduce((value, element) => value + element)))
    .map((p) => print(p));

输出结果:

5050

Exited.

逻辑

Logical 是一组用于逻辑运算的函数。

cond

cond 是一个比较函数,返回 R 类型。

import 'package:pastel/pastel.dart';

final compareTo100 = cond<int, String>(
  [
    ((p0) => p0 < 100, (p0) => 'under 100'),
    ((p0) => p0 > 100, (p0) => 'over 100')
  ],
  (p0) => 'equal 100' // cond 接受一个比较函数和结果函数的列表。
);

void main() => Scope((count: 1000))
    .let((p) => Some(compareTo100(p.count))) // 使用闭包传递值。
    .map((p0) => print(p0));

match

match 是一个比较函数,识别真假并返回 R 类型。

import 'package:pastel/pastel.dart';

final compareTo100 = match<int, String>(
  (p0) => p0 == 100,
  (p0) => 'is 100',
  (p0) => 'is not 100'
); // match 接受一个比较函数和结果函数。

void main() => Scope((count: 1000))
    .let((p) => Some(compareTo100(p.count))) // 使用闭包传递值。
    .map((p0) => print(p0));

when

when 是一个比较函数,识别相等性并返回 R 类型。

import 'package:pastel/pastel.dart';

final compareWith = when<int, String>(
  [
    (100, (p0) => 'equal 100'),
    (200, (p0) => 'equal 200'),
    (300, (p0) => 'equal 300'),
    (400, (p0) => 'equal 400'),
    (500, (p0) => 'equal 500'),
    (600, (p0) => 'equal 600'),
    (700, (p0) => 'equal 700'),
    (800, (p0) => 'equal 800'),
    (900, (p0) => 'equal 900')
  ],
  (p0) => 'not equal 100~900'
); // when 接受一个相等性检查的列表和默认结果函数。

void main() => Scope((count: 100))
    .let((p) => Some(compareWith(p.count)))
    .map((p0) => print(p0));

示例

读取文件的一个例子:

import 'dart:io';

import 'package:pastel/pastel.dart';

class FileNotExistsError extends PastelError {
  final String path;

  FileNotExistsError(this.path);

  [@override](/user/override)
  String toString() => 'File $path does not exist';
}

class FileSystemError extends PastelError {
  final FileSystemException exception;

  FileSystemError(this.exception);

  [@override](/user/override)
  String toString() => exception.toString();
}

void main() => Scope((filename: "pubspec.yaml"))
    .let((p) => Ok(File(p.filename)).map((file) {
          if (file.existsSync()) {
            return Ok(file);
          } else {
            return Err<File>(FileNotExistsError(file.path));
          }
        }).map((file) {
          try {
            return Ok(file.readAsStringSync());
          } on FileSystemException catch (e) {
            return Err<String>(FileSystemError(e));
          }
        }).map((content) => Ok(print(content))));

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

1 回复

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


当然,以下是如何在Flutter项目中使用pastel色彩管理插件的详细代码案例。pastel插件可以帮助你生成柔和的色彩,非常适合用于UI设计。

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

dependencies:
  flutter:
    sdk: flutter
  pastel: ^x.y.z  # 请替换为最新版本号

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

接下来,我们来看一个使用pastel插件的完整示例。

主文件:main.dart

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  List<Color> pastelColors = [];

  @override
  void initState() {
    super.initState();
    generatePastelColors();
  }

  void generatePastelColors() {
    final pastel = Pastel();
    // 生成5个柔和色彩
    for (int i = 0; i < 5; i++) {
      pastelColors.add(pastel.randomColor());
    }
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Pastel Color Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            for (final color in pastelColors)
              Container(
                width: 100,
                height: 100,
                color: color,
                margin: EdgeInsets.all(10),
                child: Center(
                  child: Text(
                    '#${color.value.toRadixString(16).toUpperCase().padLeft(8, '0')}',
                    style: TextStyle(color: Colors.white),
                  ),
                ),
              ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: generatePastelColors,
        tooltip: 'Generate New Colors',
        child: Icon(Icons.refresh),
      ),
    );
  }
}

解释

  1. 依赖导入

    • import 'package:flutter/material.dart'; 导入Flutter的Material组件。
    • import 'package:pastel/pastel.dart'; 导入pastel插件。
  2. 主应用入口

    • MyApp 类是应用的主入口,它定义了应用的主题和首页。
  3. 首页

    • MyHomePage 是一个有状态的小部件,用于显示生成的柔和色彩。
    • initState方法中,调用generatePastelColors方法生成5个柔和色彩。
  4. 生成柔和色彩

    • 使用Pastel类的randomColor方法生成柔和色彩,并将它们添加到pastelColors列表中。
  5. 显示色彩

    • 使用Column布局显示生成的色彩。每个色彩都封装在一个Container中,并显示其十六进制颜色代码。
    • 使用FloatingActionButton提供一个按钮,用于重新生成柔和色彩。

这个示例展示了如何使用pastel插件生成并显示柔和色彩。你可以根据需求调整生成的色彩数量和布局。

回到顶部