Mor*_*ing 5 architecture navigation reactiveui xamarin.forms
每年左右,我都有一个移动应用程序要做,我选择 Xamarin Forms 来做。在开始一个空白项目之前,我试图了解哪些框架和模式是“趋势”的,并且我正在尝试构建一些可靠的东西。
在我的最后一个应用程序中,我的研究使我使用 Autofac 为 IoC 和 MvvmLight 进行了自定义设置,以及一堆与它们配合良好的其他自定义服务。
因为我来自网络,所以我没有逃到 Reactive Extensions 浪潮中,尤其是作为一个 Angular 开发者。所以,这一次,我的设置基于 Splat(我更喜欢 Autofac,但是……权衡,你知道)和 ReactiveUI。
我很满意。但是,在我上次申请中,还有一件事让我非常不满意:导航。网络上的大多数示例都是基本的(基本导航页面上的推送/弹出),没有库可以很好地完成它,而 ReactiveUI 的导航是......好吧,有限。
所以我不得不制作我自己的根视图和导航服务,我的意思是,我没有写它,但是Kent Boogaart 在一篇博客文章中做了(如果你有兴趣回答我的问题,我建议你看一下 impl to鉴于我的用例,更好地了解限制)。它看起来不错。一开始我很喜欢它,然后我不得不处理更复杂的场景,比如导致MasterDetailPage, 和TabbedPages的登录页面。
再一次,我花了几个小时与晦涩的 XF 或 Android 异常和复杂的导航逻辑作斗争,以便制作一个处理非常常见用例的服务。我无法在网上找到有效的示例,看起来每个人都只构建具有三个屏幕的示例应用程序,除了 NavigationPage 之外没有其他任何东西。
我迷路了。
这是我目前拥有的 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 容器。它可以扩展以支持带有选项卡式页面的主详细信息。我还没有发现无法使用或扩展它的情况。
| 归档时间: | 
 | 
| 查看次数: | 891 次 | 
| 最近记录: |