Flutter 에서 무 Context 점프 를 어떻게 실현 하 는 지 상세 하 게 설명 합 니 다.

6395 단어 fluttercontext점프
배경 설명

Navigator.of(context).push(MaterialPageRoute(builder: (context){
   return DemoPage();
  }));
일상적인 프로젝트 개발 에서 우 리 는 일반적으로 push 의 새로운 페이지 는 위의 방법 으로 Navigator.of(context) 을 이용 하여 push 또는 pop 작업 을 한다.
단점:이 경우 context 를 전송 해 야 합 니 다.Navigator.of(context) 을 이용 하여 Navigator State 대상 을 얻 은 다음 에 push 나 pop 작업 을 할 수 있 습 니 다.
프로젝트 의 어느 곳 에서 든 push 새 페이지 를 만 들 려 면 context 를 얻 지 못 할 수도 있 기 때문에 이 럴 때 는 context 없 는 점프 가 필요 합 니 다.
해결 방안
context 가 없 는 점프 는 본질 적 으로 우리 가 매번 context 인 자 를 전달 한 다음 에 일부 조작 을 이용 하여 현재 Navigator State 를 직접 가 져 올 필요 가 없다 는 것 이다.
방안 1:GlobalKey 활용
  • 은 Flutter 에서 GolbalKey 를 이용 해 Widget 에 대응 하 는 State 대상 을 얻는다.그래서 여기 서 우 리 는 GlobalKey 의 key 값 을 통 해 Navigator State 대상 을 얻 을 수 있 습 니 다.
  • MaterialApp 에는 WidgetsApp 이 포 장 됐 고 WidgetsApp 에는 Navigator 가 포 장 됐 으 며 Navigator 의 key 속성 을 navigator Key 로 노출 했다.따라서 navigatorKey 를 설정 한 다음 이 key 를 이용 하여 NavigatorState 대상 을 얻 을 수 있 습 니 다.
  • 여기에 관련 소스 코드 를 붙 여 주세요.구체 적 인 것 은 여러분 이 직접 소스 코드 를 보 러 갈 수 있 습 니 다.
    MaterialApp 클래스:

    WidgetsApp 클래스:우리 가 정의 하 는 navigatorKey 는 마지막 으로 Navigator 에 전 달 될 key 값 을 알 수 있 기 때문에 우 리 는 밖에서 key.currentState()방법 을 통 해 이곳 의 NavigatorState 대상 을 얻 을 수 있 습 니 다.
    
    class _WidgetsAppState extends State<WidgetsApp> implements WidgetsBindingObserver {
    
     GlobalKey<NavigatorState> _navigator;
    
     void _updateNavigator() {
     _navigator = widget.navigatorKey ?? GlobalObjectKey<NavigatorState>(this);
     }
     
     @override
     Widget build(BuildContext context) {
     Widget navigator;
     if (_navigator != null) {
      navigator = Navigator(
      key: _navigator,
      initialRoute: WidgetsBinding.instance.window.defaultRouteName != Navigator.defaultRouteName
       ? WidgetsBinding.instance.window.defaultRouteName
       : widget.initialRoute ?? WidgetsBinding.instance.window.defaultRouteName,
      onGenerateRoute: _onGenerateRoute,
      onUnknownRoute: _onUnknownRoute,
      observers: widget.navigatorObservers,
      );
     }
    }
    간단 한 코드 구현
    1.GlobalKey대상 정의
    
     static GlobalKey<NavigatorState> navigatorKey=GlobalKey();
    2.MaterialApp 의 대상 을 만 들 때 navigatorKey 를 MaterialApp 에 할당 합 니 다.
    
    MaterialApp(
       navigatorKey: Router.navigatorKey,
    )
    GlobalKey 를 사용 하여 임의의 곳 에서 NavigatorState 대상 가 져 오기
    
    navigatorKey.currentState.pushNamed("/login");
    프로젝트 2:NavigatorObserver 이용
  • Navigator Observer,이 이름 을 보면 Navigator 의 변 화 를 감청 할 수 있다 는 것 을 알 수 있다.예 를 들 어 push 가 새 페이지 를 만 들 때 Navigator 는 Navigator State 에 변화 가 생 겼 음 을 감청 하고 didPush()방법 을 되 돌려 줍 니 다.
  • 메모:Navigator Observer 에 Navigator State 대상 navigator 가 정의 되 어 있 기 때문에 사용자 정의 Navigator Observer 를 통 해 이 navigator 대상 을 직접 이용 하여 페이지 push 나 pop 작업 을 할 수 있 습 니 다.그러면 저 희 는 context 를 이용 하여 navigator State 대상 을 가 져 오지 않 아 도 됩 니 다.

    MaterialApp 류 는 navigator Observer 속성 을 제공 합 니 다.그러면 우 리 는 Navigator Observer 를 사용자 정의 하여 Navigator 의 변 화 를 감청 할 수 있 습 니 다.

    NavigatorState 클래스,intState 대상 을 실행 할 때 감청 하 는 모든 observer 대상 에 자신 을 할당 하 는navigator 안.

    간단 한 코드 구현
    1.사용자 정의 Navigator Observer.
    
    class CustomNavigatorObserver extends NavigatorObserver{
     static CustomNavigatorObserver _instance;
    
     static CustomNavigatorObserver getInstance() {
     if (_instance == null) {
      _instance = CustomNavigatorObserver();
     }
     return _instance;
     }
    }
    2.MaterialApp 의 대상 을 만 들 때 CustomNavigator Observer 를 MaterialApp 에 할당
    
    MaterialApp(
       navigatorObservers: [CustomNavigatorObserver()],
    )
    3.CustomNavigatorObserver 를 사용 하여 임의의 곳 에서 페이지 조작
    
    CustomNavigatorObserver.getInstance().navigator.pushNamed("/login");
    총결산
    이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기