인프런 커뮤니티 질문&답변

kut7728님의 프로필 이미지
kut7728

작성한 질문수

[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

pushAndRemoveUntil() 배워보기

pushNamedAndRemoveUntil 의 작동원리와 오류나는 이유가 궁금합니다.

작성

·

37

0

안녕하세요! 강의 잘 듣고 있습니다.

 

Q1.

pushNamedAndRemoveUntil 의 작동순서? 원리가 제가 생각한게 맞는지 확신이 들지 않아서 여쭤봅니다.

  1. 명명된 라우트가 푸시된다.

  2. 라우트 스택 중 가장 최근부터 순차적으로 조건문에 따라 false가 반환되는 라우트는 스택에서 삭제된다.

  3. 따라서 push됐던 라우트에서 pop을 하게 되면 라우트 스택에 남아있던 라우트로 이동한다.

이게 맞나요?

 

Q2.

라우트 스택의 가장 최근부터 순차적으로 삭제되는게 맞다면

RemoveUntil 이라는 이름을 보고 삭제되지 않는 페이지가 있다면 거기서 끝나는건가?

라는 생각에 HomeScreen이 아닌 route_one_screen이 삭제되지 않는 조건문을 작성했습니다.

 

route.settings.name == '/'; 로 하셨던 것을

route.settings.name == '/one' 으로 바꿔봤는데

push됐던 route_three_screen이 pop되면

route_one_screen이 나올줄 알았는데

그냥 검은 화면만 나옵니다.

무엇이 문제였던 걸까요..?

그리고 home_screen도 삭제가 되었을까요?

 

import 'package:flutter/material.dart';
import 'package:navigation/layout/default_layout.dart';
import 'package:navigation/screen/route_three_screen.dart';

class RouteTwoScreen extends StatelessWidget {
  const RouteTwoScreen({super.key});

  @override
  Widget build(BuildContext context) {
    final arguments = ModalRoute.of(context)?.settings.arguments;

    return DefaultLayout(
      title: 'RouteTwoScreen',
      children: [
        Text(
          arguments.toString(),
          textAlign: TextAlign.center,
        ),
        OutlinedButton(
          onPressed: () {
            Navigator.of(context).pop();
          },
          child: Text('Pop'),
        ),
        OutlinedButton(
          onPressed: () {
            Navigator.of(context).pushNamed(
              '/three',
              arguments: 111111,
            );
          },
          child: Text('Push Route Three'),
        ),
        OutlinedButton(
          onPressed: () {
            /// [HomeScreen, RouteOneScreen, RouteTwoScreen]
            /// push - [HomeScreen, RouteOneScreen, RouteTwoScreen, RouteThreeScreen]
            /// pushR - [HomeScreen, RouteOneScreen, RouteThreeScreen]
            Navigator.of(context).pushReplacement(
              MaterialPageRoute(
                builder: (BuildContext context) {
                  return RouteThreeScreen();
                },
                settings: RouteSettings(
                  arguments: 999,
                ),
              ),
            );
          },
          child: Text('Push Replacement'),
        ),
        OutlinedButton(
          onPressed: () {
            Navigator.of(context).pushReplacementNamed(
              '/three',
              arguments: 999,
            );
          },
          child: Text('Push Replacement Named'),
        ),
        OutlinedButton(
          onPressed: () {
            Navigator.of(context).pushNamedAndRemoveUntil(
              '/three',
              (route){
                /// 만약에 삭제 할거면 (Route Stack) false 반환
                /// 만약에 삭제를 안할거면 true 반환
                return route.settings.name == '/one';
              },
              arguments: 999,
            );
          },
          child: Text('Push Named And Remove Until'),
        ),
      ],
    );
  }
}

 

 

답변 1

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

질문 1: 맞습니다. 푸쉬한 후 라우트 스택의 나머지 페이지에대한 조건을 실행한 후 삭제 여부를 결정합니다.

질문 2: route.settings.name 조건을 실행했을때 예상한 boolean 조건이 나오는걸 확인 하셨나요? true가 분명 반환 되는데 삭제가 되는건가요?

감사합니다!

kut7728님의 프로필 이미지
kut7728
질문자

print 해보니

route two - null

route one - null

home - / 라고 뜨네요

 

namedpush 하지않으면 라우트 스택에 이름이 등록되지 않는군요.

 

덕분에 궁금증이 해소 됐습니다! 감사합니다~

kut7728님의 프로필 이미지
kut7728

작성한 질문수

질문하기