Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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 如何在build函数中同步运行map函数到Flatter中的无状态小部件?_Flutter_Dart - Fatal编程技术网

Flutter 如何在build函数中同步运行map函数到Flatter中的无状态小部件?

Flutter 如何在build函数中同步运行map函数到Flatter中的无状态小部件?,flutter,dart,Flutter,Dart,我试图在构建函数中运行map函数来创建一个对象列表,这些对象的id存在于另一个列表中,但它返回空列表 import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../providers/favourite_provider.dart'; import '../../providers/wallpaper_provider.dart'; import '../../mod

我试图在构建函数中运行map函数来创建一个对象列表,这些对象的id存在于另一个列表中,但它返回空列表

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import '../../providers/favourite_provider.dart';
import '../../providers/wallpaper_provider.dart';
import '../../models/wallpaper.dart';

class FavouriteScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final _selectedwallpaper = Provider.of<WallpaperProvider>(context).items;
    final _favids = Provider.of<FavouriteProvider>(context).favourites;

    var _favouritewallpapers = [];
    _favids.map((tx) {
      WallPaper res = _selectedwallpaper.firstWhere((t) => t.id == tx);
      _favouritewallpapers.add(res);
    });
    print(_favouritewallpapers);
    return Center(
      child: Text('THis is favourite screen'),
    );
  } 
}
导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
导入“../providers/favorite_provider.dart”;
导入“../providers/wallpaper_provider.dart”;
导入“../models/wallpaper.dart”;
类FavoriteScreen扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
最终_selectedwallpaper=提供(上下文)项;
final _favids=提供者(上下文)。收藏夹;
var_FavoriteWallpapers=[];
_最喜爱的地图((德克萨斯州){
壁纸分辨率=_selectedwallper.firstWhere((t)=>t.id==tx);
_收藏壁纸。添加(分辨率);
});
打印(您最喜欢的壁纸);
返回中心(
孩子:文本(“这是最喜欢的屏幕”),
);
} 
}

print语句返回空列表。如何确保它显示正确的结果。

在代码中,您应该使用
forEach()
而不是
map()
。这是因为
map
函数是惰性的-在您处理
map
的结果之前,它不会做任何事情,而您的代码不会这样做

我根据您的代码制作了一个示例:

@override
Widget build(BuildContext context) {
  final _selectedwallpaper = [ {"id": 1}, {"id": 2}];
  final _favids = [1];

  // INCORRECT
  var _favouritewallpapers = [];
  _favids.map((tx) {
    Object res = _selectedwallpaper.firstWhere((t) => t["id"] == tx);
    print("res=$res");
    _favouritewallpapers.add(res);
  });
  print(_favouritewallpapers);

  // CORRECT
  _favids.forEach((tx) {
    Object res = _selectedwallpaper.firstWhere((t) => t["id"] == tx);
    print("res=$res");
    _favouritewallpapers.add(res);
  });
  print(_favouritewallpapers);
  return Center(
    child: Text('THis is favourite screen'),
  );
} 
输出为:

[]
res={id: 1}
[{id: 1}]
您的代码可以进一步改进,如下所示:

_favouritewallpapers = _selectedwallpaper.where((t) => _favids.contains(t["id"])).toList();

事实上,我之前尝试过foreach,但当时不起作用,很可能是因为我没有完全重新启动。