728x90
1. 화면 등록
import 'dart:convert';
import 'package:culture_app/detail_screen.dart';
import 'package:culture_app/home_screen.dart';
import 'package:culture_app/model/festival_model.dart';
import 'package:culture_app/onboarding_screen.dart';
import 'package:go_router/go_router.dart' show GoRoute, GoRouter;
final router = GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) => const OnboardingScreen(),
),
GoRoute(
path: '/home',
builder: (context, state) =>
const HomeScreen(title: 'Flutter Demo Home Page'),
),
GoRoute(
path: '/detail',
builder: (context, state) {
// state에는 extra로 보낸 데이터가 이동된다
FestivalModel festivalModel =
FestivalModel.fromJson(state.extra as Map<String, dynamic>);
return DetailScreen(
festivalModel: festivalModel,
);
},
),
GoRoute(
path: '/users/:userId',
builder: (context, state) => const UserScreen(id: state.pathParameters['userId']),
),
],
);
router에 데이터를 넘기는 것이 아니라, 특정 프로바이더를 추가로 생성한 후에 해당 프로바이더에 데이터를 갱신하는 방법도 있을 것 같다.
2. 화면 이동
context.push(
'/detail',
extra: festivalModel.toJson(),
);
context.go(Uri(path: '/users/123', queryParameters: {'filter': 'abc'}).toString());
3. redirect
redirect: (BuildContext context, GoRouterState state) {
if (AuthState.of(context).isSignedIn) {
return '/signin';
} else {
return null;
}
},
4. SubRoute
5. context.go vs context.push
go : 현재 화면 삭제하고 이동
push : 쌓기
pop : 현재 화면 없애고 이동