为什么要在 dart 课上使用 prop ?

eivnm1vs  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(134)

我在Flutter Dart中使用Equatable生成了一些样板代码。

import 'package:equatable/equatable.dart';

class Task extends Equatable {
  final String title;
  bool? isDone;
  bool? isDeleted;

  Task({
    required this.title,
    this.isDone,
    this.isDeleted,
  }) {
    isDone = isDone ?? false;
    isDeleted = isDeleted ?? false;
  }

  Task copyWith({
    String? title,
    bool? isDone,
    bool? isDeleted,
  }) {
    return Task(
      title: title ?? this.title,
      isDone: isDone ?? this.isDone,
      isDeleted: isDeleted ?? this.isDeleted,
    );
  }

  Map<String, dynamic> toMap() {
    final result = <String, dynamic>{};

    result.addAll({'title': title});
    if (isDone != null) {
      result.addAll({'isDone': isDone});
    }
    if (isDeleted != null) {
      result.addAll({'isDeleted': isDeleted});
    }

    return result;
  }

  factory Task.fromMap(Map<String, dynamic> map) {
    return Task(
      title: map['title'] ?? '',
      isDone: map['isDone'],
      isDeleted: map['isDeleted'],
    );
  }

  @override
  List<Object?> get props => [
        title,
        isDeleted,
        isDone,
      ];
}

字符集
我的问题是为什么这段代码,这段代码是做什么的?我读了一些文档,但我没有找到确切的答案。文档说它是用来和另一个类比较的,但为什么我们需要比较?还有,我没有写任何其他类。那么哪些类正在比较?或者它不是用来比较的?

@override
  List<Object?> get props => [
        id,
        title,
        isDeleted,
        isDone,
      ];


这一行的目的是什么?还有,为什么我们要使用Object类?

k5hmc34c

k5hmc34c1#

这是为了指定比较哪个属性来检查一个示例是否等于同一个类的另一个示例。这很有用,因为如果有一个属性我们想要或不想比较,我们可以将其添加或删除到返回的数组中。
在此示例中,此代码比较Task的第一个示例是否等于Task的第二个示例。

main() {
    var task1 =  Task(title: 'task 1', isDone: true, isDeleted: true);
    var task2 =  Task(title: 'task 2', isDone: false, isDeleted: false);
    print(task1 == task2); // false
}

字符集
它返回List<Object>,因为类Task扩展了Equatable,所以Task需要重写List<Object?> get props
这个函数比较字符串和布尔值。请记住,字符串和布尔值在dart中都是Object,所以如果你只比较字符串或布尔值,你可以返回List<String>List<bool>

pengsaosao

pengsaosao2#

但我们为什么要比较呢?

如果不需要,则不必比较任何类。

所以不要让你自己感到困惑。
但我们什么时候需要呢?
例如:当我们需要在一些条件下渲染小部件时,我们需要比较两个示例。

final user1 = User (name: "poo", role: "manager");
final user2 = User( name: "boo", role: "engineer");

字符串
假设我们想要呈现容器,如果角色是管理员

User.role == "manager" ? Container() : Text("this only show on manager level"),


实际上,我们可以手动编写代码来使比较的行为正常工作,但我们也可以使用包来使其自动生成。因此,条件可以按我们所希望的那样工作。

我们需要手动编写哪些代码?

这个:

@override
  bool operator ==(Object other) =>
    identical(this, other) ||
    other is Task &&
    runtimeType == other.runtimeType &&
    title == other.title;

  @override
  int get hashCode => name.hashCode;


如果我们想比较title,我们需要编写代码。Task("title1") == 'title1'
另一个属性如:id(如果我们以后需要比较它们的话)。然后我们需要为id编写另一个代码。
如果你以后想比较你所有的 prop ,也可以这样做。
实际上Equatable所做的是生成那个代码。它会为你所有的 prop 生成这个。

@override
  List<Object?> get props => [
        id,
        title,
        isDeleted,
        isDone,
      ];


现在你可以比较你的idtitleisDeletedisDone,而无需手动编写代码比较。

相关问题