首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReactiveUI iOS路由

ReactiveUI iOS路由
EN

Stack Overflow用户
提问于 2018-05-25 11:05:42
回答 1查看 403关注 0票数 3

我开始在Xamarin iOS中尝试使用反应性UI,我对如何处理路由感到困惑。

让我们以典型的“LoginViewModel”为例,其内容如下:

代码语言:javascript
复制
public class LoginViewModel : ReactiveObject
{
    private readonly ReactiveCommand loginCommand;
    public ReactiveCommand LoginCommand => this.loginCommand;

    string username;
    public string Username
    {
        get { return username; }
        set { this.RaiseAndSetIfChanged(ref username, value); }
    }

    string password;
    public string Password
    {
        get { return password; }
        set { this.RaiseAndSetIfChanged(ref password, value); }
    }

    public LoginViewModel()
    {
        var canLogin = this.WhenAnyValue(
            x => x.Username,
            x => x.Password,
            (u, p) => !string.IsNullOrEmpty(u) && !string.IsNullOrEmpty(p)
        );

        this.loginCommand = ReactiveCommand.CreateFromTask(async () =>
        {
            //Simulate login
            await Task.Delay(2000);
            return true;
        }, canLogin);
    }
}

ViewDidLoad (主计长):

代码语言:javascript
复制
this.WhenActivated(d =>
{
    this.Bind(this.ViewModel, x => x.Username, x => x.Username.Text).DisposeWith(d);
    this.Bind(this.ViewModel, x => x.Password, x => x.Password.Text).DisposeWith(d);
    this.BindCommand(this.ViewModel, x => x.LoginCommand, x => x.LoginButton).DisposeWith(d);
});

这有效地绑定了那些UITextFields和Login按钮启用状态+ OnTouchUpInside的值。

现在,在de 文档中,您可以找到关于vm路由的以下内容:Android,iOS天生的:很难使工作

那么我在这里有什么选择呢?

公开一个DidLogIn属性(bool)并侦听(在视图中),其中包括:

代码语言:javascript
复制
this.WhenAnyValue(x => x.ViewModel.DidLogIn)
    .ObserveOn(RxApp.MainThreadScheduler)
    .Subscribe(() => {
        //Routing logic here
    });

是否有其他方法来处理视图路由(不是vm路由),我几乎找不到有关这方面的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-25 15:57:45

ReactiveUI在Xamarin表单上的路由非常简单,Xamarin Android/iOS是不同的历史,但是您可以尝试使用ReactiveUI的交互,这里是一个例子:

代码语言:javascript
复制
public class LoginViewModel : ReactiveObject
{

    private readonly Interaction<Unit, Unit> _navigate;
    public Interaction<Unit, Unit> Navigate => Navigate;

    public ReactiveCommand<Unit,bool> LoginCommand { get; set; }


    public LoginViewModel()
    {
        var canLogin = this.WhenAnyValue(
        x => x.Username,
        x => x.Password,
        (u, p) => !string.IsNullOrEmpty(u) && !string.IsNullOrEmpty(p));

        _navigate = new Interaction<Unit, Unit>();

        LoginCommand = ReactiveCommand.CreateFromTask<Unit, bool>(async _ =>
        {
            /*Logic here*/
            return true;
        }, canLogin);

       LoginCommand.Subscribe(async result => 
        {
            if (result)//this logic gets executed on your view by registering a handler :D
                await await _navigate.Handle(Unit.Default) ;
            else
                {}
        });
    }
}

所以在你看来

代码语言:javascript
复制
this.WhenActivated(disposables =>
{
   //bindings...
   //Register a handler:
   ViewModel.Navigate.RegisterHandler(async interaction =>
   {
       await NavigationLogic();
       interaction.SetOutput(Unit.Default);
   }).DisposeWith(disposables);
});

这个例子并不完美,但它是一种方法。

我希望这对您有所帮助,您可以在:https://reactiveui.net/docs/handbook/interactions/中找到更多关于交互的信息。

此外,在Xamarin Android +ReactiveUI中也有一个例子:https://github.com/bl8/ReactivePhoneword

问候

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50527773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档