Initial commit
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
import 'dart:io' show Platform;
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../../../providers/di_providers.dart';
|
||||
import '../../../providers/emby_headers_provider.dart';
|
||||
import '../../../providers/session_provider.dart';
|
||||
import '../../../shared/mappers/media_image_url.dart';
|
||||
import '../../../shared/theme/app_theme.dart';
|
||||
import '../../../shared/utils/media_nav.dart';
|
||||
import '../../../shared/widgets/hover_scrollable_row.dart';
|
||||
import '../../../shared/widgets/media_poster_card.dart';
|
||||
import 'section_container.dart';
|
||||
|
||||
class SimilarSection extends ConsumerWidget {
|
||||
final String itemId;
|
||||
final bool embedded;
|
||||
|
||||
|
||||
final Widget? leading;
|
||||
|
||||
const SimilarSection({
|
||||
super.key,
|
||||
required this.itemId,
|
||||
this.embedded = false,
|
||||
this.leading,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final session = ref.watch(activeSessionProvider);
|
||||
if (session == null) return const SizedBox.shrink();
|
||||
final imageHeaders = ref.watch(embyImageHeadersProvider).value;
|
||||
final asyncItems = ref.watch(similarItemsDataProvider(itemId));
|
||||
|
||||
return asyncItems.when(
|
||||
loading: () => const SizedBox.shrink(),
|
||||
error: (error, stackTrace) => const SizedBox.shrink(),
|
||||
data: (items) {
|
||||
if (items.isEmpty) return const SizedBox.shrink();
|
||||
final sectionPad = SectionContainer.hPadOf(context);
|
||||
final listPadding = EdgeInsetsDirectional.fromSTEB(
|
||||
embedded ? 0.0 : sectionPad,
|
||||
0,
|
||||
sectionPad,
|
||||
0,
|
||||
);
|
||||
|
||||
final isAndroid = Platform.isAndroid;
|
||||
return SectionContainer(
|
||||
title: '相似推荐',
|
||||
embedded: embedded,
|
||||
leadingDivider: embedded,
|
||||
leading: leading,
|
||||
child: SizedBox(
|
||||
height: isAndroid ? 210 : 300,
|
||||
child: Theme(
|
||||
data: AppTheme.dark(),
|
||||
child: HoverScrollableRow(
|
||||
builder: (_, controller) => ListView.builder(
|
||||
controller: controller,
|
||||
scrollDirection: Axis.horizontal,
|
||||
padding: listPadding,
|
||||
itemCount: items.length,
|
||||
itemBuilder: (_, i) {
|
||||
final item = items[i];
|
||||
final imageUrl = EmbyImageUrl.primary(
|
||||
baseUrl: session.serverUrl,
|
||||
token: session.token,
|
||||
item: item,
|
||||
maxHeight: 480,
|
||||
);
|
||||
return Padding(
|
||||
padding: EdgeInsetsDirectional.only(
|
||||
end: i < items.length - 1 ? 12 : 0,
|
||||
),
|
||||
child: MediaPosterCard(
|
||||
item: item,
|
||||
imageUrl: imageUrl,
|
||||
width: isAndroid ? 105 : 160,
|
||||
showHoverPlayIcon: false,
|
||||
enableContextMenu: false,
|
||||
preloadImageUrl: EmbyImageUrl.detailBanner(
|
||||
baseUrl: session.serverUrl,
|
||||
token: session.token,
|
||||
item: item,
|
||||
),
|
||||
imageHeaders: imageHeaders,
|
||||
onTap: () => goMediaDetail(context, item),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user