Created
May 27, 2024 06:03
-
-
Save dicenull/73c42fc0c065e55d7675c90018342560 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/material.dart'; | |
import 'package:hooks_riverpod/hooks_riverpod.dart'; | |
import 'package:go_router/go_router.dart'; | |
enum AuthState { | |
guest, | |
registered, | |
} | |
final authProvider = StateProvider((ref) => AuthState.guest); | |
void main() { | |
runApp(const ProviderScope(child: MyApp())); | |
} | |
class MyApp extends HookConsumerWidget { | |
const MyApp({super.key}); | |
@override | |
Widget build(BuildContext context, WidgetRef ref) { | |
return MaterialApp.router( | |
routerConfig: ref.watch(routerProvider), | |
); | |
} | |
} | |
final navigatorKey = GlobalKey<NavigatorState>(); | |
final routerProvider = Provider( | |
(ref) => GoRouter( | |
navigatorKey: navigatorKey, | |
initialLocation: '/', | |
routes: [ | |
HomeRoute(), | |
LoginRoute(), | |
], | |
), | |
); | |
class HomeRoute extends GoRoute { | |
HomeRoute() | |
: super( | |
path: '/', | |
redirect: ((context, state) { | |
final authState = context.read(authProvider); | |
if (authState == AuthState.guest) return '/login'; | |
return null; | |
}), | |
builder: (context, state) => const _HomePage(), | |
); | |
} | |
class _HomePage extends StatelessWidget { | |
const _HomePage(); | |
@override | |
Widget build(BuildContext context) { | |
return Scaffold( | |
appBar: AppBar( | |
title: const Text('HOME'), | |
), | |
body: const Text('home'), | |
); | |
} | |
} | |
class LoginRoute extends GoRoute { | |
LoginRoute() | |
: super( | |
path: '/login', | |
builder: (context, state) => const _LoginPage(), | |
); | |
} | |
class _LoginPage extends ConsumerWidget { | |
const _LoginPage(); | |
@override | |
Widget build(BuildContext context, WidgetRef ref) { | |
return Scaffold( | |
appBar: AppBar( | |
title: const Text('LOGIN'), | |
), | |
body: Center( | |
child: TextButton( | |
onPressed: () { | |
context.read(authProvider.notifier).state = AuthState.registered; | |
// ページ遷移するために更新通知 | |
ref.invalidate(routerProvider); | |
}, | |
child: const Text('login'), | |
), | |
), | |
); | |
} | |
} | |
extension BuildContextExtend on BuildContext { | |
T read<T>(ProviderListenable<T> provider) { | |
return ProviderScope.containerOf(this, listen: false).read(provider); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment