Skip to content

Commit aff6331

Browse files
committed
fix dialog poping navigation stack leads to close browser on popping again bug
1 parent b9da9ee commit aff6331

File tree

11 files changed

+106
-37
lines changed

11 files changed

+106
-37
lines changed

lib/main.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter/services.dart';
33
import 'package:flutter_portfolio/res/constants.dart';
4-
import 'package:flutter_portfolio/view/splash/splash_view.dart';
4+
import 'package:flutter_portfolio/routing/app_router.dart';
55
import 'package:flutter_screenutil/flutter_screenutil.dart';
66
import 'package:google_fonts/google_fonts.dart';
77

@@ -18,7 +18,7 @@ class MyApp extends StatelessWidget {
1818
designSize: const Size(600, 960),
1919
minTextAdapt: true,
2020
splitScreenMode: true,
21-
child: MaterialApp(
21+
child: MaterialApp.router(
2222
debugShowCheckedModeBanner: false,
2323
theme: ThemeData(
2424
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
@@ -34,7 +34,7 @@ class MyApp extends StatelessWidget {
3434
bodyMedium: const TextStyle(color: bodyTextColor),
3535
),
3636
),
37-
home: const SplashView()),
37+
routerConfig: AppRouter.router),
3838
);
3939
}
4040
}

lib/routing/app_router.dart

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_portfolio/routing/routs.dart';
3+
import 'package:flutter_portfolio/view/main/main_view.dart';
4+
import 'package:flutter_portfolio/view/projects/components/project_details_view.dart';
5+
import 'package:flutter_portfolio/view/projects/components/project_media_widgets.dart';
6+
import 'package:flutter_portfolio/view/splash/splash_view.dart';
7+
import 'package:go_router/go_router.dart';
8+
import 'package:flutter_portfolio/model/projects_models_list.dart';
9+
10+
class AppRouter {
11+
static final rootNavigatorKey = GlobalKey<NavigatorState>();
12+
13+
static final router = GoRouter(
14+
initialLocation: RoutePaths.splash,
15+
navigatorKey: rootNavigatorKey,
16+
debugLogDiagnostics: true,
17+
routes: [
18+
GoRoute(
19+
path: RoutePaths.splash,
20+
builder: (context, state) => const SplashView(),
21+
),
22+
GoRoute(
23+
path: RoutePaths.main,
24+
builder: (context, state) => const MainView(),
25+
),
26+
GoRoute(
27+
path: RoutePaths.projectDetails,
28+
builder: (context, state) {
29+
final idStr = state.pathParameters['id']!;
30+
final id = int.parse(idStr);
31+
final p = projectList[id];
32+
return ProjectDetailsView(
33+
projectId: id,
34+
name: p.name,
35+
description: p.description,
36+
images: p.images,
37+
videos: p.videos,
38+
featureModels: p.featureModelsList,
39+
githubLink: p.link,
40+
);
41+
},
42+
routes: [
43+
GoRoute(
44+
path: 'viewer/:imageIndex',
45+
builder: (context, state) {
46+
final idStr = state.pathParameters['id']!;
47+
final id = int.parse(idStr);
48+
final indexStr = state.pathParameters['imageIndex']!;
49+
final imageIndex = int.parse(indexStr);
50+
final images = projectList[id].images;
51+
return ImageGalleryDialog(
52+
images: images,
53+
initialIndex: imageIndex,
54+
);
55+
},
56+
),
57+
],
58+
),
59+
],
60+
);
61+
}

lib/routing/routs.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
abstract class RoutePaths {
2+
static const splash = "/";
3+
static const main = "/main";
4+
static const projectDetails = "/project-details/:id";
5+
}

lib/view/projects/components/media_viewer_desktop.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:flutter_portfolio/view/projects/components/project_info_section.
44
import 'project_media_widgets.dart';
55

66
class ProjectMediaDesktopLayout extends StatelessWidget {
7+
final int projectId;
78
final String name;
89
final String description;
910
final List<String> images;
@@ -15,6 +16,7 @@ class ProjectMediaDesktopLayout extends StatelessWidget {
1516
final String link;
1617

1718
const ProjectMediaDesktopLayout({
19+
required this.projectId,
1820
required this.name,
1921
required this.description,
2022
required this.featureModels,
@@ -58,6 +60,7 @@ class ProjectMediaDesktopLayout extends StatelessWidget {
5860
flex: 1,
5961
child: ImageGallery(
6062
images: images,
63+
projectId: projectId,
6164
crossAxisCount: isTablet ? 2 : 3,
6265
),
6366
),

lib/view/projects/components/media_viewer_mobile.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:flutter_portfolio/view/projects/components/project_info_section.
44
import 'project_media_widgets.dart';
55

66
class ProjectMediaMobileLayout extends StatelessWidget {
7+
final int projectId;
78
final String description;
89
final String name;
910
final List<String> images;
@@ -16,6 +17,7 @@ class ProjectMediaMobileLayout extends StatelessWidget {
1617
final String link;
1718

1819
const ProjectMediaMobileLayout({
20+
required this.projectId,
1921
required this.description,
2022
required this.name,
2123
required this.images,
@@ -51,6 +53,7 @@ class ProjectMediaMobileLayout extends StatelessWidget {
5153
const SizedBox(height: 24),
5254
ImageGallery(
5355
images: images,
56+
projectId: projectId,
5457
crossAxisCount: gridCrossAxisCount,
5558
),
5659
const SizedBox(height: 32),

lib/view/projects/components/project_details_view.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'media_viewer_desktop.dart';
66
import 'media_viewer_mobile.dart';
77

88
class ProjectDetailsView extends StatefulWidget {
9+
final int projectId;
910
final String name;
1011
final String description;
1112
final List<String> images;
@@ -15,6 +16,7 @@ class ProjectDetailsView extends StatefulWidget {
1516

1617
const ProjectDetailsView({
1718
Key? key,
19+
required this.projectId,
1820
required this.name,
1921
required this.description,
2022
required this.images,
@@ -91,6 +93,7 @@ class _ProjectDetailsViewState extends State<ProjectDetailsView> {
9193
featureModels: widget.featureModels,
9294
images: widget.images,
9395
videos: widget.videos,
96+
projectId: widget.projectId,
9497
isTablet: isTablet,
9598
horizontalPadding: isBigDesktop ? width * .07 : 24,
9699
verticalPadding: isBigDesktop ? 36 : 16,
@@ -102,6 +105,7 @@ class _ProjectDetailsViewState extends State<ProjectDetailsView> {
102105
featureModels: widget.featureModels,
103106
images: widget.images,
104107
videos: widget.videos,
108+
projectId: widget.projectId,
105109
gridCrossAxisCount: gridCrossAxisCount,
106110
isMobile: isMobile,
107111
horizontalPadding: isBigMobile ? width * .05 : 24,

lib/view/projects/components/project_info.dart

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import 'package:flutter/material.dart';
2-
import 'package:flutter_portfolio/model/projects_models_list.dart';
32
import 'package:flutter_portfolio/view/projects/components/project_deatail.dart';
4-
import 'package:flutter_portfolio/view/projects/components/project_details_view.dart';
3+
import 'package:go_router/go_router.dart';
54

65
import '../../../res/constants.dart';
76

@@ -19,22 +18,7 @@ class _ProjectStackState extends State<ProjectStack> {
1918
Widget build(BuildContext context) {
2019
return GestureDetector(
2120
onTap: () {
22-
Navigator.push(
23-
context,
24-
PageRouteBuilder(
25-
transitionDuration: Duration.zero,
26-
reverseTransitionDuration: Duration.zero,
27-
pageBuilder: (context, animation, secondaryAnimation) =>
28-
ProjectDetailsView(
29-
githubLink: projectList[widget.index].link,
30-
name: projectList[widget.index].name,
31-
description: projectList[widget.index].description,
32-
featureModels: projectList[widget.index].featureModelsList,
33-
images: projectList[widget.index].images,
34-
videos: projectList[widget.index].videos,
35-
),
36-
),
37-
);
21+
context.push('/project-details/${widget.index}');
3822
},
3923
child: ClipRRect(
4024
borderRadius: BorderRadius.circular(30),

lib/view/projects/components/project_media_widgets.dart

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:flutter/services.dart';
33
import 'hoverable_image_container.dart';
44
import 'package:photo_view/photo_view.dart';
55
import 'multi_video_player.dart';
6+
import 'package:go_router/go_router.dart';
67

78
class VideoGalleryWithGradientContainer extends StatelessWidget {
89
final List<String> videos;
@@ -41,10 +42,15 @@ class VideoGalleryWithGradientContainer extends StatelessWidget {
4142
}
4243

4344
class ImageGallery extends StatefulWidget {
45+
final int projectId;
4446
final List<String> images;
4547
final int crossAxisCount;
46-
const ImageGallery({required this.images, this.crossAxisCount = 3, Key? key})
47-
: super(key: key);
48+
const ImageGallery({
49+
required this.images,
50+
required this.projectId,
51+
this.crossAxisCount = 3,
52+
Key? key,
53+
}) : super(key: key);
4854

4955
@override
5056
State<ImageGallery> createState() => _ImageGalleryState();
@@ -75,13 +81,8 @@ class _ImageGalleryState extends State<ImageGallery> {
7581
return HoverableImageContainer(
7682
imageUrl: displayImages[index],
7783
onTap: () {
78-
showDialog(
79-
context: context,
80-
builder: (_) => ImageGalleryDialog(
81-
images: widget.images,
82-
initialIndex: widget.images.indexOf(displayImages[index]),
83-
),
84-
);
84+
final initialIndex = widget.images.indexOf(displayImages[index]);
85+
context.push('/project-details/${widget.projectId}/viewer/$initialIndex');
8586
},
8687
height: 120,
8788
width: 120,
@@ -324,7 +325,7 @@ class _ImageGalleryDialogState extends State<ImageGalleryDialog> {
324325
color: Colors.white,
325326
size: 20,
326327
),
327-
onPressed: () => Navigator.of(context).pop(),
328+
onPressed: () => context.pop(),
328329
padding: EdgeInsets.zero,
329330
),
330331
),

lib/view/splash/splash_view.dart

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import 'dart:async';
22
import 'package:flutter/material.dart';
33
import 'package:flutter_portfolio/res/constants.dart';
44
import 'package:flutter_portfolio/view/intro/components/animated_image_container.dart';
5-
import 'package:flutter_portfolio/view/main/main_view.dart';
65
import 'package:flutter_portfolio/view/splash/componenets/animated_loading_text.dart';
6+
import 'package:flutter_portfolio/routing/routs.dart';
7+
import 'package:go_router/go_router.dart';
78

89
class SplashView extends StatefulWidget {
910
const SplashView({super.key});
@@ -16,11 +17,9 @@ class _SplashViewState extends State<SplashView> {
1617
void initState() {
1718
super.initState();
1819
Timer(const Duration(seconds: 3), () {
19-
Navigator.pushReplacement(
20-
context,
21-
MaterialPageRoute(
22-
builder: (context) => const MainView(),
23-
));
20+
if (mounted) {
21+
context.go(RoutePaths.main);
22+
}
2423
});
2524
}
2625

pubspec.lock

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,14 @@ packages:
224224
url: "https://pub.dev"
225225
source: hosted
226226
version: "4.7.2"
227+
go_router:
228+
dependency: "direct main"
229+
description:
230+
name: go_router
231+
sha256: "8b1f37dfaf6e958c6b872322db06f946509433bec3de753c3491a42ae9ec2b48"
232+
url: "https://pub.dev"
233+
source: hosted
234+
version: "16.1.0"
227235
google_fonts:
228236
dependency: "direct main"
229237
description:

0 commit comments

Comments
 (0)