我遇到此错误:位置参数过多:预期为0,但发现3。 (extra_positional_arguments_could_be_name在itemBuilder上...无法弄清楚是什么原因引起的。
错误出现在这里->
itemBuilder: (ctx, i) => ProductItem(
loadedProducts[i].id,
loadedProducts[i].title,
loadedProducts[i].imageUrl,
),
class ProductListPage extends StatelessWidget {
ProductListPage({this.context});
final List<Product> loadedProducts = [
Product(
id: 'p1',
title: "Michael Kora",
description: 'this is cool',
price: 699,
imageUrl:
"https://n1.sdlcdn.com/imgs/c/9/8/Lambency-Brown-Solid-Casual-Blazers-SDL781227769-1-1b660.jpg",
),
Product(
id: 'p1',
title: "Michael Kora",
description: 'this is cool',
price: 699,
imageUrl:
"https://n1.sdlcdn.com/imgs/c/9/8/Lambency-Brown-Solid-Casual-Blazers-SDL781227769-1-1b660.jpg",
),
];
final BuildContext context;
// @override
Widget build(BuildContext context) {
return Scaffold(
body: GridView.builder(
padding: const EdgeInsets.all(10.0),
itemCount: loadedProducts.length,
itemBuilder: (ctx, i) => ProductItem(
loadedProducts[i].id,
loadedProducts[i].title,
loadedProducts[i].imageUrl,
),
);
}
}
ProductItem
的定义如下:
class ProductItem extends StatelessWidget {
ProductItem({this.id, this.imageUrl, this.title});
final String id;
final String title;
final String imageUrl;
@override
Widget build(BuildContext context) {
return GridTile(
child: Image.network(imageUrl),
);
}
}
答案 0 :(得分:2)
简短答案:
ProductItem
需要命名的,而不是 positioning 参数。像这样初始化它:
ProductItem(
id: loadedProducts[i].id,
title: loadedProducts[i].title,
imageUrl: loadedProducts[i].imageUrl,
)
更长的答案:
该错误通知我们:
位置参数过多:预期为0,但发现为3。
建议ProductItem
的构造函数不期望 positional 参数。它不知道该如何处理他们。为什么?让我们检查一下ProductItem
类的定义:
class ProductItem extends StatelessWidget {
ProductItem({this.id, this.imageUrl, this.title});
...
}
参数包含在{}
中。在Dart中,这意味着它们是可选的 named 参数。也就是说,如果您决定将其传递,则必须像这样传递它们:
ProductItem(id: 'id', imageUrl: 'url', title: 'title')
请注意,每个参数都以其名称开头-因此,它称为 named 参数。相反, positional 参数仅通过它们在调用构造函数时所处的位置来区分。
类定义通知我们ProductItem
的构造函数不应使用 positional 参数调用。而是应使用 named 参数。 ProductItem
的构建方式应为:
ProductItem(
id: loadedProducts[i].id,
title: loadedProducts[i].title,
imageUrl: loadedProducts[i].imageUrl,
)
要详细了解参数类型,请参阅Dart documentation。或者,探索DartPad中的差异。