我正在针对Win Store,WP8,iOS,Droid上的大型制药项目比较MvvmCross和ReactiveUI。我们已经选择了Xamarin。

我对ReactiveUI完全陌生。我真的很喜欢我原则上看到的内容,并且我认为Paul是个天才。然而,细节正在变成真正的负担。我花了几天时间查找文档(该手册来自2011年,似乎几乎已经过时-甚至不包含“Router”一词)和示例代码。

我正在看ReactiveUI.Samples中的示例
还有ReactiveUI解决方案中的项目MobileSample-RT。

我基于ReactiveUI.Samples“Routing”示例创建了一个小小的hello世界。坦白地说,这并不是一个示例,因为它所做的只是从AppBootstrapper导航到一个唯一 View 。我正在尝试执行与MobileSample-RT中的“三页”示例相似的操作。问题是,如果我在项目中尝试类似的方法:

HostScreen.Router.Navigate.Execute(RxApp.DependencyResolver.GetService(typeof(LoginViewModel)));

崩溃(未在ReactiveUI.dll中加载pdb符号)

如果我尝试这样做:
HostScreen.Router.NavigateCommandFor<LoginViewModel>().Execute(HostScreen);

结果相同-严重崩溃。这确实让我感到震惊,因为它似乎应该“正常工作”。

我可以这样称呼:
HostScreen.Router.Navigate.Execute(new LoginViewModel(HostScreen));

确实,这符合我的预期。我还在主屏幕上连接了后退按钮:
this.OneWayBind(AppBootstrapper, x => x.Router.NavigateBack, x => x.BackButton.Command);

这确实从我刚才浏览的 View 移回了。

所以现在我想再次前进。我再次单击执行此操作的按钮:
HostScreen.Router.Navigate.Execute(new LoginViewModel(HostScreen));

我回到那个观点。但是,这次需要两次单击“后退”按钮才能实际返回。如果我随后再次前进,则下次需要3次点击。 NavigationStack充满了LoginViewModel的新实例。

那么,进行路由/导航的正确方法是什么?这些命令为什么会崩溃?而不是每次在Navigate.Execute中都调用“new”,而是如何导航到导航堆栈中已经存在的 View 模型(或者应该首先放置在其中?)。

非常感谢您可以提供的任何清晰度。

最佳答案

如果您要针对iOS和Android进行构建,则根本不希望使用路由-路由的概念与平台要执行的操作有太多冲突(即使在WP8上也很费力,但我能够做到这一点工作)。您应该坚持以 View 优先的位置。

但是,如果您使用的是Xamarin Forms,则ReactiveUI可以很好地与基于VM的路由配合使用(因为Xamarin设法进行了所有修改,使之成为可能!)。查看https://github.com/paulcbetts/xamarinevolve2014的演示

我知道文档很烂,我正在研究新文档:

  • https://github.com/reactiveui/ReactiveUI/pull/391-拉取请求/进度
  • https://github.com/reactiveui/ReactiveUI/tree/docs/docs/basics-浏览版本
  • 关于mvvm - ReactiveUI-对路由感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21176903/

    10-13 05:57