flutter - 可以让导航器适应孩子的大小吗?
问题描述
我有一个导航器和一个嵌套在堆栈中的地图,导航器的子级具有动态大小。只有导航员强迫自己占据所有空间并覆盖他身后的地图。因此不可能移动地图。可以让导航器适应孩子的大小吗?
class Home extends StatefulWidget {
Home({Key key}) : super(key: key);
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: [
StreamProvider(
create: (context) => LocationService().locationStream,
child: MapView()
),
Positioned(
width: MediaQuery.of(context).size.width * 1,
bottom: 0,
child: ConstrainedBox(
constraints: BoxConstraints(
maxHeight: MediaQuery.of(context).size.height * 1,
maxWidth: MediaQuery.of(context).size.width * 1
),
child: navigator(),
)
),
],
)
);
}
navigator() {
return Navigator(
initialRoute: 'anyview',
onGenerateRoute: (settings) {
Widget view;
switch (settings.name) {
case 'anyview':
view = AnyViewDraggableScrollableSheet();
break;
case 'otheranyview':
view = OtherAnyViewDraggableScrollableSheet();
break;
}
var builder = (BuildContext _) {
return view;
};
return MaterialPageRoute(builder: builder, settings: settings);
},
);
}
}
这是问题的演示,导航器占用了所有可用空间,因此通过点击红色块来阻止它。 https://dartpad.dev/cd1c4d8f1067db0cc65ea2f62c2cbaad
解决方案
Navigator 管理一组路由,您可以从中将路由推送到页面或从中弹出路由。如果您试图在 Map 上方的同一页面中拥有某个容器,我认为 Navigator 不是正确使用的小部件,除非您实际上想要在其上方有一个页面。
我建议您使用可以放置在地图上方页面底部的向上滑动面板,用户只需向上滑动即可使用或查看您希望在其上播放的任何信息或按钮。
如果您不想自己创建一个,我过去曾在相同的案例场景中使用此包取得了成功。
另外,我相信使用 Navigator 的更简单方法是,
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => MyPage()));
如果您希望路由到与当前所在页面不同的页面,并且Navigator.pop(context);
如果您希望返回上一页。还有许多其他更具体的推送和弹出方法,您可以在详细的 Flutter 文档中查找。
推荐阅读
- c++11 - 有没有办法在 C++ 编译时创建唯一类型 ID
- python - 对 Python 闭包感到困惑
- python - 烧瓶 - request.files.getlist() - 不要跳过空
- python - 如何使用 Python 3 运行 cmd 命令?
- pdo - 如何将 PDO bindParam 用于 SphinxSearch 3?
- python - Python:从嵌套循环内部将网站抓取的数据从行转换为列
- java - 如何处理 10 位拜耳数据(字节数组)
- html - 如何在 mat-table angular 7 中突出显示新插入的行
- javascript - Three.js OrbitControls enableRotate/Pan = false 似乎不起作用
- angularjs - 如何修复 - AngularJS 中的下拉菜单