mirror of
https://mirror.ghproxy.com/https://github.com/StarCitizenToolBox/app.git
synced 2024-12-23 10:03:43 +08:00
feat:riverpod 迁移 Index UI
This commit is contained in:
parent
348d072f6e
commit
6353591935
14
lib/app.dart
14
lib/app.dart
@ -13,6 +13,7 @@ import 'package:starcitizen_doctor/common/conf/const_conf.dart';
|
|||||||
import 'package:starcitizen_doctor/common/utils/log.dart';
|
import 'package:starcitizen_doctor/common/utils/log.dart';
|
||||||
import 'package:starcitizen_doctor/ui/splash_ui.dart';
|
import 'package:starcitizen_doctor/ui/splash_ui.dart';
|
||||||
import 'package:device_info_plus/device_info_plus.dart';
|
import 'package:device_info_plus/device_info_plus.dart';
|
||||||
|
import 'package:starcitizen_doctor/widgets/widgets.dart';
|
||||||
import 'package:uuid/uuid.dart';
|
import 'package:uuid/uuid.dart';
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
@ -23,6 +24,7 @@ import 'common/io/rs_http.dart';
|
|||||||
import 'common/rust/frb_generated.dart';
|
import 'common/rust/frb_generated.dart';
|
||||||
import 'common/utils/base_utils.dart';
|
import 'common/utils/base_utils.dart';
|
||||||
import 'data/app_version_data.dart';
|
import 'data/app_version_data.dart';
|
||||||
|
import 'ui/index_ui.dart';
|
||||||
import 'ui/settings/upgrade_dialog.dart';
|
import 'ui/settings/upgrade_dialog.dart';
|
||||||
|
|
||||||
part 'app.g.dart';
|
part 'app.g.dart';
|
||||||
@ -35,9 +37,13 @@ GoRouter router(RouterRef ref) {
|
|||||||
routes: [
|
routes: [
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: '/',
|
path: '/',
|
||||||
builder: (context, state) {
|
pageBuilder: (context, state) =>
|
||||||
return const SplashUI();
|
myPageBuilder(context, state, const SplashUI()),
|
||||||
},
|
),
|
||||||
|
GoRoute(
|
||||||
|
path: '/index',
|
||||||
|
pageBuilder: (context, state) =>
|
||||||
|
myPageBuilder(context, state, const IndexUI()),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
@ -179,7 +185,7 @@ class AppGlobalModel extends _$AppGlobalModel {
|
|||||||
|
|
||||||
if (r != true) {
|
if (r != true) {
|
||||||
if (!context.mounted) return false;
|
if (!context.mounted) return false;
|
||||||
showToast(context, "获取更新信息失败,请稍后重试。");
|
await showToast(context, "获取更新信息失败,请稍后重试。");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -24,7 +24,6 @@ _initWindow() async {
|
|||||||
TitleBarStyle.hidden,
|
TitleBarStyle.hidden,
|
||||||
windowButtonVisibility: false,
|
windowButtonVisibility: false,
|
||||||
);
|
);
|
||||||
await windowManager.hide();
|
|
||||||
await windowManager.center(animate: true);
|
await windowManager.center(animate: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
137
lib/ui/index_ui.dart
Normal file
137
lib/ui/index_ui.dart
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
import 'package:fluent_ui/fluent_ui.dart';
|
||||||
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:starcitizen_doctor/common/conf/const_conf.dart';
|
||||||
|
import 'package:starcitizen_doctor/widgets/widgets.dart';
|
||||||
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
|
class IndexUI extends HookConsumerWidget {
|
||||||
|
const IndexUI({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
|
final curIndex = useState(0);
|
||||||
|
return NavigationView(
|
||||||
|
appBar: NavigationAppBar(
|
||||||
|
automaticallyImplyLeading: false,
|
||||||
|
title: () {
|
||||||
|
return DragToMoveArea(
|
||||||
|
child: Align(
|
||||||
|
alignment: AlignmentDirectional.centerStart,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Image.asset(
|
||||||
|
"assets/app_logo_mini.png",
|
||||||
|
width: 20,
|
||||||
|
height: 20,
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
const SizedBox(width: 12),
|
||||||
|
const Text(
|
||||||
|
"SC汉化盒子 V${ConstConf.appVersion} ${ConstConf.isMSE ? "" : " Dev"}")
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}(),
|
||||||
|
actions: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: [
|
||||||
|
IconButton(
|
||||||
|
icon: Stack(
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(6),
|
||||||
|
child: Icon(
|
||||||
|
FluentIcons.installation,
|
||||||
|
size: 22,
|
||||||
|
color: Colors.white.withOpacity(.6),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
// if (model.aria2TotalTaskNum != 0)
|
||||||
|
// Positioned(
|
||||||
|
// bottom: 0,
|
||||||
|
// right: 0,
|
||||||
|
// child: Container(
|
||||||
|
// decoration: BoxDecoration(
|
||||||
|
// color: Colors.red,
|
||||||
|
// borderRadius: BorderRadius.circular(12),
|
||||||
|
// ),
|
||||||
|
// padding: const EdgeInsets.only(
|
||||||
|
// left: 6, right: 6, bottom: 1.5, top: 1.5),
|
||||||
|
// child: Text(
|
||||||
|
// "${model.aria2TotalTaskNum}",
|
||||||
|
// style: const TextStyle(
|
||||||
|
// fontSize: 8,
|
||||||
|
// color: Colors.white,
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// )),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
onPressed: () {},
|
||||||
|
// onPressed: model.goDownloader
|
||||||
|
),
|
||||||
|
const SizedBox(width: 24),
|
||||||
|
const WindowButtons()
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
pane: NavigationPane(
|
||||||
|
selected: curIndex.value,
|
||||||
|
items: getNavigationPaneItems(curIndex),
|
||||||
|
size: const NavigationPaneSize(openWidth: 64),
|
||||||
|
),
|
||||||
|
paneBodyBuilder: (item, child) {
|
||||||
|
return FocusTraversalGroup(
|
||||||
|
key: ValueKey('body_$curIndex'),
|
||||||
|
child: getPage(curIndex.value),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<IconData, String> get pageMenus => {
|
||||||
|
FluentIcons.home: "首页",
|
||||||
|
FluentIcons.game: "大厅",
|
||||||
|
FluentIcons.toolbox: "工具",
|
||||||
|
FluentIcons.settings: "设置",
|
||||||
|
FluentIcons.info: "关于",
|
||||||
|
};
|
||||||
|
|
||||||
|
List<NavigationPaneItem> getNavigationPaneItems(
|
||||||
|
ValueNotifier<int> curIndexState) {
|
||||||
|
return [
|
||||||
|
for (final kv in pageMenus.entries)
|
||||||
|
PaneItem(
|
||||||
|
icon: Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 6, bottom: 6, left: 4),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Icon(kv.key, size: 18),
|
||||||
|
const SizedBox(height: 3),
|
||||||
|
Text(
|
||||||
|
kv.value,
|
||||||
|
style: const TextStyle(fontSize: 11),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
// title: Text(kv.value),
|
||||||
|
body: const SizedBox.shrink(),
|
||||||
|
onTap: () => _onTapIndexMenu(kv.value, curIndexState),
|
||||||
|
),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget getPage(int value) {
|
||||||
|
return Center(
|
||||||
|
child: Text("$value"),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onTapIndexMenu(String value, ValueNotifier<int> curIndexState) {
|
||||||
|
final pageIndex =
|
||||||
|
pageMenus.values.toList().indexWhere((element) => element == value);
|
||||||
|
curIndexState.value = pageIndex;
|
||||||
|
}
|
||||||
|
}
|
@ -143,12 +143,12 @@ class UpgradeDialogUI extends HookConsumerWidget {
|
|||||||
|
|
||||||
Future<void> _getUpdateInfo(
|
Future<void> _getUpdateInfo(
|
||||||
BuildContext context,
|
BuildContext context,
|
||||||
targetVersion,
|
String targetVersion,
|
||||||
ValueNotifier<String?> description,
|
ValueNotifier<String?> description,
|
||||||
ValueNotifier<String> downloadUrl) async {
|
ValueNotifier<String> downloadUrl) async {
|
||||||
try {
|
try {
|
||||||
final r = await Api.getAppReleaseDataByVersionName(targetVersion);
|
final r = await Api.getAppReleaseDataByVersionName(targetVersion);
|
||||||
description = r["body"];
|
description.value = r["body"];
|
||||||
final assets = List.of(r["assets"] ?? []);
|
final assets = List.of(r["assets"] ?? []);
|
||||||
for (var asset in assets) {
|
for (var asset in assets) {
|
||||||
if (asset["name"].toString().endsWith("SETUP.exe")) {
|
if (asset["name"].toString().endsWith("SETUP.exe")) {
|
||||||
@ -207,6 +207,7 @@ class UpgradeDialogUI extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
if (!context.mounted) return;
|
if (!context.mounted) return;
|
||||||
_doCancel(context);
|
_doCancel(context);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
isUpgrading.value = true;
|
isUpgrading.value = true;
|
||||||
final fileName = "${appModel.getUpgradePath()}/next_SETUP.exe";
|
final fileName = "${appModel.getUpgradePath()}/next_SETUP.exe";
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
import 'package:fluent_ui/fluent_ui.dart';
|
import 'package:fluent_ui/fluent_ui.dart';
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:starcitizen_doctor/api/analytics.dart';
|
import 'package:starcitizen_doctor/api/analytics.dart';
|
||||||
import 'package:starcitizen_doctor/app.dart';
|
import 'package:starcitizen_doctor/app.dart';
|
||||||
import 'package:starcitizen_doctor/common/conf/const_conf.dart';
|
import 'package:starcitizen_doctor/common/conf/const_conf.dart';
|
||||||
import 'package:starcitizen_doctor/common/conf/url_conf.dart';
|
import 'package:starcitizen_doctor/common/conf/url_conf.dart';
|
||||||
import 'package:starcitizen_doctor/common/io/aria2c.dart';
|
|
||||||
import 'package:starcitizen_doctor/common/utils/log.dart';
|
import 'package:starcitizen_doctor/common/utils/log.dart';
|
||||||
import 'package:starcitizen_doctor/provider/aria2c.dart';
|
import 'package:starcitizen_doctor/provider/aria2c.dart';
|
||||||
import 'package:starcitizen_doctor/widgets/widgets.dart';
|
import 'package:starcitizen_doctor/widgets/widgets.dart';
|
||||||
@ -72,11 +72,7 @@ class SplashUI extends HookConsumerWidget {
|
|||||||
await appModel.checkUpdate(context);
|
await appModel.checkUpdate(context);
|
||||||
stepState.value = 2;
|
stepState.value = 2;
|
||||||
ref.read(aria2cModelProvider);
|
ref.read(aria2cModelProvider);
|
||||||
// Navigator.pushAndRemoveUntil(
|
if (!context.mounted) return;
|
||||||
// context!,
|
context.go("/index");
|
||||||
// BaseUIContainer(
|
|
||||||
// uiCreate: () => IndexUI(),
|
|
||||||
// modelCreate: () => IndexUIModel()).makeRoute(context!),
|
|
||||||
// (route) => false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import 'package:fluent_ui/fluent_ui.dart';
|
import 'package:fluent_ui/fluent_ui.dart';
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:url_launcher/url_launcher_string.dart';
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
import 'package:markdown_widget/config/all.dart';
|
import 'package:markdown_widget/config/all.dart';
|
||||||
@ -97,3 +98,23 @@ List<Widget> makeMarkdownView(String description, {String? attachmentsUrl}) {
|
|||||||
})
|
})
|
||||||
]));
|
]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CustomTransitionPage<T> myPageBuilder<T>(
|
||||||
|
BuildContext context, GoRouterState state, Widget child) {
|
||||||
|
return CustomTransitionPage(
|
||||||
|
child: child,
|
||||||
|
transitionsBuilder: (BuildContext context, Animation<double> animation,
|
||||||
|
Animation<double> secondaryAnimation, Widget child) {
|
||||||
|
return Semantics(
|
||||||
|
scopesRoute: true,
|
||||||
|
explicitChildNodes: true,
|
||||||
|
child: EntrancePageTransition(
|
||||||
|
animation: CurvedAnimation(
|
||||||
|
parent: animation,
|
||||||
|
curve: FluentTheme.of(context).animationCurve,
|
||||||
|
),
|
||||||
|
child: child,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user