这是用户选择一个项目作为最爱的地方:
class ItemCard extends StatefulWidget {
ValueKey key;
ItemCard(this.key) : super(key: key);
@override
State<ItemCard> createState() => _ItemCardState();
}
class _ItemCardState extends State<ItemCard> {
late SharedPreferences pref;
List<String> favs = [];
getPref() async {
pref = await SharedPreferences.getInstance();
setState(() {
favs = pref.getStringList('favorited') ?? [];
});
}
@override
void didChangeDependencies() {
getPref();
super.didChangeDependencies();
}
@override
Widget build(BuildContext context) {
final item = Provider.of<Item>(context, listen: false);
bool isFav = favs.any((element) => element == item.id);
if (isFav && item.isFavorite == false) {
item.toggleFavoriteStatus();
}
return Directionality(
///some code
Consumer<Item>(
builder: (ctx, item, child) => InkWell(
onTap: () async {
List<String> favoritedItems = [];
favoritedItems
.addAll(pref.getStringList('favorited') ?? []);
if (isFav == true) {
favoritedItems
.removeWhere((element) => element == item.id);
pref.setStringList(
'favorited', [...favoritedItems, item.id as String]);
print('item.id: ${item.id}');
}
item.toggleFavoriteStatus();
},
child: Container(
width: 40,
height: 40,
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Colors.white60,
),
child: Center(
child: Icon(item.isFavorite ? Icons.favorite : Icons.favorite_border, color: Colors.white,),
),
),
),
),
],
),
);
}
}
这是“收藏夹项目”屏幕的代码:
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:provider/provider.dart';
import '../provider/items.dart';
import '../widget/itemCard.dart';
class FavoritesScreen extends StatefulWidget {
const FavoritesScreen({Key? key}) : super(key: key);
static const routeName = '/Favorites';
@override
_FavoritesScreenState createState() => _FavoritesScreenState();
}
class _FavoritesScreenState extends State<FavoritesScreen> {
late SharedPreferences pref;
List<String> favoriteItemsId = [];
getPref() async {
pref = await SharedPreferences.getInstance();
setState(() {
favoriteItemsId = pref.getStringList('favorited') ?? [];
print("/////////////////////ssssssssssssdddddddddddddsssssssgffgg" +
pref.getStringList('favorited').toString());
});
}
@override
initState() {
getPref();
super.initState();
}
@override
Widget build(BuildContext context) {
final favoriteItems = Provider.of<Items>(context).items;
return Directionality(
textDirection: TextDirection.rtl,
child: Scaffold(
body: favoriteItemsId.isEmpty
? const Center(
child: Text('Favorites!'),
)
: GridView.builder(
itemBuilder: (ctx, index) {
bool fav = favoriteItemsId
.any((element) => element == favoriteItems[index].id);
return fav
? ChangeNotifierProvider.value(
value: favoriteItems[index],
child: ItemCard(
ValueKey(favoriteItems[index].id),
),
)
: Container();
},
itemCount: favoriteItems.length,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 8,
mainAxisSpacing: 8,
),
),
),
);
}
}
这是Item
class:
class Item with ChangeNotifier {
final String? title;
final String? author;
final String? id;
final String? category;
final String? content;
final String? startColor;
final String? endColor;
bool isFavorite;
Item({
@required this.title,
@required this.author,
@required this.id,
@required this.category,
@required this.content,
@required this.startColor,
@required this.endColor,
this.isFavorite = false,
});
void toggleFavoriteStatus() {
isFavorite = !isFavorite;
notifyListeners();
}
}