feat(mobile): flutter scaffold with env script and baseline nav

- scripts/flutter-env.sh: toolchain PATH/JAVA_HOME/ANDROID_HOME + pub 镜像 env
- apps/mobile: flutter create (com.photolive.photo_live, android+ios)
  - Android minSdk 24 / targetSdk 36;INTERNET 权限(main manifest,debug+release)
  - iOS Info.plist:本地网络 ATS 例外 + 相册/相机用途说明(zh+en)
- 依赖接入:riverpod / drift(+sqlite3_flutter_libs) / dio / secure_storage /
  image_picker / camera / qr_flutter / path_provider / path / intl
- l10n:l10n.yaml + app_zh/app_en arb(20 键),gen-l10n(zh 模板,非空 getter)
- 基线:Material 3 主题、/login→/home 命名路由、底部导航(相册/队列/设置桩)、
  locale provider 脚手架(Task 10 完成切换)
- flutter analyze 零问题;widget 测试通过;debug apk 构建成功
  (MuMu 冒烟因宿主 commit 内存耗尽未完成,Task 2 重试)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-19 00:22:04 +08:00
parent 5879552ecb
commit 8bc50e07ef
80 changed files with 3408 additions and 0 deletions
+34
View File
@@ -0,0 +1,34 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../l10n/app_localizations.dart';
import '../pages/home_page.dart';
import '../pages/login_page.dart';
import 'locale_controller.dart';
import 'theme.dart';
/// App 根组件:主题 + l10n 委托 + 基线路由。
///
/// 基线路由为命名路由(/login → /home);Task 3+ 随页面增长再评估
/// 是否迁移 go_router,当前保持零额外依赖。
class PhotoLiveApp extends ConsumerWidget {
const PhotoLiveApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final locale = ref.watch(localeSettingsProvider);
return MaterialApp(
onGenerateTitle: (context) => AppLocalizations.of(context).appName,
theme: AppTheme.light,
darkTheme: AppTheme.dark,
locale: locale,
supportedLocales: AppLocalizations.supportedLocales,
localizationsDelegates: AppLocalizations.localizationsDelegates,
routes: {
'/login': (context) => const LoginPage(),
'/home': (context) => const HomePage(),
},
home: const LoginPage(),
);
}
}
@@ -0,0 +1,16 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
/// App 语言设置(脚手架)。
///
/// `null` = 跟随系统;Task 10 补齐:持久化(settings 存储)、
/// 设置页交互与全部页面的 l10n 覆盖检查。
class LocaleSettings extends Notifier<Locale?> {
@override
Locale? build() => null;
void setLocale(Locale? locale) => state = locale;
}
final localeSettingsProvider =
NotifierProvider<LocaleSettings, Locale?>(LocaleSettings.new);
+17
View File
@@ -0,0 +1,17 @@
import 'package:flutter/material.dart';
/// 基础主题(Material 3,种子色)。完整视觉规范随后续任务迭代。
abstract final class AppTheme {
static const Color seedColor = Color(0xFF1A73E8);
static ThemeData get light => ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: seedColor),
);
static ThemeData get dark => ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: seedColor,
brightness: Brightness.dark,
),
);
}