每年左右,我都有一个移动应用程序要做,我选择Xamarin Forms来做。在开始一个空白项目之前,我试图看看哪些框架和模式是"趋势"而且我正试图建立一些稳固的东西。
在我的上一个应用程序中,我的研究引导我使用Autofac for IoC和MvvmLight进行自定义设置,以及一系列与他们配合使用的其他自定义服务。
当我来自网络时,我没有逃到Reactive Extensions浪潮,尤其是作为Angular dev。 所以,这一次,我的设置基于Splat(我更喜欢Autofac,但你知道的是tradeoffs)和ReactiveUI。
我很高兴。 然而,在我的上一次申请中,还有一件我真正不满意的事情:导航。网上的大多数示例都是基本的(基本NavigationPages上的推/弹),没有那些做得很好的库,ReactiveUI的导航是......好吧,limited。
所以我必须制作自己的根视图和导航服务,我的意思是,我没有写过它,但是Kent Boogaart did in a blog post(如果你有兴趣回答我的问题,我建议你看看根据我的用例,我可以更好地了解限制。它看起来不错。在我不得不处理更复杂的场景之前,我很喜欢它,例如导致MasterDetailPage
和TabbedPage
的登录页面。
再次繁荣,我花了几个小时与模糊的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。
所以我的整体问题是:你有好的示例,展示真实导航的真实应用吗?你有没有遇到同样的问题?你的方法是什么?我愿意接受评论,代码片段或NuGet包。一切都可以帮助我专注于实际的应用程序,而不是一遍又一遍地构建我自己的框架,而不是真的满意。
答案 0 :(得分:1)
我使用MVVMV Framework Freshmvvm。它具有很好的导航功能,允许我在导航和#34;堆栈之间切换&#34;从登录堆栈移动到主堆栈时。它具有与您显示的界面类似的界面。它允许我扩展或替换导航功能。它提供了一个可以换出的基本IOC容器。它可以扩展为支持标签页面的主要细节。我没有发现我无法使用或扩展它的情况。
And here is some more information about implementing custom navigation
答案 1 :(得分:0)
我在github上有一个示例应用程序,使用ReactiveUI在登录页面和MasterDetailPage之间切换。我不知道我是否正确实现了它,但它看起来效果很好。 Here is the link