扑动:位置参数太多:预期为 0,但找到 1

flutter: Too many positional arguments: 0 expected, but 1 found

我一直在关注使用 BLoC 的 this NoSQL tutorial。但是当我将 'fruit_event.dart' 中的代码粘贴到 Visual Studio 代码中时,它给了我一个错误。

fruit_event.dart:

import 'package:equatable/equatable.dart';
import 'package:meta/meta.dart';
import 'package:sembast_prep/data/fruit.dart';

@immutable
abstract class FruitEvent extends Equatable {
  FruitEvent([List props = const []]) : super(props); // error here!
}

class LoadFruits extends FruitEvent {}

class AddRandomFruit extends FruitEvent {}

class UpdateWithRandomFruit extends FruitEvent {
  final Fruit updatedFruit;

  UpdateWithRandomFruit(this.updatedFruit) : super([updatedFruit]);
}

class DeleteFruit extends FruitEvent {
  final Fruit fruit;

  DeleteFruit(this.fruit) : super([fruit]);
}

我收到此错误(Visual Studio 代码):

[List<dynamic> props = const []]
Too many positional arguments: 0 expected, but 1 found.
Try removing the extra positional arguments.dart(extra_positional_arguments)

Equatable 的源代码class:https://github.com/felangel/equatable/blob/master/lib/src/equatable.dart

它只有一个构造函数并且构造函数不接受argument/parameter。所以你不能从你的构造函数中调用 super(props)

但是,在您的代码中,您将一个参数即 props 传递给 super class 的构造函数,即在您的情况下是 Equatable。

替换为:

FruitEvent([List props = const []]) : super(props);

有了这个:

FruitEvent([List props = const []]);

而且它不会给你任何错误。

你可能想参考这个问题来理解超级构造函数在 dart 中的用法:How do I call a super constructor in Dart?

已编辑:

  1. 你应该使用 Equitable class 来覆盖你的哈希码和 toString.
  2. 所以对于要包含在哈希码中的字段和 toString 你需要有以下覆盖:

/// The [List] of `props` (properties) which will be used to determine whether
/// two [Equatables] are equal.
@override
List<Object> get props => [parameter1, parameter2, parameter3.....];

  1. 但是由于您的 class 中没有任何字段,因此没有多大用处 使用公平的意义。

从源代码中阅读这条评论:

/// A class that helps implement equality
/// without needing to explicitly override == and [hashCode].
/// Equatables override their own `==` operator and [hashCode] based on their `props`.
const Equatable();

您可以参考:https://pub.dev/packages/equatable#-example-tab-了解如何使用 Equitable class。

希望对您有所帮助,如有疑问请评论。 如果这个回答对您有帮助,请采纳并点赞。