【问题标题】:State of the Art navigation & routing with Xamarin Forms and ReactiveUI使用 Xamarin Forms 和 ReactiveUI 实现最先进的导航和路由
【发布时间】:2017-11-07 20:09:05
【问题描述】:

每年左右,我都有一个移动应用要做,我选择 Xamarin Forms 来做。在开始一个空白项目之前,我试图了解哪些框架和模式正在“流行”,并且我正在尝试构建一些可靠的东西。

在我的上一个应用程序中,我的研究引导我使用 Autofac for IoC 和 MvvmLight 进行自定义设置,以及与它们配合得很好的一系列其他自定义服务。

由于我来自网络,我并没有逃到响应式扩展浪潮中,尤其是作为 Angular 开发人员。 所以,这一次,我的设置是基于 Splat(我更喜欢 Autofac,但是.. tradeoffs,你知道)和 ReactiveUI。

我对此很满意。 然而,在我最后的应用程序中,还有一件事我非常不满意:导航。网络上的大多数示例都是基本的(在基本 NavigationPages 上推送/弹出),没有库可以做得很好,ReactiveUI 的导航是......好吧,limited

所以我只好自己做根视图和导航服务,我的意思是,不是我写的,而是Kent Boogaart did in a blog post(如果你有兴趣回答我的问题,我建议你看一下impl以获得更好地了解我的用例的局限性)。而且看起来不错。一开始我很享受,在我不得不处理更复杂的场景之前,比如一个指向MasterDetailPageTabbedPages的登录页面。

再一次,我花了好几个小时与晦涩的 X.F 或 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。

所以我的总体问题是:你有没有个例子展示了一个真正的应用程序和真正的导航?你有遇到过同样的疑问吗?你的方法是什么?我对 cme​​ts、代码 sn-ps 或 NuGet 包持开放态度。所有可以帮助我专注于实际应用程序的东西,而不是一遍又一遍地构建自己的框架,而不会真正满足。

【问题讨论】:

  • 不明原因的反对票?很抱歉没有提出可以轻松进行代表耕作的问题。
  • 我不同意反对票,我赞成:)
  • 来自stackoverflow.com/help/on-topic:“要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件”
  • 我真的很惊讶这是题外话。我经常发现(并搜索!)这样的主题,我发现它们非常有启发性和有用性。 Like the one I linked in my question。我应该发布一个新问题“帮助,此服务不起作用,请您修复它”?如果是措辞问题...
  • 一个有趣的问题。将其标记为离题有点下意识的反应,只是因为这不是关于代码损坏的问题。

标签: architecture xamarin.forms navigation reactiveui


【解决方案1】:

我使用 MVVMV 框架 Freshmvvm。它有很好的导航功能,并允许我在从登录堆栈移动到主堆栈时在导航“堆栈”之间进行交换。它具有与您显示的界面相似的界面。它允许我扩展或替换导航功能。它提供了一个可以换出的基本 IOC 容器。它可以扩展以支持带有标签页的主详细信息。我还没有发现无法使用或扩展的情况。

Here are the main details

And here is some more information about implementing custom navigation

【讨论】:

  • 确实很有前途,乍一看它看起来很灵活。我只是想知道这是否不会增加太多开销/复杂性,因为我已经有了 ReactiveUI 和 Splat - 我需要两个兼容层(ReactiveUI 需要 Splat)。我会研究它,看看是否可以很好地完成,或者只是从中获得一些灵感。谢谢!
【解决方案2】:

我在 github 上有一个示例应用程序,它使用 ReactiveUI 在登录页面和 MasterDetailPage 之间切换。我不知道我是否正确地实现了这一点,但它似乎工作得很好。 Here is the link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    相关资源
    最近更新 更多