错误:位置参数过多:预期为0,但发现3

时间:2019-08-30 20:22:40

标签: flutter dart

我遇到此错误:位置参数过多:预期为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),
    );
  } 
}

1 个答案:

答案 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中的差异。