扑动:位置参数太多:预期为 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?
已编辑:
- 你应该使用 Equitable class 来覆盖你的哈希码和
toString.
- 所以对于要包含在哈希码中的字段和
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.....];
- 但是由于您的 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。
希望对您有所帮助,如有疑问请评论。 如果这个回答对您有帮助,请采纳并点赞。
我一直在关注使用 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?
已编辑:
- 你应该使用 Equitable class 来覆盖你的哈希码和 toString.
- 所以对于要包含在哈希码中的字段和 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.....];
- 但是由于您的 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。
希望对您有所帮助,如有疑问请评论。 如果这个回答对您有帮助,请采纳并点赞。