我正在尝试添加一个背景图片,无论哪个路线处于活动状态,该图片都将始终存在。下面的示例是受this answer启发的,但只有路线“/"的背景才可见。我希望不必为每个路线设置背景图片。有什么建议吗?
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: const BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/images/camping-background.png"),
fit: BoxFit.cover),
),
routes: <String, WidgetBuilder>{
'/login': (BuildContext context) => const Login(),
'/register': (BuildContext context) => const Register(),
'/home': (BuildContext context) => const Home(),
},
);
}
2条答案
按热度按时间gdx19jrr1#
更新的答案
为了获得背景图像,你可以简单地将MaterialApp Package 在DecoratedBox中。这比其他方法更可取(下面将进一步介绍),因为这会滥用
builder
,而builder
是用于其他目的的:一个构建器,用于在导航器上方插入小部件,或在路由器上方但在由WidgetsApp小部件创建的其他小部件下方插入小部件(当使用WidgetsApp.router构造器时),或用于完全替换导航器/路由器。
由于
MaterialApp
只配置非渲染小部件,而DecoratedBox
不依赖于它们中的任何一个,因此它可以简单地作为应用其余部分的父小部件来实现所需的效果。上一个答案
您可以使用
MaterialApp
上的builder
字段来提供TransitionBuilder函数,该函数为所有路由定义通用 Package :它将
BuildContext
以及当前渲染的路线child
作为参数,并返回一个Widget,然后将其显示为路线。此外,由于
home
和routes
的用法似乎有些混乱,因此以下是MaterialApp
文档的片段:1.对于/ route,如果非null,则使用home属性。
1.否则,如果路由表中有路由条目,则使用路由表。
1.否则,调用onGenerateRoute(如果提供)。它应为Home和routes未处理的任何有效路由返回非空值。
1.最后,如果所有其他操作都失败,则调用onUnknownRoute。
虽然你 * 可以 * 一起使用
home
和routes
,但我个人认为,除了initialRoute
之外,只使用routes
来指示哪个是第一个(除非它确实是默认的/
)的路由会更清楚。bis0qfac2#
将其复制并粘贴到dartpad上以查看结果
使用scaffold应用程序栏完成,无背景图像示例
**检查要点:**完整代码here