#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. При возврате чего-либо из функции навигация по-прежнему запускается. Я бы хотел это предотвратить.