Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter Flatter忽略“中的返回语句”;如果;分支_Flutter_If Statement_Dart_Return - Fatal编程技术网

Flutter Flatter忽略“中的返回语句”;如果;分支

Flutter Flatter忽略“中的返回语句”;如果;分支,flutter,if-statement,dart,return,Flutter,If Statement,Dart,Return,我正在尝试使用PopupMenuButton小部件从对象列表创建一个过滤器。我认为逻辑是合理的,但flatter/Dart似乎忽略了下面代码块中名为“fliterFavs”的函数中“if分支”内的返回语句 当我选择“Favs”时,它会被识别为预期值,并且返回前的print语句工作正常 当我使用同一个return语句代替“if语句”之外的语句时,效果很好。我得到了预期的过滤数据集 我甚至尝试将其作为两个背对背的if语句,而不是下面看到的嵌套语句。它仍然不起作用 有什么想法吗 final List&

我正在尝试使用PopupMenuButton小部件从对象列表创建一个过滤器。我认为逻辑是合理的,但flatter/Dart似乎忽略了下面代码块中名为“fliterFavs”的函数中“if分支”内的返回语句

当我选择“Favs”时,它会被识别为预期值,并且返回前的print语句工作正常

当我使用同一个return语句代替“if语句”之外的语句时,效果很好。我得到了预期的过滤数据集

我甚至尝试将其作为两个背对背的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));
  }
}

最终列表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,
图标:图标(