mirror of
https://github.com/foss42/apidash.git
synced 2025-12-02 10:49:49 +08:00
feat: change onboarding flow and remove theme switch button
This commit is contained in:
61
lib/app.dart
61
lib/app.dart
@@ -1,5 +1,8 @@
|
|||||||
// ignore_for_file: use_build_context_synchronously
|
// ignore_for_file: use_build_context_synchronously
|
||||||
|
|
||||||
|
import 'dart:developer' show log;
|
||||||
|
|
||||||
|
import 'package:apidash/screens/mobile/onboarding_screen.dart';
|
||||||
import 'package:apidash_design_system/apidash_design_system.dart';
|
import 'package:apidash_design_system/apidash_design_system.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_portal/flutter_portal.dart';
|
import 'package:flutter_portal/flutter_portal.dart';
|
||||||
@@ -104,6 +107,10 @@ class _AppState extends ConsumerState<App> with WindowListener {
|
|||||||
class DashApp extends ConsumerWidget {
|
class DashApp extends ConsumerWidget {
|
||||||
const DashApp({super.key});
|
const DashApp({super.key});
|
||||||
|
|
||||||
|
Future<bool> _checkOnboardingStatus() async {
|
||||||
|
return await getOnboardingStatusFromSharedPrefs();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final isDarkMode =
|
final isDarkMode =
|
||||||
@@ -111,6 +118,7 @@ class DashApp extends ConsumerWidget {
|
|||||||
final workspaceFolderPath = ref
|
final workspaceFolderPath = ref
|
||||||
.watch(settingsProvider.select((value) => value.workspaceFolderPath));
|
.watch(settingsProvider.select((value) => value.workspaceFolderPath));
|
||||||
final showWorkspaceSelector = kIsDesktop && (workspaceFolderPath == null);
|
final showWorkspaceSelector = kIsDesktop && (workspaceFolderPath == null);
|
||||||
|
|
||||||
return Portal(
|
return Portal(
|
||||||
child: MaterialApp(
|
child: MaterialApp(
|
||||||
debugShowCheckedModeBanner: false,
|
debugShowCheckedModeBanner: false,
|
||||||
@@ -133,24 +141,41 @@ class DashApp extends ConsumerWidget {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
: Stack(
|
: kIsMobile
|
||||||
children: [
|
? FutureBuilder<bool>(
|
||||||
!kIsLinux && !kIsMobile
|
future: _checkOnboardingStatus(),
|
||||||
? const App()
|
builder: (context, snapshot) {
|
||||||
: context.isMediumWindow
|
if (snapshot.connectionState == ConnectionState.waiting) {
|
||||||
? const MobileDashboard()
|
return const Center(child: CircularProgressIndicator());
|
||||||
: const Dashboard(),
|
}
|
||||||
if (kIsWindows)
|
if (snapshot.connectionState == ConnectionState.done) {
|
||||||
SizedBox(
|
log(snapshot.data.toString());
|
||||||
height: 29,
|
final showOnboarding = snapshot.data ?? false;
|
||||||
child: WindowCaption(
|
return showOnboarding
|
||||||
backgroundColor: Colors.transparent,
|
? const MobileDashboard()
|
||||||
brightness:
|
: const OnboardingScreen();
|
||||||
isDarkMode ? Brightness.dark : Brightness.light,
|
}
|
||||||
),
|
return const MobileDashboard();
|
||||||
),
|
},
|
||||||
],
|
)
|
||||||
),
|
: Stack(
|
||||||
|
children: [
|
||||||
|
!kIsLinux && !kIsMobile
|
||||||
|
? const App()
|
||||||
|
: context.isMediumWindow
|
||||||
|
? const MobileDashboard()
|
||||||
|
: const Dashboard(),
|
||||||
|
if (kIsWindows)
|
||||||
|
SizedBox(
|
||||||
|
height: 29,
|
||||||
|
child: WindowCaption(
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
brightness:
|
||||||
|
isDarkMode ? Brightness.dark : Brightness.light,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
import 'package:apidash/providers/settings_providers.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
||||||
|
|
||||||
class ThemeSwitchButton extends StatelessWidget {
|
|
||||||
const ThemeSwitchButton({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Consumer(builder: (context, ref, child) {
|
|
||||||
final settings = ref.watch(settingsProvider);
|
|
||||||
|
|
||||||
return IconButton(
|
|
||||||
icon: settings.isDark
|
|
||||||
? const Icon(
|
|
||||||
Icons.dark_mode_rounded,
|
|
||||||
color: Colors.indigo,
|
|
||||||
)
|
|
||||||
: const Icon(
|
|
||||||
Icons.light_mode_rounded,
|
|
||||||
color: Colors.yellow,
|
|
||||||
),
|
|
||||||
onPressed: () {
|
|
||||||
ref.read(settingsProvider.notifier).update(isDark: !settings.isDark);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
import 'package:apidash/screens/mobile/onboarding_screen.dart';
|
|
||||||
import 'package:apidash/services/shared_preferences_services.dart';
|
|
||||||
import 'package:apidash_design_system/apidash_design_system.dart';
|
import 'package:apidash_design_system/apidash_design_system.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
@@ -21,50 +19,41 @@ class MobileDashboard extends ConsumerStatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _MobileDashboardState extends ConsumerState<MobileDashboard> {
|
class _MobileDashboardState extends ConsumerState<MobileDashboard> {
|
||||||
Future<bool> _checkOnboardingStatus() async {
|
|
||||||
return await getOnboardingStatusFromSharedPrefs();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(
|
||||||
return FutureBuilder<bool>(
|
BuildContext context,
|
||||||
future: _checkOnboardingStatus(),
|
) {
|
||||||
builder: (context, snapshot) {
|
final railIdx = ref.watch(navRailIndexStateProvider);
|
||||||
final railIdx = ref.watch(navRailIndexStateProvider);
|
final isLeftDrawerOpen = ref.watch(leftDrawerStateProvider);
|
||||||
final isLeftDrawerOpen = ref.watch(leftDrawerStateProvider);
|
|
||||||
if (snapshot.connectionState == ConnectionState.waiting) {
|
return AnnotatedRegion<SystemUiOverlayStyle>(
|
||||||
return const Center(child: CircularProgressIndicator());
|
value: FlexColorScheme.themedSystemNavigationBar(
|
||||||
} else if (snapshot.data == false) {
|
context,
|
||||||
return const OnboardingScreen();
|
opacity: 0,
|
||||||
}
|
noAppBar: true,
|
||||||
return AnnotatedRegion<SystemUiOverlayStyle>(
|
),
|
||||||
value: FlexColorScheme.themedSystemNavigationBar(
|
child: Stack(
|
||||||
context,
|
alignment: AlignmentDirectional.bottomCenter,
|
||||||
opacity: 0,
|
children: [
|
||||||
noAppBar: true,
|
PageBranch(
|
||||||
|
pageIndex: railIdx,
|
||||||
),
|
),
|
||||||
child: Stack(
|
if (context.isMediumWindow)
|
||||||
alignment: AlignmentDirectional.bottomCenter,
|
AnimatedPositioned(
|
||||||
children: [
|
bottom: railIdx > 2
|
||||||
PageBranch(pageIndex: railIdx),
|
? 0
|
||||||
if (context.isMediumWindow)
|
: isLeftDrawerOpen
|
||||||
AnimatedPositioned(
|
|
||||||
bottom: railIdx > 2
|
|
||||||
? 0
|
? 0
|
||||||
: isLeftDrawerOpen
|
: -(72 + MediaQuery.paddingOf(context).bottom),
|
||||||
? 0
|
left: 0,
|
||||||
: -(72 + MediaQuery.paddingOf(context).bottom),
|
right: 0,
|
||||||
left: 0,
|
height: 70 + MediaQuery.paddingOf(context).bottom,
|
||||||
right: 0,
|
duration: const Duration(milliseconds: 200),
|
||||||
height: 70 + MediaQuery.paddingOf(context).bottom,
|
curve: Curves.easeOut,
|
||||||
duration: const Duration(milliseconds: 200),
|
child: const BottomNavBar(),
|
||||||
curve: Curves.easeOut,
|
),
|
||||||
child: const BottomNavBar(),
|
],
|
||||||
),
|
),
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import 'package:apidash/consts.dart';
|
import 'package:apidash/consts.dart';
|
||||||
import 'package:apidash/screens/common_widgets/theme_switch_button.dart';
|
|
||||||
import 'package:apidash/screens/mobile/widgets/onboarding_slide.dart';
|
import 'package:apidash/screens/mobile/widgets/onboarding_slide.dart';
|
||||||
import 'package:apidash/screens/screens.dart';
|
import 'package:apidash/screens/screens.dart';
|
||||||
import 'package:apidash/services/services.dart';
|
import 'package:apidash/services/services.dart';
|
||||||
@@ -42,7 +41,6 @@ class _OnboardingScreenState extends State<OnboardingScreen> {
|
|||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
backgroundColor: Theme.of(context).colorScheme.surface,
|
backgroundColor: Theme.of(context).colorScheme.surface,
|
||||||
actions: [
|
actions: [
|
||||||
const ThemeSwitchButton(),
|
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
Navigator.pushAndRemoveUntil(
|
Navigator.pushAndRemoveUntil(
|
||||||
@@ -143,9 +141,11 @@ class _OnboardingScreenState extends State<OnboardingScreen> {
|
|||||||
child: IconButton(
|
child: IconButton(
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
_onNextPressed();
|
_onNextPressed();
|
||||||
await setOnboardingStatusToSharedPrefs(
|
if (currentPageIndex == 2) {
|
||||||
isOnboardingComplete: true,
|
await setOnboardingStatusToSharedPrefs(
|
||||||
);
|
isOnboardingComplete: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
icon: const Icon(
|
icon: const Icon(
|
||||||
Icons.arrow_forward_rounded,
|
Icons.arrow_forward_rounded,
|
||||||
|
|||||||
@@ -37,5 +37,5 @@ Future<bool> getOnboardingStatusFromSharedPrefs() async {
|
|||||||
|
|
||||||
Future<void> clearSharedPrefs() async {
|
Future<void> clearSharedPrefs() async {
|
||||||
final prefs = await SharedPreferences.getInstance();
|
final prefs = await SharedPreferences.getInstance();
|
||||||
await prefs.remove(kSharedPrefSettingsKey);
|
await prefs.clear();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user