Вы фактически переопределяете _isFavIcon
для всех элементов.
Вам необходимо добавить в модель Offer
атрибут с именем isFavorite
, и в методе onTap вы переключите isFavorite
атрибут
вот полный рабочий пример для вашего дела
Модель предложения
class Offer {
// other attributes
bool isFavorite = false;
}
Виджет OfferList
class OfferList extends StatefulWidget {
final List<Offer> offers;
OfferList(this.offers);
@override
_OfferListState createState() => _OfferListState();
}
class _OfferListState extends State<OfferList> {
bool isPressed = true;
Icon _isNotFavIcon = new Icon(
Icons.favorite_border,
color: Colors.red,
);
Icon _isFavIcon = new Icon(
Icons.favorite,
color: Colors.red,
);
List<Offer> _offers;
@override
void initState() {
_offers = widget.offers;
super.initState();
}
@override
Widget build(BuildContext context) {
final mediaQuery = MediaQuery.of(context);
return Container(
height: 700,
child: ListView.builder(
itemBuilder: (ctx, index) {
return Stack(
children: <Widget>[
Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topRight,
end: Alignment.bottomLeft,
colors: [
Colors.white,
Colors.lightBlueAccent.withOpacity(0.2)
])),
width: mediaQuery.size.width,
child: Card(
child: Row(
children: <Widget>[
Container(
margin: EdgeInsets.symmetric(
vertical: 15,
horizontal: 15,
),
child: Container(
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.3),
spreadRadius: 1.2,
blurRadius: 7,
),
],
),
child: Image.asset(_offers[index].flag),
),
padding: EdgeInsets.all(5),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
width: 150,
child: Text(
_offers[index].title,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
),
Text(
'From: ' +
DateFormat.yMMMd()
.format(_offers[index].dateFrom),
style: TextStyle(
color: Colors.grey,
),
),
Text(
'To: ' +
DateFormat.yMMMd()
.format(_offers[index].dateTo),
style: TextStyle(
color: Colors.grey,
),
),
],
),
Padding(
padding: EdgeInsets.all(8.0),
child: Row(
children: <Widget>[
RaisedButton(
color: Colors.lightBlueAccent,
textColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(30.0),
),
child: Text('Open'),
onPressed: () {},
),
Container(
padding: EdgeInsets.only(left: 10),
child: InkWell(
onTap: () {
setState(() {
_offers[index].isFavorite =
!_offers[index].isFavorite;
});
},
child: _offers[index].isFavorite
? _isFavIcon
: _isNotFavIcon,
),
),
],
),
),
],
),
),
),
],
);
},
itemCount: _offers.length,
),
);
}
}