每年左右,我都会有一个移动应用程序要做,我会选择Xamarin Forms来做。在开始一个空白项目之前,我会尝试看看哪些框架和模式是"趋势",我会努力构建一些坚实的东西。
在我的上一个应用程序中,我的研究使我使用Autofac为IoC和MvvmLight进行了自定义设置,以及其他一些很好的自定义服务。
由于我来自网络,我并没有逃脱到反应式扩展的浪潮,尤其是作为一名Angular开发人员。所以,这一次,我的设置是基于Splat(我更喜欢Autofac,但…权衡一下,你知道)和ReactiveUI。
我很满意。然而,在我最近的应用程序中,仍然有一件事让我非常不满意:导航。网络上的大多数例子都是基本的(在基本的NavigationPages上推送/弹出),没有库能很好地做到这一点,而且ReactiveUI的导航是……嗯,有限的。
所以我不得不制作我自己的根视图和导航服务,我的意思是,我没有写,但Kent Boogaart在一篇博客文章中写了(如果你有兴趣回答我的问题,我建议你看看impl,更好地了解我的用例限制)。而且看起来不错。一开始我很喜欢它,在我不得不处理更复杂的场景之前,比如一个指向MasterDetailPage
和TabbedPage
的登录页面。
再次,我花了几个小时与晦涩的X.F或Android异常和复杂的导航逻辑作斗争,以使处理的服务非常常见用例。我在网上找不到有效的例子,看起来每个人都只构建有三个屏幕的示例应用程序,除了导航页面之外没有其他任何东西。
我迷路了。
以下是我目前拥有的API,来自Kent Boogaart的博客。
根视图:
public interface IView
{
IObservable<IViewModel> PagePopped { get; }
IObservable<Unit> PushPage(IViewModel pageViewModel, string contract, bool resetStack, bool animate);
IObservable<Unit> PopPage(bool animate);
IObservable<Unit> PushModal(IViewModel modalViewModel, string contract);
IObservable<Unit> PopModal();
}
服务:
public interface IViewStackService
{
IView View { get; }
IObservable<IImmutableList<IViewModel>> PageStack { get; }
IObservable<IImmutableList<IViewModel>> ModalStack { get; }
IObservable<Unit> PushPage(
IViewModel page,
string contract = null,
bool resetStack = false,
bool animate = true);
IObservable<Unit> PopPage(bool animate = true);
IObservable<Unit> PushModal(IViewModel modal, string contract = null);
IObservable<Unit> PopModal();
}
我想做的事:
--------------------------
| navigation page | <- user not logged in, it's the root page
| --------- ------------ |
| | login | | register | |
| --------- ------------ |
|------------------------|
|
| -> user logs in
| via a hack, i can replace the root page with the masterdetails created by hand
| and reuse my previous root navigation page from the login screen as the new root,
| setting it as the Detail page (so the MasterDetail is not handled by my service)
V
----------------------------------
| masterdetail page |
| -------------------------- | -> this begins to get really complicated
| | detail 1 / tabbed page | |
| | ---------- ---------- | |
| | | page 1 | | page 2 | | |
| | ---------- ---------- | |
| -------------------------- |
| ------------------------------ |
| | detail 2 / navigation page | | -> this could be doable with the current implementation
| | ---------- ------- | | but erh..
| | | page 1 |->| etc | | |
| | ---------- ------- | |
| ------------------------------ |
----------------------------------
正如您所看到的,第一个问题是当前服务只处理一个根导航页面,而我无法正确可靠地处理MasterDetailPages或TabbedPages。
所以我的总体问题是:你有没有好的示例显示了一个具有真实导航的真实应用程序?你遇到过同样的问题吗?你会采取什么方法?我对评论、代码片段或NuGet包持开放态度。所有能帮助我专注于实际应用程序的东西,而不是一次又一次地构建自己的框架,却从未真正感到满意。
我使用MVVMV框架Freshmvvm。它有很好的导航功能,允许我在从登录堆栈移动到主堆栈时在导航"堆栈"之间切换。它的界面与您展示的界面相似。它允许我扩展或替换导航功能。它提供了一个可以交换的基本IOC容器。它可以扩展为支持带有选项卡页面的主细节。我没有发现我不能使用或扩展它的情况。
以下是的主要细节
下面是一些关于实现自定义导航的更多信息
我在github上有一个使用ReactiveUI的示例应用程序,它可以在登录页面和MasterDetailPage之间切换。我不知道我是否正确地实现了这一点,但它似乎很有效。这是链接