feat: 旅行伙伴发放与编组、修复退登卡死、优化宽屏布局、加 CI
自动退出登录卡死:_performLogoutAndExit 只 pop() 一层,而解锁/收藏品页是 push
在 HomePage 之上的,退登后被弹回「风险」hub,同时 _loggingOut 仍为 true,
PopScope(canPop:false) + 返回键转圈形成死局。改为 popUntil(isFirst)。
旅行伙伴发不了:它是 ItemKind.Character = 9,与搭档 Partner = 10 是两种东西,
原先收藏品的类型列表 [1,2,3,10,11,12] 里根本没有 9。按客户端实现,角色不走
userItemList(ExportUserItems 不导出 itemKind 9),而是
upsertUserAll.userCharacterList 的 {characterId, level, awakening, useCount},
配 isNewCharacterList 一行一字符。新增发放与 5 槽 charaSlot 编组页,
含「把槽 0 复制到其他槽位」,并校验所选角色确为已拥有或本次待发放。
宽屏布局:各页只有 ConstrainedBox 限宽、没有居中容器,1440 窗口下内容贴左、
右侧大片空白。抽出 responsiveBody 统一居中;B50 预览改用按宽度适配
(InteractiveViewer constrained:false + FittedBox fitWidth),横屏下不再被
contain 缩成中间一小块,导出仍是原始 1762x1850。
CI:.github/workflows/build.yml 先跑 analyze+test 作为门槛,再产出
Windows exe、Android apk、iOS 未签名 ipa(macOS runner,无证书故不可安装)。
README 从 Flutter 模板改写为实际文档,含 path_provider/jni 与 JBR jlink
两个构建环境坑的说明。
This commit is contained in:
1 parent
ebd1fdddaa
commit
8dda399f76
24 files changed
+1832
-134
No files matched your search
@@ -6,6 +6,7 @@ import '../config/responsive.dart';
|
||||
import '../config/strings.dart';
|
||||
import '../config/title_server_config.dart';
|
||||
import 'collectibles_page.dart';
|
||||
import 'travel_partner_page.dart';
|
||||
import 'unlock_music_page.dart';
|
||||
|
||||
/// 高危功能中转页:导航到 UnlockMusic (解锁歌曲) / 收藏品获取。
|
||||
@@ -22,8 +23,8 @@ class HighRiskFeaturePage extends StatefulWidget {
|
||||
final int? loginId;
|
||||
final String? lastLoginDate;
|
||||
|
||||
/// 由 HomePage 负责发送 logout 包。
|
||||
final Future<void> Function()? onLogoutRequested;
|
||||
/// 完成后自动退出登录并返回标题页,由 HomePage 执行结算+退登+pop。
|
||||
final Future<void> Function()? onExitToTitle;
|
||||
|
||||
const HighRiskFeaturePage({
|
||||
super.key,
|
||||
@@ -32,7 +33,7 @@ class HighRiskFeaturePage extends StatefulWidget {
|
||||
this.loginDateTime,
|
||||
this.loginId,
|
||||
this.lastLoginDate,
|
||||
this.onLogoutRequested,
|
||||
this.onExitToTitle,
|
||||
});
|
||||
|
||||
@override
|
||||
@@ -99,7 +100,7 @@ class _HighRiskFeaturePageState extends State<HighRiskFeaturePage> {
|
||||
loginDateTime: widget.loginDateTime,
|
||||
loginId: widget.loginId,
|
||||
lastLoginDate: widget.lastLoginDate,
|
||||
onLogoutRequested: widget.onLogoutRequested,
|
||||
onExitToTitle: widget.onExitToTitle,
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -114,7 +115,21 @@ class _HighRiskFeaturePageState extends State<HighRiskFeaturePage> {
|
||||
loginDateTime: widget.loginDateTime,
|
||||
loginId: widget.loginId,
|
||||
lastLoginDate: widget.lastLoginDate,
|
||||
onLogoutRequested: widget.onLogoutRequested,
|
||||
onExitToTitle: widget.onExitToTitle,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _openTravelPartner() {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (_) => TravelPartnerPage(
|
||||
userId: widget.userId,
|
||||
cookies: widget.cookies,
|
||||
loginDateTime: widget.loginDateTime,
|
||||
loginId: widget.loginId,
|
||||
onExitToTitle: widget.onExitToTitle,
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -144,8 +159,8 @@ class _HighRiskFeaturePageState extends State<HighRiskFeaturePage> {
|
||||
|
||||
return SingleChildScrollView(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: ConstrainedBox(
|
||||
constraints: BoxConstraints(maxWidth: responsiveMaxWidth(context)),
|
||||
child: responsiveBody(
|
||||
context,
|
||||
child: Column(
|
||||
children: [
|
||||
if (widget.loginDateTime == null) _buildNotLoggedInBanner(theme),
|
||||
@@ -168,6 +183,14 @@ class _HighRiskFeaturePageState extends State<HighRiskFeaturePage> {
|
||||
desc: AppStrings.collectiblesFeatureDesc,
|
||||
onTap: _openCollectibles,
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
_buildNavCard(
|
||||
theme,
|
||||
icon: Icons.workspace_premium_outlined,
|
||||
title: AppStrings.travelPartnerFeatureTitle,
|
||||
desc: AppStrings.travelPartnerFeatureDesc,
|
||||
onTap: _openTravelPartner,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
Reference in new issue
Block a user