[Flutter] Modal bottom sheet 내에서 Push, Pop의 화면 천이를 실현한다

4777 단어 DartFlutter
Flutter로 Bottom sheet내에서 화면 천이를 구현하려고 하면 의외로 손질됩니다.
showModalBottomSheet 하고, Bottom sheet내에서 Navigator.push 등해도 push처의 상세 화면이 모달내에서 표시되지 않기 때문입니다.



모달 내에서 화면 전환을 실현



모달 내에서 화면 전환을 실현하는 포인트는 2점입니다.
  • Navigator를 중첩
  • 화면을 닫을 때 루트 측의 Navigator를 참조하십시오.

    1. 네비게이터 중첩



    일반적으로 MaterialApp이 보유한 Navigator는 Root의 Navigator 역할을합니다. 게다가 모달용의 자전거 Navigator를 작성하는 것으로, 모달내의 화면 천이를 실현할 수 있습니다.

    구체적인 코드는 아래와 같습니다.
    Navigator에서 모달 페이지를 감싸고 onGenerateRoute 로 경로를 정의합니다.

    Navigator 클래스의 "Nesting Navigators"의 장을 참조
    child: RaisedButton(
      color: Colors.blue,
      textColor: Colors.white,
      onPressed: () => showModalBottomSheet(
        context: context,
        // 自前でモーダル用Navigatorを作成
        builder: (context) => Navigator(
          onGenerateRoute: (context) => MaterialPageRoute<ModalPage>(
            builder: (context) => ModalPage(),
          ),
        ),
      ),
      child: Text('Show modal'),
    ),
    

    2. 화면을 닫을 때는 root측의 Navigator를 참조한다



    1.의 대응을 하면 모달내에서의 화면 천이는 잘 됩니다만, X 버튼등으로 모달을 닫을 때에 아래와 같은 거동이 되어, 잘 닫지 않습니다



    이것은 1.의 대응을 했을 때, Route가 중첩된 구조로 되어 있기 때문입니다. 중첩 된 아이의 Route 측에서 pop 그러므로 모달이 남아 있습니다.

    이것은 Navigator.of(context, rootNavigator: true) 에서 Root Navigator를 지정하여 해결할 수 있습니다.
    return Scaffold(
      appBar: AppBar(
        leading: IconButton(
            // 閉じるときはネストしているModal内のRouteではなく、root側のNavigatorを指定する必要がある
            onPressed: () => Navigator.of(context, rootNavigator: true).pop(),
            icon: Icon(Icons.close)),
        title: Text('Modal'),
      ),
    

    완성







    만져서 움직일 수있는 데모를 DartPad에 넣어 두었으므로 활용하십시오.
    h tps://다 RT 퍼d. 다 RT광g. 오 rg / 65 아파 그림 d 5016C4d5C4f20549c575 그림 55
  • 좋은 웹페이지 즐겨찾기