0

我试图在我的构建函数中运行 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'),
    );
  } 
}

print 语句返回空列表。我怎样才能确保它显示正确的结果。

4

1 回答 1

1

在您的代码中,您应该使用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();
于 2021-03-25T14:14:42.893 回答