inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

pushAndRemoveUntil() 배워보기

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

138

kut7728

작성한 질문수 5

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'),
        ),
      ],
    );
  }
}

 

 

flutter 클론코딩

답변 1

0

코드팩토리

안녕하세요!

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

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

감사합니다!

0

kut7728

print 해보니

route two - null

route one - null

home - / 라고 뜨네요

 

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

 

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

198강 (){onTap(e);}의 이해 돕기

0

26

1

video_call 플러그인 설치후 에러 발생

0

45

1

SDK 안드로이드 설치 질문!

0

60

1

코드팩토리 디스코드 링크 다시 부탁드려요~

0

92

1

Webview를 이용해서 URL 상의 페이지 출력 불가

0

70

1

홈스크린 함수를 함축해서 main.dart에 옮기는 문제

0

55

1

플레이스토어

0

59

1

아고라 엔진 init 함수의 반환타입이 Future<void> 이것의 의미는 무엇인가요?

0

55

1

가이드라인 질문

0

57

0

emulator 에러 환경설정 뭐가 문제 일까요??

0

76

1

emulator 실행 오류

0

93

3

Column을 가로방향 최대 사이즈를 차지하도록 하는 방법에 관련

0

71

1

pubspec.yaml에서 font를 추가하면서 weight 값을 지정하는 것이 의미가 있는 것인지 문의

0

43

1

setState()를 호출하지 않으면 build가 실행 안되는 건가요?

0

53

1

video_call 플러그인 설치시 에러문제

0

64

1

children 안의 if 문에서 { } 못쓰는 이유?

0

48

1

이렇게 오류가 떠요

0

63

1

AppBar 사용했는데

0

61

2

[문제해결] '오늘도 출첵!' 의 171번 강의에서 중요한 문제를 발견했습니다

0

56

1

StatefulWidget 실습 에러가 발생합니다.[해결완료]

0

63

1

Video Player 프로젝트에 대한 추가 질문

0

53

0

Row위젯이나 column위젯의 위치는 누가 정하나요??

0

42

1

geolocator 오류때문에 개발진행이 불가능입니다

0

63

1

API 관련 이슈

0

86

2