Skip to content

Instantly share code, notes, and snippets.

@dicenull
Created May 27, 2024 06:03
Show Gist options
  • Save dicenull/73c42fc0c065e55d7675c90018342560 to your computer and use it in GitHub Desktop.
Save dicenull/73c42fc0c065e55d7675c90018342560 to your computer and use it in GitHub Desktop.
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