You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MvvmCross中IMvxNavigationFacade跳转触发Init而非Prepare的解决问询

在MvvmCross 5.6.x中通过IMvxNavigationFacade触发类型安全的Prepare()方法

当然可以!你遇到的问题核心在于用MvxBundle传参是MvvmCross旧版导航的适配方式,对应触发Init()方法;而新版类型安全的Prepare()方法需要直接传递ViewModel对应的参数类实例,而非把参数打包到Bundle中。下面是具体的实现方案:

1. 先确保目标ViewModel定义了类型安全的Prepare方法

首先,你的目标ViewModel需要继承泛型版MvxViewModel<TParameter>,或者显式声明接收参数类的Prepare方法:

// 自定义的类型安全参数类
public class TargetNavParameters
{
    public int ContentId { get; set; }
    public string ContentTitle { get; set; }
}

// 目标ViewModel
public class TargetViewModel : MvxViewModel<TargetNavParameters>
{
    public override void Prepare(TargetNavParameters parameters)
    {
        // 在这里处理类型安全的参数
        var targetId = parameters.ContentId;
        var targetTitle = parameters.ContentTitle;
    }
}

2. 在BuildViewModelRequest中传递参数类实例

在你的IMvxNavigationFacade实现的BuildViewModelRequest方法里,放弃将参数塞进MvxBundle,而是直接构造参数类实例,赋值给MvxViewModelRequest的RequestParameters属性:

public MvxViewModelRequest BuildViewModelRequest(Uri uri, MvxBundle bundle)
{
    // 从深度链接Uri解析参数,构造参数类实例
    var navParams = ExtractParamsFromDeepLink(uri);

    // 构造ViewModel请求,关键是传递RequestParameters
    return new MvxViewModelRequest(
        viewModelType: typeof(TargetViewModel),
        parameterBundle: null, // 旧版Bundle可传null,因为使用了类型安全参数
        requestParameters: navParams, // 这里传入参数类实例
        requestedBy: MvxRequestedBy.UserAction);
}

// 示例:从Uri解析参数的工具方法
private TargetNavParameters ExtractParamsFromDeepLink(Uri uri)
{
    // 根据你的深度链接格式解析参数,比如从QueryString提取
    var queryParams = System.Web.HttpUtility.ParseQueryString(uri.Query);
    return new TargetNavParameters
    {
        ContentId = int.Parse(queryParams["cid"]),
        ContentTitle = queryParams["title"]
    };
}

原理说明

MvvmCross 5.x的导航系统逻辑是:

  • 当MvxViewModelRequest的RequestParameters不为null时,框架会自动匹配ViewModel中对应参数类型的Prepare方法并调用
  • 只有当RequestParameters为null,且ParameterBundle包含数据时,才会触发旧版的Init()(或InitFromBundle)方法

按这个方式修改后,深度链接导航就会触发目标ViewModel的Prepare()方法,实现类型安全的参数传递了。

内容的提问来源于stack exchange,提问作者Mark Reynolds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:24:06