inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

PaginationListView 위젯 작업하기

Gorouter 메인함수 호출관련 질문

172

dlckdals9467

작성한 질문수 30

0

Gorouter를 활용하여

class _App extends ConsumerWidget {
  const _App({Key? key}) : super(key: key);


  @override
  Widget build(BuildContext context,WidgetRef ref) {

    final router = ref.watch(routerProvider);

    return MaterialApp.router(
      // 시스템 설정에 따른 Theme
      // themeMode: ThemeMode.system,
      theme: TAppTheme.lightTheme,
      // darkTheme: TAppTheme.darkTheme,
      debugShowCheckedModeBanner: false,
      routerDelegate: router.routerDelegate,
      routeInformationParser: router.routeInformationParser,
      routeInformationProvider: router.routeInformationProvider,
    );
  }
}
final routerProvider = Provider<GoRouter>((ref){
  final provider = ref.watch(authProvider);

  return GoRouter(
      routes: provider.routes,
    initialLocation: '/splash',
    refreshListenable: provider,
    redirect: provider.redirectLogic
  );
});

 

위와 같이 메인함수를 호출하고 있습니다.

 

여기서 푸쉬 알림을 받을때 특정 경로로 이동하게 하고 싶다면 GoRouter의 initiallocation을 활용해서 특정 경로로 보내야할거같은데 스플래시화면에서 로그인 검증하여 로그인 되어있다면 특정경로로 이동하고 로그인 안되어있다면 특정경로를 이동하지않고 로그인화면으로 이동하고싶은데 방법을 잘 모르겠습니다

 

flutter 하이브리드-앱

답변 2

0

코드팩토리

안녕하세요!

initialiLocation을 사용해도 되겠지만 push 알림을 받았을때 원하는 route를 푸쉬하면 되지 않을까요?

push 알림을 받으면 발생되는 함수에서 진행하시면 될 것 같습니다.

감사합니다!

0

dlckdals9467

main함수에서 받고있는데 context를 전달받아야 푸쉬할수있찌 않나요?

 

import 'dart:async';
import 'dart:convert';

import 'package:carwash/common/theme/theme.dart';
import 'package:carwash/firebase/provider/pushRoute_provider.dart';
import 'package:carwash/user/view/splash_screen.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:get/get.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:kakao_flutter_sdk_user/kakao_flutter_sdk_user.dart';
import 'common/provider/go_router.dart';
import 'package:firebase_core/firebase_core.dart';

import 'firebase_options.dart';

//! Notification을 위한 StreamController 전역 변수 선언
String pushRoute = '';

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  print("백그라운드 메시지 처리.. ${message.notification!.body!}");
}


void initializeNotification() async {
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
  final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
  await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<
      AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(const AndroidNotificationChannel(
      'high_importance_channel', 'high_importance_notification',
      importance: Importance.max));

  DarwinInitializationSettings iosInitializationSettings =
          const DarwinInitializationSettings(
              requestAlertPermission: true,
              requestBadgePermission: true,
              requestSoundPermission: true
          );
  // IOSInitializationSettings iosInitializationSettings =
  // IOSInitializationSettings(
  //   requestAlertPermission: true,
  //   requestBadgePermission: true,
  //   requestSoundPermission: true
  // );

  await flutterLocalNotificationsPlugin.initialize(
      InitializationSettings(
          android: AndroidInitializationSettings("@mipmap/ic_launcher"),
          iOS: iosInitializationSettings
      ),

      //앱이 켜져있을때 푸쉬 알림 클릭시 해당 경로로 이동 설정
      onDidReceiveNotificationResponse: (NotificationResponse details) async {
        print('onDidReceiveNotificationResponse - payload: ${details.payload}');

        final payload = details.payload ?? '';

        final parsedJson = jsonDecode(jsonEncode(payload));

        if(payload!=''){
          pushRoute = payload;
        }
      }
  );

  await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
    alert: true,
    badge: true,
    sound: true,
  );

}



void main() async{
  SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values);
  await WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  await initializeDateFormatting();
  KakaoSdk.init(nativeAppKey: '7d131476e9dd71890bf99ffa94dec12d'); // 이 줄을 runApp 위에 추가한다.

  //푸쉬알림설정
  initializeNotification();

  runApp(
      const ProviderScope(child: _App())
  );
}

class _App extends ConsumerWidget {
  const _App({Key? key}) : super(key: key);


  @override
  Widget build(BuildContext context,WidgetRef ref) {

    final router = ref.watch(routerProvider);

    return MaterialApp.router(
      // 시스템 설정에 따른 Theme
      // themeMode: ThemeMode.system,
      theme: TAppTheme.lightTheme,
      // darkTheme: TAppTheme.darkTheme,
      debugShowCheckedModeBanner: false,
      routerDelegate: router.routerDelegate,
      routeInformationParser: router.routeInformationParser,
      routeInformationProvider: router.routeInformationProvider,
    );
  }
}




 

0

코드팩토리

이런 예제 말씀하시는걸까요?

https://github.com/flutter/flutter/issues/136250

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

GoRouter를 활용하여 푸시 알림을 받을 때 특정 경로로 이동하도록 설정하려면 initialLocation 뿐만 아니라 redirectLogic을 활용하여 유저의 로그인 상태를 기반으로 특정 경로로 이동할 수 있습니다. 아래는 이를 구현하는 방법에 대한 간단한 설명입니다.


1. 푸쉬 알림 시 경로 설정하기:

GoRouter의 redirectLogic을 활용하면 사용자의 상태에 따라 동적으로 라우팅 경로를 변경할 수 있습니다. authProvider에서 로그인 상태를 체크한 후, 사용자가 로그인되어 있는지 확인하는 로직을 추가하면 됩니다. 예를 들어, 사용자가 로그인되어 있다면 특정 경로(예: ‘/home’ 또는 ‘/targetPath’)로 이동하도록 하고, 그렇지 않다면 ‘/login’으로 리디렉션할 수 있습니다.

아래의 예시는 redirectLogic을 활용한 간단한 예제입니다:

String? redirectLogic(BuildContext context, GoRouterState state) {
  final user = ref.read(userProvider);

  // Login 상태에 따른 리디렉션
  if (user == null && state.location != '/login') {
    return '/login';
  } else if (user != null && state.location == '/login') {
    return '/home'; // 로그인이 되어있다면 홈 화면으로 이동
  }

  // 푸시 알림으로부터 특정 경로로 리디렉션
  if (user != null) {
    // 푸시 알림의 데이터에 따라 경로 설정
    final targetPath = ...; // 푸쉬 알림에 따라 결정되는 경로
    return targetPath;
  }

  return null;
}

2. 초기 경로 설정:

initialLocation은 앱이 처음 시작될 때의 경로를 설정합니다. 이 경로에서부터 redirectLogic이 발동하여 사용자의 로그인 상태 및 푸시 알림의 내용을 확인하고 적절한 경로로 리디렉션하게 됩니다.


이와 관련하여 더 구체적인 내용을 알아보고 싶으시다면 다음 링크에서 비슷한 주제에 대한 Q&A 내용을 참고해 보실 수 있습니다. (예: go router redirect 동작 질문)

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

dlckdals9467

redirectLogic에서 푸쉬알림을 어떻게 확인하나요?

Isar 마지막 업데이트는 2년전입니다.

0

30

0

FlutterSecureStorage 질문

0

31

0

Dio onError Interceptor 만드는 부분에 질문이 있습니다.

0

79

2

관리자 기능에 대한 질문

0

100

2

part 'restaurant_model.g.dart';

0

92

1

36강. dio 인터셉터에 storage를 전달하는 코드가 이해 안되는데요. 도움 부탁드립니다.

0

56

2

2번 반환 상황 관련 질문

0

61

2

riverpod 3.0

0

139

2

Asset folder??

0

82

2

디자이너와 협업 시 프레임 크기 설정 관련 질문

0

113

2

FutureProvider, StateNotifierProvider 선택 기준

0

70

2

컴포넌트 모델화

0

64

2

쿼리 파라미터

0

84

2

화면 안보임

0

67

2

PaginationListView

0

54

1

강의중 37.Dio onErrorInterceptor 작업하기 dio 관련 질문입니다.

0

101

2

프로토타입이미지

0

62

2

여러 객체를 상태 관리하는 방법에 대한 질문

0

84

2

장바구니 결제하기 응답이 500이 옵니다.

0

105

2

removeFromBasket에서 await patchBasket()을 마지막에 하면 에러나는거 아닌가요?

0

67

2

이 두가지는 완전히 동일한 기능인가요?

0

106

3

내부 코드를 작성하지 않은 CursorPaginationLoading가 어떻게 로딩상태를 갖는지 잘 모르겠습니다...

0

77

2

_SplashScreenState에서 storage를 late로 호출해서 한번만 불러와도 되나요?

0

86

2

코딩 작성 순서 관련 질문

0

88

2