首次远程推送

This commit is contained in:
2026-09-27 23:40:22 +08:00
parent 2e0bf3c784
commit 8afa47952a
70 changed files with 8603 additions and 4502 deletions
+64 -11
View File
@@ -7,10 +7,12 @@ import 'package:flutter_localizations/flutter_localizations.dart';
import '../core/ambience.dart';
import '../data/app_preferences_store.dart';
import '../data/focus_seed_store.dart';
import '../features/onboarding/welcome_screen.dart';
import '../features/shell/focus_seed_home.dart';
import '../l10n/generated/app_localizations.dart';
import '../models/appearance_preference.dart';
import '../models/language_preference.dart';
import '../widgets/loading_view.dart';
import 'app_theme.dart';
@visibleForTesting
@@ -19,10 +21,16 @@ Locale focusSeedDefaultLocale({bool isRelease = kReleaseMode}) {
}
class FocusSeedApp extends StatefulWidget {
const FocusSeedApp({this.locale, this.focusSeedStore, super.key});
const FocusSeedApp({
this.locale,
this.focusSeedStore,
this.showWelcomeOnFirstRun = true,
super.key,
});
final Locale? locale;
final FocusSeedStore? focusSeedStore;
final bool showWelcomeOnFirstRun;
@override
State<FocusSeedApp> createState() => _FocusSeedAppState();
@@ -33,6 +41,10 @@ class _FocusSeedAppState extends State<FocusSeedApp>
final _preferencesStore = AppPreferencesStore();
AppearancePreference _appearance = AppearancePreference.system;
LanguagePreference _language = LanguagePreference.defaultLocale;
bool _onboardingComplete = true;
bool _landingSetupComplete = true;
bool _showLandingSetup = false;
bool _preferencesLoaded = false;
DayPhase _dayPhase = dayPhaseFor(DateTime.now());
Timer? _phaseTimer;
@@ -52,14 +64,25 @@ class _FocusSeedAppState extends State<FocusSeedApp>
}
Future<void> _loadPreferences() async {
final appearance = await _preferencesStore.loadAppearance();
final language = await _preferencesStore.loadLanguage();
final (appearance, language, firstRunProgress) =
await (
_preferencesStore.loadAppearance(),
_preferencesStore.loadLanguage(),
_preferencesStore.loadFirstRunProgress(),
).wait;
if (!mounted) {
return;
}
setState(() {
_appearance = appearance;
_language = language;
_onboardingComplete = firstRunProgress.onboardingComplete;
_landingSetupComplete = firstRunProgress.landingSetupComplete;
_showLandingSetup =
widget.showWelcomeOnFirstRun &&
firstRunProgress.onboardingComplete &&
!firstRunProgress.landingSetupComplete;
_preferencesLoaded = true;
});
}
@@ -98,6 +121,22 @@ class _FocusSeedAppState extends State<FocusSeedApp>
return widget.locale ?? _language.locale ?? focusSeedDefaultLocale();
}
Future<void> _completeOnboarding() async {
setState(() {
_onboardingComplete = true;
_showLandingSetup = true;
});
await _preferencesStore.saveOnboardingComplete();
}
Future<void> _completeLandingSetup() async {
setState(() {
_landingSetupComplete = true;
_showLandingSetup = false;
});
await _preferencesStore.saveLandingSetupComplete();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
@@ -115,14 +154,28 @@ class _FocusSeedAppState extends State<FocusSeedApp>
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: AppLocalizations.supportedLocales,
home: FocusSeedHome(
focusSeedStore: widget.focusSeedStore,
appearance: _appearance,
onAppearanceChanged: _setAppearance,
language: _language,
showLanguageTools: !kReleaseMode && widget.locale == null,
onLanguageChanged: _setLanguage,
),
home:
!_preferencesLoaded
? const Scaffold(body: SafeArea(child: LoadingView()))
: widget.showWelcomeOnFirstRun && !_onboardingComplete
? WelcomeScreen(
onStart: _completeOnboarding,
onSkip: _completeOnboarding,
)
: FocusSeedHome(
focusSeedStore: widget.focusSeedStore,
appearance: _appearance,
onAppearanceChanged: _setAppearance,
language: _language,
showLanguageTools: !kReleaseMode && widget.locale == null,
onLanguageChanged: _setLanguage,
showLandingSetupInitially:
widget.showWelcomeOnFirstRun &&
(!_landingSetupComplete || _showLandingSetup),
onLandingSetupComplete: () {
unawaited(_completeLandingSetup());
},
),
);
}