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

Xamarin.Forms:使用AppShell路由时如何共享VidyoController实例?

在Xamarin.Forms AppShell路由中传递VidyoController实例

针对你这种场景,有几种可行的方案可以将IVidyoController实例从AppDelegate传递到目标视图,以下是具体实现:

方案1:依赖注入(推荐)

这是最符合Xamarin.Forms设计规范的方式,适合跨页面共享服务类实例,实现松耦合。

  1. 在App.xaml.cs中注册实例到依赖注入容器:
public App(IVidyoController vidyoController)
{
    InitializeComponent();
    // 将VidyoController实例注册为单例服务
    DependencyService.RegisterSingleton<IVidyoController>(vidyoController);
    MainPage = new AppShell();
}
  1. 在目标视图的构造函数中获取实例:
public VideoCallPage()
{
    InitializeComponent();
    // 获取注册的VidyoController实例
    var vidyoController = DependencyService.Get<IVidyoController>();
    // 后续业务逻辑中使用该实例
}

方案2:通过App类静态属性传递

如果不想使用依赖注入,可以通过App类的静态属性来存储和访问实例:

  1. 修改App.xaml.cs添加静态属性:
public partial class App : Application
{
    // 静态属性存储VidyoController实例
    public static IVidyoController VidyoControllerInstance { get; private set; }

    public App(IVidyoController vidyoController)
    {
        InitializeComponent();
        VidyoControllerInstance = vidyoController;
        MainPage = new AppShell();
    }
}
  1. 在目标视图中直接访问:
public VideoCallPage()
{
    InitializeComponent();
    var vidyoController = App.VidyoControllerInstance;
    // 使用实例执行视频通话相关操作
}

方案3:导航时传递参数(适合单次传递)

如果仅在导航到目标页面时需要传递实例,可以利用AppShell的导航参数机制:

  1. 先在AppShell.xaml.cs中注册目标页面的路由:
public AppShell()
{
    InitializeComponent();
    // 注册路由,假设目标页面名为VideoCallPage
    Routing.RegisterRoute(nameof(VideoCallPage), typeof(VideoCallPage));
}
  1. 在触发导航的页面中传递参数:
// 例如在某个按钮点击事件中触发导航
private async void NavigateToVideoCall(object sender, EventArgs e)
{
    // 从App类中获取已保存的实例,传递到目标页面
    await Shell.Current.GoToAsync($"{nameof(VideoCallPage)}?VidyoController={((App)Application.Current).mVidyoController}");
}
  1. 在目标页面中接收参数:
[QueryProperty(nameof(VidyoController), "VidyoController")]
public partial class VideoCallPage : ContentPage
{
    private IVidyoController _vidyoController;
    public IVidyoController VidyoController
    {
        get => _vidyoController;
        set
        {
            _vidyoController = value;
            // 实例赋值完成后执行初始化逻辑
        }
    }

    public VideoCallPage()
    {
        InitializeComponent();
    }
}

方案选择建议

  • 若多个页面需要使用该实例,优先选择依赖注入,它能更好地实现代码解耦和可测试性。
  • 若仅少数页面使用,且想快速实现,静态属性是最简单的方式。
  • 若只是单次导航传递,可使用导航参数,但需注意实例的序列化问题(若实例无法序列化,此方案可能不适用)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:13:26