Future Builderを使用してAPIからデータを取得するリストにお気に入りのボタンを追加しようとしています。ただし、InkWellウィジェットをクリックしてお気に入りとしてマークすると、リストがリロードされ、お気に入りボタンの色が変更されず、setState が_isFavorite値を変更しないようです
フューチャービルダー
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () => Navigator.of(context).pop(),
),
title: FittedBox(fit: BoxFit.fill, child: Text(getTranslated(context, 'derangement'))),
backgroundColor: Colors.red),
backgroundColor: Color(0xfff0f0f0),
body: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
SizedBox(height: 20),
buildHeader(widget.productName, Colors.lightBlue),
SizedBox(height: 20),
FutureBuilder<List>(
future: vapi.getDerangement(widget.endpoint, widget.productId),
initialData: List(),
builder: (context, snapshot) {
return futureHandler(snapshot, context, _expansionTile(snapshot));
},
),
],
),
);
}
リストビュー
Widget _expansionTile(AsyncSnapshot snapshot) {
return Flexible(
child: ListView.builder(
padding: const EdgeInsets.all(10.0),
itemCount: snapshot.data == null ? 0 : snapshot.data.length,
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemBuilder: (context, i) {
bool _isFavourite = snapshot.data[i].isFavourite;
return Row(
children: <Widget>[
InkWell(
splashColor: Colors.yellow,
highlightColor: Colors.red,
child: Icon(
_isFavourite ? Icons.favorite : Icons.favorite_border,
size: 40,
color: _isFavourite ? Colors.red : null,
),
onTap: () {
setState(() {
_isFavourite = !_isFavourite;
});
},
),
Expanded(
child: SingleChildScrollView(
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25),
color: Colors.white54,
),
child: ExpansionTile(
title:
Text(snapshot.data[i].substanceName, style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
subtitle: Text(snapshot.data[i].name),
children: <Widget>[
SizedBox(
height: 200,
child: SingleChildScrollView(child: Text(snapshot.data[i].references)),
),
],
),
margin: EdgeInsets.symmetric(vertical: 10, horizontal: 2),
padding: EdgeInsets.symmetric(vertical: 5, horizontal: 5),
)))
],
);
},
));
}