chore: initialize go router package
continuous-integration/drone/pr Build is failing

This commit was merged in pull request #232.
This commit is contained in:
2023-11-14 18:19:10 +01:00
parent 31350762c5
commit 45458e7784
58 changed files with 1333 additions and 0 deletions
@@ -0,0 +1,108 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:wyatt_go_router/wyatt_go_router.dart';
import 'package:wyatt_go_router_example/bottom_bar.dart';
import 'package:wyatt_go_router_example/page_a.dart';
import 'package:wyatt_go_router_example/page_b.dart';
import 'package:wyatt_go_router_example/page_c.dart';
abstract class AppRouter {
/// Default transition for all pages
static Page<void> defaultTransition(
BuildContext context,
GoRouterState state,
Widget child,
) =>
CupertinoPage<void>(key: state.pageKey, child: child);
/// Disable transition animation
static Page<void> noTransition(
BuildContext context,
GoRouterState state,
Widget child,
) =>
NoTransitionPage(key: state.pageKey, child: child);
static final GlobalKey<NavigatorState> rootNavigatorKey =
GlobalKey<NavigatorState>();
static final GlobalKey<NavigatorState> shellNavigatorKey =
GlobalKey<NavigatorState>();
/// Defines GoRoute routes.
static final List<RouteBase> routes = [
ShellRoute(
navigatorKey: shellNavigatorKey,
builder: (context, state, child) {
final currentRoute = context.currentRoute;
return Scaffold(
appBar: AppBar(
title: Text(
currentRoute.name ?? 'Unknown',
),
),
body: child,
bottomNavigationBar: BottomBar(
currentRoute: currentRoute,
),
);
},
routes: [
GoRoute(
path: '/page-a',
name: 'A',
pageBuilder: (context, state) => noTransition(
context,
state,
const PageA(),
),
),
GoRoute(
path: '/page-b',
name: 'B',
pageBuilder: (context, state) => noTransition(
context,
state,
const PageB(),
),
),
],
),
GoRoute(
path: '/page-c',
name: 'C',
parentNavigatorKey: rootNavigatorKey,
pageBuilder: (context, state) => defaultTransition(
context,
state,
const PageC(),
),
),
];
static GoRouter? _router;
/// Returns the router.
static GoRouter routerOf(BuildContext context) => _router ??= GoRouter(
initialLocation: '/page-a',
routes: AppRouter.routes,
navigatorKey: rootNavigatorKey,
debugLogDiagnostics: true,
);
}
@@ -0,0 +1,47 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:wyatt_go_router/wyatt_go_router.dart';
class BottomBar extends StatelessWidget {
const BottomBar({
required this.currentRoute,
super.key,
});
final GoRoute currentRoute;
@override
Widget build(BuildContext context) => BottomNavigationBar(
items: const [
BottomNavigationBarItem(
icon: Icon(Icons.home),
label: 'Home',
),
BottomNavigationBarItem(
icon: Icon(Icons.settings),
label: 'Settings',
),
],
currentIndex: (currentRoute.name == 'A') ? 0 : 1,
onTap: (index) => switch (index) {
0 => context.goNamed('A'),
1 => context.goNamed('B'),
_ => throw Exception('Invalid index: $index'),
},
);
}
@@ -0,0 +1,34 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:wyatt_go_router_example/app_router.dart';
void main(List<String> args) {
runApp(const App());
}
class App extends StatelessWidget {
const App({super.key});
static const String title = 'Wyatt Go Router Example';
@override
Widget build(BuildContext context) => MaterialApp.router(
title: title,
routerConfig: AppRouter.routerOf(context),
);
}
@@ -0,0 +1,30 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:wyatt_go_router/wyatt_go_router.dart';
class PageA extends StatelessWidget {
const PageA({super.key});
@override
Widget build(BuildContext context) => Center(
child: Text(
'Page A: ${context.currentRoute}',
style: Theme.of(context).textTheme.headlineMedium,
),
);
}
@@ -0,0 +1,40 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:wyatt_go_router/wyatt_go_router.dart';
class PageB extends StatelessWidget {
const PageB({super.key});
@override
Widget build(BuildContext context) => Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Page B: ${context.currentRoute}',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () => context.pushNamed('C'),
child: const Text('Go to Page C'),
),
],
),
);
}
@@ -0,0 +1,35 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:wyatt_go_router/wyatt_go_router.dart';
class PageC extends StatelessWidget {
const PageC({super.key});
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: const Text('Page C'),
),
body: Center(
child: Text(
'Page C: ${context.currentRoute}',
style: Theme.of(context).textTheme.headlineMedium,
),
),
);
}