Flutter Flatter忽略“中的返回语句”;如果;分支
我正在尝试使用PopupMenuButton小部件从对象列表创建一个过滤器。我认为逻辑是合理的,但flatter/Dart似乎忽略了下面代码块中名为“fliterFavs”的函数中“if分支”内的返回语句 当我选择“Favs”时,它会被识别为预期值,并且返回前的print语句工作正常 当我使用同一个return语句代替“if语句”之外的语句时,效果很好。我得到了预期的过滤数据集 我甚至尝试将其作为两个背对背的if语句,而不是下面看到的嵌套语句。它仍然不起作用 有什么想法吗Flutter Flatter忽略“中的返回语句”;如果;分支,flutter,if-statement,dart,return,Flutter,If Statement,Dart,Return,我正在尝试使用PopupMenuButton小部件从对象列表创建一个过滤器。我认为逻辑是合理的,但flatter/Dart似乎忽略了下面代码块中名为“fliterFavs”的函数中“if分支”内的返回语句 当我选择“Favs”时,它会被识别为预期值,并且返回前的print语句工作正常 当我使用同一个return语句代替“if语句”之外的语句时,效果很好。我得到了预期的过滤数据集 我甚至尝试将其作为两个背对背的if语句,而不是下面看到的嵌套语句。它仍然不起作用 有什么想法吗 final List&
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));
}
}
最终列表FAVPProducts=[];
小部件过滤器AVS(值){
装载的产品。forEach((i){
如果(i.isFavorite==true){
favProducts.add(i);
如果(值=“FAV”){
印刷品(价值);
返回buildGrid(favProducts);
}
}
});
返回buildGrid(加载的产品);
}
小部件构建网格(列表新建列表){
返回GridView.builder(
填充:常数边集全部(10.0),
itemCount:newList.length,
itemBuilder:(ctx,i)=>ProductItem(
newList[i].id,
新列表[i]。标题,
newList[i].imageUrl,
),
gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:2,
儿童方面:3/2,
横轴间距:10,
平均间距:10,
),
);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“MyShop”),
行动:[
弹出菜单按钮(
当选:(val){
滤波器avs(val);
},
图标:图标(
图标。更多信息,
),
itemBuilder:(上下文)=>[
PopupMenuItem(
子项:文本(“FAV”),
价值:“Favs”,
),
PopupMenuItem(
子项:文本(“全部”),
值:“全部”,
),
],
),
],
),
//在项目生成器上使用过滤器
正文:filterFavs(上下文));
}
}
考虑一下您所指的return返回的函数。它返回到传递给forEach
方法的匿名函数,而不是像您所期望的那样返回到filterFavs
。这不是颤振/飞镖的问题,而是你期望的问题
您可以使用每种语法的备选方案来解决此问题:
小部件过滤器AVS(值){
对于(装载产品中的var i){
如果(i.isFavorite==true){
favProducts.add(i);
如果(值=“FAV”){
印刷品(价值);
返回buildGrid(favProducts);
}
}
}
返回buildGrid(加载的产品);
}
克里斯托弗·摩尔感谢您的帮助,这里是现在可以使用的最终解决方案
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));
}
}
导入“包装:颤振/材料.省道”;
导入“../models/product.dart”;
导入“../widgets/product_item.dart”;
类ProductsOverviewScreen扩展StatefulWidget{
@凌驾
_ProductsOverviewScreenState createState()=>\u ProductsOverviewScreenState();
}
类_productsOverviewsCrenstate扩展状态{
列表选项=[“FAV”,“所有”];
字符串_choice='';
void\u select(用户选择){
设置状态(){
_选择=用户选择;
打印(_选择);
});
}
已加载产品的最终列表=[
产品(
id:'p1',
标题:“红衫军”,
描述:“一件红色衬衫——它很红!”,
价格:29.99,
是的,
图像URL:
'https://cdn.pixabay.com/photo/2016/10/02/22/17/red-t-shirt-1710578_1280.jpg',
),
产品(
id:'p2',
标题:"长裤",,
描述:“一条漂亮的裤子。”,
价格:59.99,
是的,
图像URL:
'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Trousers%2C_dress_%28AM_1960.022-8%29.jpg/512px长裤%2C\u连衣裙\uu28am\u 1960.022-8%29.jpg',
),
产品(
id:'p3',
标题:"黄围巾",,
描述:“温暖舒适——正是你冬天所需要的。”,
售价:19.99,
我最喜欢的是:假,
图像URL:
'https://live.staticflickr.com/4043/4438260868_cc79b3369d_z.jpg',
),
产品(
id:'p4',
标题:"一锅",,
描述:“准备你想要的任何食物。”,
价格:49.99,
我最喜欢的是:假,
图像URL:
'https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Cast-Iron-Pan.jpg/1024px-Cast-Iron-Pan.jpg',
),
];
列出FAVPProducts=[];
小部件过滤器AVS(值){
if(favProducts.isEmpty){
//这是为了防止项目被无限地添加到favProducts中
//如果用户多次选择FAV
对于(装载产品中的var i){
如果(i.isFavorite==true){
favProducts.add(i);
}
}
}
如果(值=“FAV”){
印刷品(价值);
返回buildGrid(favProducts);
}
favProducts=[];
返回buildGrid(加载的产品);
}
小部件构建网格(列表新建列表){
返回GridView.builder(
填充:常数边集全部(10.0),
itemCount:newList.length,
itemBuilder:(ctx,i)=>ProductItem(
newList[i].id,
新列表[i]。标题,
newList[i].imageUrl,
),
gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:2,
儿童方面:3/2,
横轴间距:10,
平均间距:10,
),
);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“MyShop”),
行动:[
弹出菜单按钮(
标高:3.2,
initialValue:选项[1],
onSelected:_select,
图标:图标(