如果我有一个定义为routes
的MaterialApp,则在导航时会触发一个函数。
对于某些路线(受保护的路线),我想阻止该导航,并使用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
并从那里重定向,但是看来这部分应该位于路由器的中央。
答案 0 :(得分:0)
首先,我认为您需要在showModalBottomSheet之前添加return或返回简单的脚手架,然后在onInit函数中显示对话框或操作表
如果这不起作用,请尝试
创建服务或帮助程序功能以导航到个人资料并在整个应用程序中使用
class NavigationService {
static navigateToProfile(Context context) {...}
}
检查isLogged,如果为true,则导航至路由。如果为错误的ShowDialog()或为此打开操作表