flutter 为什么我不能在这个函数中使用命名参数?

uinbv5nw  于 2022-12-05  发布在  Flutter
关注(0)|答案(1)|浏览(124)

我在main.dart中编写了这段代码

Map<String, bool> filters = {
    'gluten': false,
    'lactose': false,
    'vegan': false,
    'vegetarian': false,
  };

  void _filteringFunction({bool gluten, bool lactose, bool vegan, bool vegetarian}) {
    setState(() {
      filters['gluten'] = gluten;
      filters['lactose'] = lactose;
      filters['vegan'] = vegan;
      filters['vegetarian'] = vegetarian;

      selectedMeals = DUMMY_MEALS.where((meal) {
        if (filters['gluten'] && !meal.isGlutenFree) {return false;}
        if (filters['lactose'] && !meal.isLactoseFree) {return false;}
        if (filters['vegan'] && !meal.isVegan) {return false;}
        if (filters['vegetarian'] && !meal.isVegetarian) {return false;}

        return true;
      }).toList();
    });
  }

这里我从另一个屏幕(过滤器屏幕)调用该函数,SaveFilters是我在“过滤器屏幕”中为函数reciver指定的名称

IconButton(
              onPressed: () { widget.SaveFilters(
                  _isGlutenFree, _isLactoseFree, _isVegan, _isVegetarian);},
              icon: Icon(
                Icons.save,
                color: Colors.white,
              ))

And i was getting this error
我尝试删除遇到函数参数的花括号,所以现在函数头如下所示:

void _filteringFunction(bool gluten, bool lactose, bool vegan, bool vegetarian)

这样就解决了问题。
但我的问题是,为什么在这种情况下不能使用命名参数

llew8vvj

llew8vvj1#

在代码中,您使用命名参数调用_filteringFunction方法,但方法定义不包含命名参数。这意味着您在方法调用中传递的参数名称与方法定义中的参数名称不匹配,从而导致错误。
若要修正这个问题,您可以移除方法呼叫中的参数名称,或更新方法定义以包含具名参数。以下是如何更新方法定义以包含具名参数的范例:

void _filteringFunction({bool gluten, bool lactose, bool vegan, bool vegetarian}) {
  setState(() {
    filters['gluten'] = gluten;
    filters['lactose'] = lactose;
    filters['vegan'] = vegan;
    filters['vegetarian'] = vegetarian;

    selectedMeals = DUMMY_MEALS.where((meal) {
      if (filters['gluten'] && !meal.isGlutenFree) {return false;}
      if (filters['lactose'] && !meal.isLactoseFree) {return false;}
      if (filters['vegan'] && !meal.isVegan) {return false;}
      if (filters['vegetarian'] && !meal.isVegetarian) {return false;}

      return true;
    }).toList();
  });
}

通过此更改,您可以像以前一样使用命名参数调用_filteringFunction方法,并且不会发生错误。
值得注意的是,命名参数在Dart中是可选的。如果希望允许使用命名参数调用方法,可以选择在方法定义中包含它们,但如果不需要,则不必包含它们。

相关问题