颤振忽略分支"if"返回语句



我正试图使用PopupMenuButton小部件从对象列表中创建一个过滤器。我认为逻辑是合理的,但Flutter/Dat似乎忽略了我的函数"if分支"中的return语句;fliterFavs";在下面的代码块中。

当我选择";Favs";它被识别为预期的,并且返回之前的打印语句工作正常。

当我在"if语句"之外的地方使用相同的return语句时,效果很好。我得到了我期望的过滤后的数据集。

我甚至尝试过将其作为两个背靠背的if语句,而不是您在下面看到的嵌套语句。它仍然不起作用。

有什么想法吗?

final List<Product> favProducts = [];
Widget filterFavs(value) {
loadedProducts.forEach((i) {
if (i.isFavorite == true) {
favProducts.add(i);
if (value == "Favs") {
print(value);
return buildGrid(favProducts);
}
}
});
return buildGrid(loadedProducts);
}
Widget buildGrid(List newList) {
return GridView.builder(
padding: const EdgeInsets.all(10.0),
itemCount: newList.length,
itemBuilder: (ctx, i) => ProductItem(
newList[i].id,
newList[i].title,
newList[i].imageUrl,
),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 3 / 2,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('MyShop'),
actions: <Widget>[
PopupMenuButton(
onSelected: (val) {
filterFavs(val);
},
icon: Icon(
Icons.more_vert,
),
itemBuilder: (context) => [
PopupMenuItem(
child: Text("Favs"),
value: "Favs",
),
PopupMenuItem(
child: Text("All"),
value: "All",
),
],
),
],
),
//use a filter on the item builder
body: filterFavs(context));
}
}

想想您所引用的返回所返回的函数。它返回到传递给forEach方法的匿名函数,而不是像您所期望的那样传递到filterFavs。这不是飞镖/飞镖的问题,而是你的期望值的问题。

您可以使用每种语法的替代方案来解决此问题:

Widget filterFavs(value) {
for(var i in loadedProducts) {
if (i.isFavorite == true) {
favProducts.add(i);
if (value == "Favs") {
print(value);
return buildGrid(favProducts);
}
}
}
return buildGrid(loadedProducts);
}

Christopher Moore感谢您的帮助,这是目前有效的最终解决方案。

import 'package:flutter/material.dart';
import '../models/product.dart';
import '../widgets/product_item.dart';
class ProductsOverviewScreen extends StatefulWidget {
@override
_ProductsOverviewScreenState createState() => _ProductsOverviewScreenState();
}
class _ProductsOverviewScreenState extends State<ProductsOverviewScreen> {
List choices = ["Favs", "All"];
String _choice = '';
void _select(userChoice) {
setState(() {
_choice = userChoice;
print(_choice);
});
}
final List<Product> loadedProducts = [
Product(
id: 'p1',
title: 'Red Shirt',
description: 'A red shirt - it is pretty red!',
price: 29.99,
isFavorite: true,
imageUrl:
'https://cdn.pixabay.com/photo/2016/10/02/22/17/red-t-shirt-1710578_1280.jpg',
),
Product(
id: 'p2',
title: 'Trousers',
description: 'A nice pair of trousers.',
price: 59.99,
isFavorite: true,
imageUrl:
'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Trousers%2C_dress_%28AM_1960.022-8%29.jpg/512px-Trousers%2C_dress_%28AM_1960.022-8%29.jpg',
),
Product(
id: 'p3',
title: 'Yellow Scarf',
description: 'Warm and cozy - exactly what you need for the winter.',
price: 19.99,
isFavorite: false,
imageUrl:
'https://live.staticflickr.com/4043/4438260868_cc79b3369d_z.jpg',
),
Product(
id: 'p4',
title: 'A Pan',
description: 'Prepare any meal you want.',
price: 49.99,
isFavorite: false,
imageUrl:
'https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Cast-Iron-Pan.jpg/1024px-Cast-Iron-Pan.jpg',
),
];
List<Product> favProducts = [];
Widget filterFavs(value) {
if (favProducts.isEmpty) {
// this is to prevent items from being infinitely added to favProducts
//if user selects Favs more than once
for (var i in loadedProducts) {
if (i.isFavorite == true) {
favProducts.add(i);
}
}
}
if (value == "Favs") {
print(value);
return buildGrid(favProducts);
}
favProducts = [];
return buildGrid(loadedProducts);
}
Widget buildGrid(List newList) {
return GridView.builder(
padding: const EdgeInsets.all(10.0),
itemCount: newList.length,
itemBuilder: (ctx, i) => ProductItem(
newList[i].id,
newList[i].title,
newList[i].imageUrl,
),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 3 / 2,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('MyShop'),
actions: <Widget>[
PopupMenuButton(
elevation: 3.2,
initialValue: choices[1],
onSelected: _select,
icon: Icon(
Icons.more_vert,
),
itemBuilder: (context) => [
PopupMenuItem(
child: Text(choices[0]),
value: choices[0],
),
PopupMenuItem(
child: Text(choices[1]),
value: choices[1],
),
]),
],
),
//use a filter on the item builder
body: filterFavs(_choice));
}
}

最新更新