【发布时间】:2018-06-14 08:24:01
【问题描述】:
我正在尝试为以下问题找出良好的架构解决方案:我有以下 一级 路线,也可以称为 布局:
/onboarding/* -> Shows onboarding layout
/dashboard/* -> Shows dashboard layout
/overlay/* -> shows slide up overlay layout
/modal/* -> shows modal layout
根据他/她的身份验证状态、操作等将用户路由到其中的每一个。我正确地理解了这个阶段。
当我想使用可以称为 页面的二级路由时出现问题,例如
/onboarding/signin -> Shows onboarding layout, that displays signin route
/onboarding/plan -> Shows onboarding layout, that displays plan options
/modal/plan-info -> Shows modal layout, over previous page (/onboarding/plan) and displays plan-information page.
我怎样才能最好地定义/组织这些,以便我可以有效地路由到它们显示的布局和页面?请注意,每当我在一个布局中路由页面时,布局都不会改变,但我想根据路由在其中更改内容(页面)。
到目前为止,我实现了以下目标
import "package:flutter/widgets.dart";
import "package:skimitar/layouts/Onboarding.dart";
import "package:skimitar/layouts/Dashboard.dart";
Route generate(RouteSettings settings) {
Route page;
switch (settings.name) {
case "/onboarding":
page = new PageRouteBuilder(pageBuilder: (BuildContext context,
Animation<double> animation, Animation<double> secondaryAnimation) {
return new Onboarding();
});
break;
case "/dashboard":
page = new PageRouteBuilder(pageBuilder: (BuildContext context,
Animation<double> animation, Animation<double> secondaryAnimation) {
return new Dashboard();
});
break;
}
return page;
}
/* Main */
void main() {
runApp(new WidgetsApp(
onGenerateRoute: generate, color: const Color(0xFFFFFFFFF)));
}
这路由到登机和仪表板布局(现在只是简单的容器包装文本)。我也相信我可以使用 PageRouteBuilder 后者来动画路线之间的过渡?现在我需要弄清楚如何在登机和仪表板上安装类似 nested secondary router 的东西。
下面是我想要实现的视觉表示,我需要能够成功地路由蓝色和红色位。在这个例子中,只要我们在/dashboard 下,蓝色位(布局)不会改变,但是当我们从/dashboard/home 导航到/dashboard/stats 时,红色位(页面)应该淡出并随着新内容淡入.如果我们从/dashboard/home 导航到/onboarding/home,红色位(布局)应该会随着它当前活动的页面一起消失,并显示新的入职布局,然后故事继续。
编辑我用下面概述的方法取得了一些进展,基本上我将在我的runApp 中确定布局,并在每个布局中声明新的WidgetsApp 和路由。它似乎有效,但有一个问题,当我点击“注册”时,我被重定向到正确的页面,但我也可以看到它下面的旧页面。
main.dart
import "package:flutter/widgets.dart";
import "package:myProject/containers/layouts/Onboarding.dart";
/* Main */
void main() {
runApp(new Onboarding());
}
Onboarding.dart
import "package:flutter/widgets.dart";
import "package:myProject/containers/pages/SignIn.dart";
import "package:myProject/containers/pages/SignUp.dart";
import "package:myProject/services/helpers.dart";
/* Onboarding router */
Route onboardingRouter(RouteSettings settings) {
Route page;
switch (settings.name) {
case "/":
page = buildOnboardingRoute(new SignIn());
break;
case "/sign-up":
page = buildOnboardingRoute(new SignUp());
break;
default:
page = buildOnboardingRoute(new SignIn());
}
return page;
}
class Onboarding extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Container(
decoration: new BoxDecoration(
color: const Color(0xFF000000),
image: new DecorationImage(
image: new AssetImage("assets/images/background-fire.jpg"),
fit: BoxFit.cover)),
child: new WidgetsApp(
onGenerateRoute: onboardingRouter, color: const Color(0xFF000000)),
);
}
}
SignUp.dart
import "package:flutter/widgets.dart";
class SignUp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Center(
child: new Text("Sign Up",
style: new TextStyle(color: const Color(0xFFFFFFFF))));
}
}
helpers.dart
import "package:flutter/widgets.dart";
Route buildOnboardingRoute(Widget page) {
return new PageRouteBuilder(
opaque: true,
pageBuilder: (BuildContext context, _, __) {
return page;
});
}
【问题讨论】:
-
您想通过嵌套路由器完全实现什么?你将如何使用它?有多种方法可以获得相同的布局没有嵌套路由器。所以很难给出一个能满足你要求的答案
-
@Darky 我的应用有几个布局,每个布局都可以根据路线显示内容。我不需要这个内容是全屏的,只需要在布局中占据一定的空间。我认为通过上层的路线决定显示哪种布局也很好。
-
抖动可能并不常见,我从 react-native 中获取了这个概念,在那里非常容易做到,但我在这里很难弄清楚。就像,假设您通过路由打开一个模态,并且这个模态内部有链接,以便在其中完成更多嵌套路由。
-
@Ilja 你接受了什么解决方案?我现在和你完全一样,一直在努力解决如何完成这件事。一点帮助?
-
@Alagh 这是一个游戏应用程序,所以最后我放弃了颤振以支持 webgl,恐怕从来没有真正达到我解决这个问题的地步。但是接受的答案有一些很好的指导,希望它有所帮助