git-subtree-dir: app git-subtree-mainline:6ebd902c6bgit-subtree-split:a11a668869
78 lines
2.1 KiB
Dart
78 lines
2.1 KiB
Dart
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import '../../core/auth/auth_provider.dart';
|
|
|
|
/// 服装分类(与后端校验一致)
|
|
const wardrobeCategories = ['上衣', '下装', '鞋', '配饰'];
|
|
|
|
const wardrobeSeasons = ['春', '夏', '秋', '冬', '四季'];
|
|
|
|
class WardrobeItemInfo {
|
|
final int id;
|
|
final String photoUrl;
|
|
final String category;
|
|
final String season;
|
|
final String styleTags;
|
|
final String colorInfo;
|
|
|
|
const WardrobeItemInfo({
|
|
required this.id,
|
|
required this.photoUrl,
|
|
required this.category,
|
|
required this.season,
|
|
required this.styleTags,
|
|
required this.colorInfo,
|
|
});
|
|
}
|
|
|
|
class WardrobeNotifier extends AsyncNotifier<List<WardrobeItemInfo>> {
|
|
@override
|
|
Future<List<WardrobeItemInfo>> build() async {
|
|
final api = ref.read(apiClientProvider);
|
|
final data = await api.get<Map<String, dynamic>>('/wardrobe/list');
|
|
final list = data['list'] as List<dynamic>? ?? [];
|
|
return list
|
|
.map((e) => WardrobeItemInfo(
|
|
id: (e['id'] as num).toInt(),
|
|
photoUrl: e['photo_url'] as String? ?? '',
|
|
category: e['category'] as String? ?? '',
|
|
season: e['season'] as String? ?? '',
|
|
styleTags: e['style_tags'] as String? ?? '',
|
|
colorInfo: e['color_info'] as String? ?? '',
|
|
))
|
|
.toList();
|
|
}
|
|
|
|
Future<void> upload(
|
|
String filePath, {
|
|
required String category,
|
|
String season = '',
|
|
String styleTags = '',
|
|
String colorInfo = '',
|
|
}) async {
|
|
final api = ref.read(apiClientProvider);
|
|
await api.upload('/wardrobe/upload', {
|
|
'category': category,
|
|
'season': season,
|
|
'style_tags': styleTags,
|
|
'color_info': colorInfo,
|
|
}, 'file', filePath);
|
|
await refresh();
|
|
}
|
|
|
|
Future<void> delete(int id) async {
|
|
final api = ref.read(apiClientProvider);
|
|
await api.post('/wardrobe/delete', {'id': id});
|
|
await refresh();
|
|
}
|
|
|
|
Future<void> refresh() async {
|
|
state = const AsyncLoading();
|
|
state = await AsyncValue.guard(build);
|
|
}
|
|
}
|
|
|
|
final wardrobeProvider =
|
|
AsyncNotifierProvider<WardrobeNotifier, List<WardrobeItemInfo>>(
|
|
WardrobeNotifier.new);
|