Flutter 如何在build函数中同步运行map函数到Flatter中的无状态小部件?
我试图在构建函数中运行map函数来创建一个对象列表,这些对象的id存在于另一个列表中,但它返回空列表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
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,但当时不起作用,很可能是因为我没有完全重新启动。