| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- import 'package:flutter/material.dart';
- import 'package:flutter_riverpod/flutter_riverpod.dart';
- import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart';
- import 'package:go_router/go_router.dart';
- import '../../../core/l10n/app_localizations.dart';
- import '../../../providers/help_center_provider.dart';
- /// 协议详情页面
- /// 路由: /protocol,通过 GoRouterState.extra 传入 ProtocolArgs。
- class ProtocolScreen extends ConsumerWidget {
- const ProtocolScreen({
- super.key,
- required this.title,
- this.categoryCode = 'PROTOCOL',
- });
- /// 协议标题,用于在列表中匹配对应条目(如 "服务条款");
- /// 若为空则显示该分类下的第一条内容。
- final String title;
- /// CMS 分类码:'PROTOCOL'(注册协议)或 'FOLLOW_PROTOCOL'(交易员协议)
- final String categoryCode;
- @override
- Widget build(BuildContext context, WidgetRef ref) {
- final cs = Theme.of(context).colorScheme;
- final asyncData = ref.watch(protocolByTitleProvider((categoryCode, title)));
- // AppBar 标题:有明确 title 时用 title,否则加载后用文章标题
- final appBarTitle = title.isNotEmpty
- ? title
- : asyncData.valueOrNull?.title ?? AppLocalizations.of(context)!.protocolDetail;
- return Scaffold(
- appBar: AppBar(
- leading: IconButton(
- icon: const Icon(Icons.chevron_left, size: 28),
- onPressed: () => context.pop(),
- ),
- title: Text(
- appBarTitle,
- style: const TextStyle(fontSize: 17, fontWeight: FontWeight.w600),
- ),
- centerTitle: true,
- ),
- body: asyncData.when(
- loading: () => const Center(child: CircularProgressIndicator()),
- error: (_, __) => Center(
- child: Text(AppLocalizations.of(context)!.loadFailed, style: TextStyle(color: cs.onSurface.withAlpha(153))),
- ),
- data: (item) {
- if (item == null || item.content.isEmpty) {
- return Center(
- child: Text(AppLocalizations.of(context)!.noContent, style: TextStyle(color: cs.onSurface.withAlpha(153))),
- );
- }
- return SingleChildScrollView(
- padding: const EdgeInsets.all(16),
- child: HtmlWidget(
- item.content,
- textStyle: TextStyle(
- color: cs.onSurface,
- fontSize: 14,
- height: 1.8,
- ),
- ),
- );
- },
- ),
- );
- }
- }
- /// 路由 extra 参数
- class ProtocolArgs {
- const ProtocolArgs({required this.title, this.categoryCode = 'PROTOCOL'});
- final String title;
- final String categoryCode;
- }
|