Flutter功能未定义插件maybe_just_nothing的探索

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

Flutter功能未定义插件maybe_just_nothing的探索

Maybe Just Nothing

Maybe Just Nothing 是用Dart编写的又一个经典的Maybe单子变体,它采用的是急切执行的方式。

创建maybe值

内部地,Maybe是一个抽象类,有两个实现:JustNothing。最常见的场景可能是从可空值中去除null:

int? nullableValue;
final val = Just(nullableValue).type<int>(); // val 要么是 Just<int> 要么是 Nothing<int>
final doubled = val.map((x) => x * 2);
doubled.ifPresent(print); // 如果 nullableValue 不为 null 则打印其双倍值

可空值也可以被包裹在 Just 中:

int? nullableValue;
final val = Just(nullableValue); // val 是 Just<int?>
final justNull = Maybe(null); // 创建 Just<void>

Nothing 值可以创建成有类型的或无类型的:

final nothing1 = Nothing(); // Nothing<Object?>
final nothing2 = Nothing<int>(); // Nothing<int>
final nothing3 = Nothing<String?>(); // Nothing<String?>

甚至可以区分 null 的存在与不存在:

Maybe<void> yay = Just(null); // Just<Null>
Maybe<void> nay = Nothing<void>(); // Nothing<Null>

映射值

映射意味着通过应用函数来转换包装的值。由于Maybe本身是不可变的,映射操作实际上并不会修改值。相反,它们总是返回另一个Maybe

Just(2).map((x) => x * 2).ifPresent(print); // 打印 "4"

如果映射函数也返回一个Maybe,使用flatMap()

Maybe<int> triple(int x) => Just(x).map((x) => x * 3);

Just(2).flatMap(triple).ifPresent(print); // 打印 "6"

可以在两个maybe值上执行的操作使用merge()

final two = Just(2);
final three = Just(3);

two.merge(three, (x, y) => x + y).ifPresent(print); // 打印 "5"

过滤值

过滤是检查maybe值是否满足特定条件。如果满足,则值保持不变;否则返回Nothing

为了根据值本身进行过滤,使用where()

Just(2).where((x) => x.isEven).ifPresent(print); // 打印 "2"
Just(3).where((x) => x.isEven).ifPresent(print); // 3 是奇数,所以什么也不做

为了按类型过滤,使用type<T>()

final maybeInt = Just(2).type<int>(); // Just<int>
final maybeString = Just(2).type<String>(); // Nothing<String>

回退链

chain()方法实现了责任链设计模式。它接受另一个相同类型的maybe值。如果当前值是Nothing,则返回下一个链中的值。

另一种实现相同想法的方法是使用fallback()方法。它接受一个“回退”函数,该函数返回另一个相同类型的maybe值。如果当前值是Nothing,这个回退函数将被调用并返回其结果。你可以提供多个回退函数。它们将按顺序调用,直到收到一个Just值。

Nothing<int>()
  .chain(Nothing<int>()) // 这个将被跳过
  .chain(Just(2)) // 这个值不是空的,所以它将被使用
  .chain(Just(3)) // 这个值不会被使用
  .ifPresent(print); // 打印 "2"

// 使用 fallback() 实现相同的功能
Nothing<int>()
  .fallback(() => Nothing<int>()) // 这个结果将被跳过
  .fallback(() => Just(2)) // 这个函数返回一个非空值
  .fallback(() => Just(3)) // 这个函数不会被调用
  .ifPresent(print); // 打印 "2"

消费值

Maybe的意图是给它一个消费者函数而不是检索值。这是最简洁、最清晰的使用方式。

Maybe a;
a
  ..ifPresent(print)
  ..ifNothing(() {/* do something else*/});

读取值

有时候,你需要实际的值。在这种情况下,你必须提供默认值。

在最简单的情况下,使用or()

Maybe<int> a;
final value = a.or(0); // value 是 0
final valueFromFuture = await a.orAsync(Future.value(0)); // value 是 0

可以指定一个提供者函数而不是默认值:

Maybe<int> a;
final value = a.orGet(() => 0); // value 是 0
final valueFromFuture = await a.orGetAsync(() async => 0); // value 是 0

如果没有默认值,可以抛出异常:

Maybe<int> a;
final value = a.orThrow(() => 'Oops!');

在某些罕见的情况下,直接检查是否为空会更方便:

Maybe<int> myInt;

if (myInt is Just<int>) {
  print(myInt.value); // .value 是保证不为空的
}

if (myInt is Nothing) {
  print('The value is missing');
}

示例代码

下面是一个完整的示例代码,展示了如何使用maybe_just_nothing包:

import 'package:maybe_just_nothing/maybe_just_nothing.dart';

Maybe<int> addTwoIntegers(dynamic a, dynamic b) =>
    Just(a).type<int>().merge(Just(b).type<int>(), (int a, int b) => a + b);

void main() {
  // Prints 42
  addTwoIntegers(40, 2).ifPresent(print);

  // Does nothing since one of the values is null.
  addTwoIntegers(40, null).ifPresent(print);

  // Does nothing since one of the values is not an integer.
  addTwoIntegers('Oops', 2).ifPresent(print);
}

希望这些信息能够帮助你更好地理解和使用maybe_just_nothing插件!如果你有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter功能未定义插件maybe_just_nothing的探索的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter功能未定义插件maybe_just_nothing的探索的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,如果遇到功能未定义的插件,比如maybe_just_nothing(这个名称听起来像是一个假设的或不存在的插件名称,但我会按照要求给出一个探索和处理未定义插件或功能的示例代码案例),你通常需要检查几个关键点:

  1. 插件是否正确安装并导入:确保pubspec.yaml文件中已经列出了该插件,并且已经运行了flutter pub get

  2. 导入插件的Dart代码:在需要使用插件的Dart文件中正确导入插件。

  3. 检查插件的文档和API:确保你了解如何使用该插件,以及它提供了哪些功能。

  4. 处理可能的未定义错误:如果插件不存在或功能未定义,你可能需要处理这些错误,避免应用崩溃。

下面是一个假设性的示例,展示如何在Flutter项目中探索和使用一个假设的插件maybe_just_nothing(实际上这个插件不存在,但以下代码展示了如何处理这种情况):

1. 在pubspec.yaml中添加插件(假设存在)

dependencies:
  flutter:
    sdk: flutter
  maybe_just_nothing: ^0.0.1  # 假设版本号

然后运行flutter pub get

2. 在Dart文件中导入插件

import 'package:maybe_just_nothing/maybe_just_nothing.dart';

3. 尝试使用插件功能并处理可能的未定义错误

由于maybe_just_nothing是一个假设的插件,我们不知道它提供了哪些具体功能。但以下代码展示了如何安全地尝试调用一个假设的方法,并处理可能的错误:

import 'package:flutter/material.dart';
import 'package:maybe_just_nothing/maybe_just_nothing.dart' as maybe;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Maybe Just Nothing Plugin Demo'),
        ),
        body: Center(
          child: FutureBuilder<void>(
            future: _tryUsingMaybeJustNothingPlugin(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return CircularProgressIndicator();
              } else if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                return Text('Plugin used successfully!');
              }
            },
          ),
        ),
      ),
    );
  }

  Future<void> _tryUsingMaybeJustNothingPlugin() async {
    try {
      // 假设插件有一个叫做doSomething的方法
      await maybe.doSomething();
    } catch (e) {
      // 如果插件不存在或方法未定义,这里会捕获到异常
      throw Exception('Failed to use maybe_just_nothing plugin: $e');
    }
  }
}

在这个示例中,我们尝试调用maybe.doSomething()方法(这只是一个假设的方法名)。我们使用FutureBuilder来异步处理这个过程,并在UI中显示加载指示器、错误消息或成功消息。

注意

  • 由于maybe_just_nothing实际上不存在,上述代码在实际运行时会抛出异常。
  • 在实际开发中,如果遇到未定义的插件或功能,你应该检查插件的官方文档、GitHub仓库或相关社区,确认插件的存在和正确的使用方法。
  • 如果插件确实不存在或已经废弃,你可能需要寻找替代方案或自己实现所需的功能。
回到顶部