Flutter数据处理与空值处理插件nullable_absent的使用

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

Flutter数据处理与空值处理插件nullable_absent的使用

特性

简单包装类,用于表示 absent 值。 当你为包含 nullable 字段的类创建 copyWith 方法时,可能需要它。

开始使用

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

dependencies:
  nullable_absent: ^2.0.0

使用示例

对于包含 nullable 字段的类,并且你想拥有 copyWith 函数。

class MyData {
  final String id;
  final String? name;

  MyData({required this.id, required this.name});

  MyData copyWith({
    String? id,
    NullableAbsent<String> name = const NullableAbsent.absent(),
  }) {
    return MyData(
        id: id ?? this.id, 
        name: NullableAbsent(this.name).apply(name),
    );
  }

  [@override](/user/override)
  String toString() {
    return [id, name ].toString();
  }
}

对于非 null 字段,我们可以使用 String? 来指定 id 的新值,或者直接将其设为 null 来使用旧值。 但对于 nullable 字段,我们有时想将其设为 null,有时想使用旧值。因此 String? 不够用。

MyData copyWith({String? id}) {
  return MyData(
      id: id ?? this.id, 
      name: name ?? this.name, // 如果我们想要将 name 设为 null
  );
}

有了 nullable_absent,我们可以区分 set to nulluse old value,如下所示。

MyData copyWith({
  String? id,
  NullableAbsent<String> name = const NullableAbsent.absent(),
}) {
  return MyData(
      id: id ?? this.id, 
      name: NullableAbsent(this.name).apply(name),
  );
}

apply(newValue) 是一个方便的方法来创建结果值。

额外信息

你可以使用 typedef 来使代码更简洁。

typedef $T = NullableAbsent<T>

// copyWith 示例代码
MyData copyWith({
  String? id,
  $<String> name = const $.absent(),
}) {
  return MyData(
      id: id ?? this.id, 
      name: $(this.name).apply(name));
}

// 使用示例
final dataWithNewName = data.copyWith(name: $("new_name"));

示例代码

import 'package:nullable_absent/nullable_absent.dart';

void main() {
  final data = MyData(id: "id", name: "name");
  print("data: $data");
  final dataWithNewName = data.copyWith(name: NullableAbsent("new_name"));
  print("dataWithNewName: $dataWithNewName");
  final dataWithNullName = data.copyWith(name: NullableAbsent(null));
  print("dataWithNullName: $dataWithNullName");
  final dataWithNewId = data.copyWith(id: "new_id");
  print("dataWithNewId: $dataWithNewId");
}

class MyData {
  final String id;
  final String? name;

  MyData({required this.id, required this.name});

  MyData copyWith({
    String? id,
    NullableAbsent<String> name = const NullableAbsent.absent(),
  }) {
    return MyData(
        id: id ?? this.id, 
        name: NullableAbsent(this.name).apply(name));
  }

  [@override](/user/override)
  String toString() {
    return [id, name ].toString();
  }
}

更多关于Flutter数据处理与空值处理插件nullable_absent的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据处理与空值处理插件nullable_absent的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用nullable_absent插件来处理数据和空值的示例代码。nullable_absent插件允许开发者在处理可能为null或absent(缺失)的值时,拥有更多的控制和表达力。

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

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

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

接下来,我们来看一个具体的代码示例,展示如何使用nullable_absent来处理数据和空值。

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  // 示例数据,包含可能为null或absent的值
  final Map<String, NullableAbsent<String>> data = {
    'name': NullableAbsent.present('Alice'),
    'age': NullableAbsent.absent(), // 假设年龄未知
    'city': NullableAbsent.present('Wonderland'),
    'email': NullableAbsent.nullValue(), // 假设没有电子邮件
  };

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Nullable Absent Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('Name: ${data['name']?.value ?? 'Unknown'}'),
            SizedBox(height: 16),
            Text('Age: ${data['age'].isPresent ? data['age']?.value ?? 'Unknown' : 'Absent'}'),
            SizedBox(height: 16),
            Text('City: ${data['city']?.value ?? 'Unknown'}'),
            SizedBox(height: 16),
            Text('Email: ${data['email'].isPresent ? (data['email']?.value ?? 'Not provided') : 'Null'}'),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们定义了一个包含各种可能状态的data映射:

  • 'name'键的值是NullableAbsent.present('Alice'),表示该值是存在的且为"Alice"。
  • 'age'键的值是NullableAbsent.absent(),表示该值是缺失的。
  • 'city'键的值是NullableAbsent.present('Wonderland'),表示该值是存在的且为"Wonderland"。
  • 'email'键的值是NullableAbsent.nullValue(),表示该值是null。

build方法中,我们根据NullableAbsent对象的状态来显示相应的文本。使用?.value来安全地访问存在的值,并使用isPresent属性来检查值是否存在或是否为null。

这个示例展示了如何使用nullable_absent插件来处理可能为null或缺失的值,从而提供更清晰的代码逻辑和更好的空值处理。

回到顶部