76 lines
2.2 KiB
Dart
76 lines
2.2 KiB
Dart
// Author: fruit.com.cn
|
|
|
|
import 'dart:async';
|
|
|
|
import 'package:flutter/gestures.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
import '../../core/legal/legal_opener.dart';
|
|
import '../../core/legal/legal_page.dart';
|
|
import '../../core/theme/app_colors.dart';
|
|
import '../../l10n/app_localizations.dart';
|
|
|
|
const double _legalFontSize = 12;
|
|
|
|
/// 登录页底部的协议入口。点用户协议或隐私政策会打开对应语言的页面。
|
|
class AuthLegalLinks extends StatefulWidget {
|
|
const AuthLegalLinks({super.key, this.open});
|
|
|
|
/// 测试时可替换真正的跳转。
|
|
final Future<void> Function(String url)? open;
|
|
|
|
@override
|
|
State<AuthLegalLinks> createState() => _AuthLegalLinksState();
|
|
}
|
|
|
|
class _AuthLegalLinksState extends State<AuthLegalLinks> {
|
|
late final TapGestureRecognizer _termsTap = TapGestureRecognizer()
|
|
..onTap = () => _open(legalTermsPath);
|
|
late final TapGestureRecognizer _privacyTap = TapGestureRecognizer()
|
|
..onTap = () => _open(legalPrivacyPath);
|
|
|
|
@override
|
|
void dispose() {
|
|
_termsTap.dispose();
|
|
_privacyTap.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
void _open(String path) {
|
|
final url = legalPageUrl(path, Localizations.localeOf(context));
|
|
final custom = widget.open;
|
|
if (custom != null) {
|
|
unawaited(custom(url));
|
|
return;
|
|
}
|
|
unawaited(openLegalUrlOrNotify(context, url));
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final l10n = AppLocalizations.of(context)!;
|
|
final muted = TextStyle(color: AppColors.muted, fontSize: _legalFontSize, height: 1.6);
|
|
final link = muted.copyWith(color: AppColors.brandRed);
|
|
return Text.rich(
|
|
TextSpan(
|
|
style: muted,
|
|
children: [
|
|
TextSpan(text: l10n.authLegalLead),
|
|
const TextSpan(text: ' '),
|
|
TextSpan(text: l10n.authTerms, style: link, recognizer: _termsTap),
|
|
const TextSpan(text: ' '),
|
|
TextSpan(text: l10n.authLegalJoin),
|
|
const TextSpan(text: ' '),
|
|
TextSpan(
|
|
text: l10n.authPrivacy,
|
|
style: link,
|
|
recognizer: _privacyTap,
|
|
),
|
|
],
|
|
),
|
|
key: const Key('auth-legal'),
|
|
textAlign: TextAlign.center,
|
|
);
|
|
}
|
|
}
|