MvvmCross中IMvxNavigationFacade跳转触发Init而非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
相关产品推荐
相关产品推荐

