fix:优化使用常用技术框架
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
|
||||
import '../data/providers.dart';
|
||||
import '../features/detail/report_detail_page.dart';
|
||||
import '../features/feed/feed_page.dart';
|
||||
import '../features/institutions/institution_detail_page.dart';
|
||||
import '../features/institutions/institutions_page.dart';
|
||||
import '../features/listen/listen_page.dart';
|
||||
import '../features/profile/profile_page.dart';
|
||||
import '../features/reports/reports_page.dart';
|
||||
import '../features/shell_page.dart';
|
||||
import '../theme/wise_tokens.dart';
|
||||
import 'app_routes.dart';
|
||||
|
||||
final routerProvider = Provider<GoRouter>((ref) {
|
||||
final dataSource = ref.read(reportDataSourceProvider);
|
||||
|
||||
return GoRouter(
|
||||
initialLocation: AppRoutes.home,
|
||||
routes: [
|
||||
ShellRoute(
|
||||
builder: (context, state, child) =>
|
||||
ShellPage(currentPath: state.matchedLocation, child: child),
|
||||
routes: [
|
||||
GoRoute(
|
||||
path: AppRoutes.home,
|
||||
builder: (context, state) => _TabSurface(
|
||||
child: Consumer(
|
||||
builder: (context, ref, _) {
|
||||
final player = ref.watch(audioPlayerControllerProvider);
|
||||
final controller = ref.read(
|
||||
audioPlayerControllerProvider.notifier,
|
||||
);
|
||||
return FeedPage(
|
||||
dataSource: dataSource,
|
||||
onPlay: controller.startFromItem,
|
||||
player: player,
|
||||
onStartModuleAudio: controller.startModuleAudio,
|
||||
onToggleAudio: controller.toggleAudio,
|
||||
onSeekAudio: controller.seekAudio,
|
||||
onSpeed: controller.cycleSpeed,
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
GoRoute(
|
||||
path: AppRoutes.reports,
|
||||
builder: (context, state) => _TabSurface(
|
||||
child: Consumer(
|
||||
builder: (context, ref, _) {
|
||||
final player = ref.watch(audioPlayerControllerProvider);
|
||||
final controller = ref.read(
|
||||
audioPlayerControllerProvider.notifier,
|
||||
);
|
||||
return ReportsPage(
|
||||
dataSource: dataSource,
|
||||
onPlay: controller.startFromItem,
|
||||
player: player,
|
||||
onStartModuleAudio: controller.startModuleAudio,
|
||||
onToggleAudio: controller.toggleAudio,
|
||||
onSeekAudio: controller.seekAudio,
|
||||
onSpeed: controller.cycleSpeed,
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
GoRoute(
|
||||
path: AppRoutes.institutions,
|
||||
builder: (context, state) =>
|
||||
_TabSurface(child: InstitutionsPage(dataSource: dataSource)),
|
||||
),
|
||||
GoRoute(
|
||||
path: AppRoutes.listen,
|
||||
builder: (context, state) => _TabSurface(
|
||||
child: Consumer(
|
||||
builder: (context, ref, _) {
|
||||
final controller = ref.read(
|
||||
audioPlayerControllerProvider.notifier,
|
||||
);
|
||||
return ListenPage(
|
||||
dataSource: dataSource,
|
||||
onPlay: controller.startFromItem,
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
GoRoute(
|
||||
path: AppRoutes.profile,
|
||||
builder: (context, state) =>
|
||||
_TabSurface(child: ProfilePage(dataSource: dataSource)),
|
||||
),
|
||||
],
|
||||
),
|
||||
GoRoute(
|
||||
path: AppRoutes.reportDetail,
|
||||
builder: (context, state) {
|
||||
final id = state.pathParameters['id'] ?? '';
|
||||
final args = state.extra as ReportDetailRouteArgs?;
|
||||
return Consumer(
|
||||
builder: (context, ref, _) {
|
||||
final player = ref.watch(audioPlayerControllerProvider);
|
||||
final controller = ref.read(
|
||||
audioPlayerControllerProvider.notifier,
|
||||
);
|
||||
return ReportDetailPage(
|
||||
reportId: id,
|
||||
dataSource: args?.dataSource ?? dataSource,
|
||||
player: player,
|
||||
onStartAudio: args?.onStartAudio ?? controller.startModuleAudio,
|
||||
onToggleAudio: args?.onToggleAudio ?? controller.toggleAudio,
|
||||
onSeekAudio: args?.onSeekAudio ?? controller.seekAudio,
|
||||
onSpeed: args?.onSpeed ?? controller.cycleSpeed,
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
GoRoute(
|
||||
path: AppRoutes.institutionDetail,
|
||||
builder: (context, state) {
|
||||
final id = state.pathParameters['id'] ?? '';
|
||||
final args = state.extra as InstitutionDetailRouteArgs?;
|
||||
return InstitutionDetailPage(
|
||||
institutionId: id,
|
||||
dataSource: args?.dataSource ?? dataSource,
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
class _TabSurface extends StatelessWidget {
|
||||
const _TabSurface({required this.child});
|
||||
|
||||
final Widget child;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ColoredBox(color: WiseColors.canvas, child: child);
|
||||
}
|
||||
}
|
||||
+63
-21
@@ -1,32 +1,78 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
||||
import '../data/api/report_data_source.dart';
|
||||
import '../data/models/models.dart';
|
||||
import '../features/detail/report_detail_page.dart';
|
||||
import '../features/institutions/institution_detail_page.dart';
|
||||
import '../widgets/mini_player.dart';
|
||||
|
||||
abstract final class AppRoutes {
|
||||
static const home = '/';
|
||||
static const reports = '/reports';
|
||||
static const institutions = '/institutions';
|
||||
static const listen = '/listen';
|
||||
static const profile = '/profile';
|
||||
static const reportDetail = '/reports/:id';
|
||||
static const institutionDetail = '/institutions/:id';
|
||||
|
||||
static String reportDetailPath(String id) => '/reports/$id';
|
||||
static String institutionDetailPath(String id) => '/institutions/$id';
|
||||
}
|
||||
|
||||
class ReportDetailRouteArgs {
|
||||
const ReportDetailRouteArgs({
|
||||
required this.dataSource,
|
||||
required this.player,
|
||||
required this.onStartAudio,
|
||||
required this.onToggleAudio,
|
||||
required this.onSeekAudio,
|
||||
required this.onSpeed,
|
||||
});
|
||||
|
||||
final ReportDataSource dataSource;
|
||||
final PlayerStateModel player;
|
||||
final void Function(
|
||||
String audioId,
|
||||
String reportId,
|
||||
String title,
|
||||
int durationSec,
|
||||
)?
|
||||
onStartAudio;
|
||||
final VoidCallback? onToggleAudio;
|
||||
final void Function(int delta)? onSeekAudio;
|
||||
final VoidCallback? onSpeed;
|
||||
}
|
||||
|
||||
class InstitutionDetailRouteArgs {
|
||||
const InstitutionDetailRouteArgs({required this.dataSource});
|
||||
|
||||
final ReportDataSource dataSource;
|
||||
}
|
||||
|
||||
void openReportDetail(
|
||||
BuildContext context,
|
||||
ReportDataSource dataSource,
|
||||
ReportCardModel report, {
|
||||
PlayerStateModel player = const PlayerStateModel(),
|
||||
void Function(String audioId, String reportId, String title, int durationSec)? onStartAudio,
|
||||
void Function(
|
||||
String audioId,
|
||||
String reportId,
|
||||
String title,
|
||||
int durationSec,
|
||||
)?
|
||||
onStartAudio,
|
||||
VoidCallback? onToggleAudio,
|
||||
void Function(int delta)? onSeekAudio,
|
||||
VoidCallback? onSpeed,
|
||||
}) {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (_) => ReportDetailPage(
|
||||
reportId: report.id,
|
||||
dataSource: dataSource,
|
||||
player: player,
|
||||
onStartAudio: onStartAudio,
|
||||
onToggleAudio: onToggleAudio,
|
||||
onSeekAudio: onSeekAudio,
|
||||
onSpeed: onSpeed,
|
||||
),
|
||||
context.push(
|
||||
AppRoutes.reportDetailPath(report.id),
|
||||
extra: ReportDetailRouteArgs(
|
||||
dataSource: dataSource,
|
||||
player: player,
|
||||
onStartAudio: onStartAudio,
|
||||
onToggleAudio: onToggleAudio,
|
||||
onSeekAudio: onSeekAudio,
|
||||
onSpeed: onSpeed,
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -36,12 +82,8 @@ void openInstitutionDetail(
|
||||
ReportDataSource dataSource,
|
||||
String institutionId,
|
||||
) {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (_) => InstitutionDetailPage(
|
||||
institutionId: institutionId,
|
||||
dataSource: dataSource,
|
||||
),
|
||||
),
|
||||
context.push(
|
||||
AppRoutes.institutionDetailPath(institutionId),
|
||||
extra: InstitutionDetailRouteArgs(dataSource: dataSource),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user