Как запретить навигацию из Navigator.pushNamed … и отображать нижний модальный?

#flutter

#flutter

Вопрос:

Если у меня есть MaterialApp с routes defined, при навигации запускается функция.

Для некоторых маршрутов (защищенных) Я бы хотел предотвратить эту навигацию и открыть модальный нижний лист с showModalBottomSheet

Я пытался сделать это так:

 class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My Flutter App',
      routes: <String, WidgetBuilder>{
        '/profile': (context) {
          if (signedIn) {
            return PopScreen();
          } else {
            showModalBottomSheet<void>(
              context: context,
              builder: (BuildContext context) {
                return Container(
                    color: Color(0xFF737373),
                    child: FractionallySizedBox(
                        heightFactor: 1,
                        child: Container(
                          decoration: BoxDecoration(
                              color: Colors.amber,
                              borderRadius: BorderRadius.only(
                                  topRight: Radius.circular(radius),
                                  topLeft: Radius.circular(radius))),
                          child: Center(
                            child: Column(
                              mainAxisAlignment: MainAxisAlignment.center,
                              mainAxisSize: MainAxisSize.min,
                              children: <Widget>[
                                const Text('Modal BottomSheet'),
                                RaisedButton(
                                  child: const Text('Close BottomSheet'),
                                  onPressed: () => Navigator.pop(context),
                                ),
                              ],
                            ),
                          ),
                        )));
              },
            );
          }
        },
      },
      home: Home(),
    );
  }
}
  

При вышеуказанном маршрутизатор не достигает /profile маршрута, и это нормально, но затем я получаю сообщение об ошибке The builder for route returned null. The builders must never return null .

Как я могу запретить навигацию?

Есть ли лучший способ сделать это? В найденных мною руководствах, похоже, предлагается добавить кнопку if logged in on a и перенаправить оттуда, но, похоже, эта часть должна быть центральной внутри маршрутизатора.

Комментарии:

1. показать больше кода для showModalBottomSheet(…);

2. @griffins Я добавил больше описания. Я также нашел ModalRoute, который, судя по описанию, является именно тем, что я хотел бы сделать, я не могу найти пример того, как его использовать: ( api.flutter.dev/flutter/widgets/ModalRoute-class.html

3. Я думаю, вам нужно добавить return перед showModalBottomSheet или вернуть простой каркас, а затем в функции OnInit отобразить диалоговое окно или таблицу действий

Ответ №1:

во-первых, я думаю, вам нужно добавить return перед showModalBottomSheet или вернуть простой каркас, затем в функции OnInit показать диалоговое окно или таблицу действий

если это не сработает, попробуйте

создайте сервис или вспомогательную функцию для перехода к профилю и используйте ее во всем приложении

 class NavigationService {

  static navigateToProfile(Context context) {...}


}

  

проверьте isLogged и, если true, перейдите к маршруту. если false, покажите Dialog() или откройте таблицу действий для этого

Комментарии:

1. Добавление помощника помогло бы, но если я забуду его использовать, интерфейс станет нестабильным. Я бы хотел, чтобы это произошло на уровне маршрутизатора. В React native я использовал reactnavigation.org/docs/4.x/custom-routers , возвращает null из навигации, а затем открывает модальный

2. При возврате чего-либо из функции навигация по-прежнему запускается. Я бы хотел это предотвратить.