【问题标题】:Navigate to a specific route in MAUI using Shell, from OnNewIntent in MainActivity?使用 Shell 从 MainActivity 中的 OnNewIntent 导航到 MAUI 中的特定路线?
【发布时间】:2023-02-07 17:18:34
【问题描述】:

我决定尝试使用 MAUI。我首先接近一个 Android 应用程序,并使用 Shell 进行导航。

我的应用程序有两种打开方式:

  1. 当用户点击图标打开它时
  2. 通过深层链接,由另一个应用程序触发。

    我遇到的问题是,当通过深层链接触发应用程序时,我需要导航到特定页面。我试图在访问 Shell 的当前实例的 OnNewIntent 上执行此操作,但是在执行 GoToAsync("my_route") 时,它会在尝试导航到新页面时出错。

    这是我在 MainActivity 上的内容:

    protected override void OnNewIntent(Intent intent)
    {
        base.OnNewIntent(intent);
        var action = intent.Action;
        var data = intent.DataString;
        if (!string.IsNullOrWhiteSpace(data) && data.Contains("/data/")) {
                           
            if(Shell.Current != null) 
            {                    
                Shell.Current.GoToAsync("myroute)";
                // Also tried: 
                // - Shell.Current.GoToAsync("myroute").Wait();
                // - App.Current.Dispatcher.Dispatch(async () => await Shell.Current.GoToAsync("//myroute")); (suggested by @toolmakersteve )
            }
        }
    }
    

    这是错误:

    Java.Lang.IllegalArgumentException: '找不到 id 0x1 的视图 (未知)片段 ShellItemRenderer{19d353d} (6c8560ab-dd58-4cbf-9e8b-2b9e12315f45 id=0x1)'

    我假设这与我正在做的事情是不可能的事实有关,所以我需要找到正确的方法来使用 Shell 导航从 MAUI 上的OnNewIntent 导航到特定页面。

    更新:同样重要的是要注意,当深度链接触发应用程序打开时,有两种不同的行为:

    1. 如果应用程序已经在运行,它会抛出上述异常
    2. 如果应用程序尚未运行,它会定期在主屏幕上打开,没有错误,但我希望它导航到所需的页面。

      谢谢!

【问题讨论】:

  • 你为什么要重写MainActivity中的方法OnNewIntent?如果您方便的话,能否请您发布一个基本的演示,以便我们可以在我们这边进行测试?
  • 我通过在首选项中保存来自深度链接的路由然后每隔一次启动将其删除来解决这个问题。但是很麻烦。您找到更好的解决方案了吗?

标签: android xamarin android-intent maui


【解决方案1】:

首先,确保 GoToAsync("myroute") 在更典型的地方使用它时有效,例如按下按钮。

假设可行,那么意图代码可能未在 Dispatcher 上下文(以前称为 MainThread)中运行。尝试:

Dispatcher.Dispatch(() => {
    Shell.Current.GoToAsync("myroute");
});

版本 2

也许深层链接逻辑在 App 的 OnResume 之前运行。
如果是这样,这可能会起作用:

在 App.xaml.cs 中:

public partial class App : Application
{
    ...
    public static bool FromDeepLink;

    protected override void OnResume()
    {
        base.OnResume();

        if (FromDeepLink)
        {
            FromDeepLink = false;
            MainPage = new MainPage();
            Dispatcher.Dispatch(() =>
            {
                Shell.Current.GoToAsync("myroute");
            });
        }
    }
}

然后在 OnNewIntent 中:

if (!string.IsNullOrWhiteSpace(data) && data.Contains("/data/")) {
    App.FromDeepLink = true;
}

【讨论】:

  • 嘿!感谢您的快速回复。我已经试过了,但仍然给出同样的错误。还确保我的路线在应用程序内有效,而且确实如此。一个有趣的注意是,如果应用程序之前没有运行,并且由 DeepLink 触发,它会像往常一样打开,而不是导航到我想要的路线。我会更新这个问题的行为。
  • 添加了版本 2。我没有使用深层链接,所以这是推测。
  • 不幸的是,这也不起作用。看起来当应用程序通过我的意图恢复时不会触发 OnResume。
【解决方案2】:

从概念上讲,@ToolmakerSteve 的答案是正确的,但是应用程序类的 OnResume 事件似乎不会在按意图恢复应用程序时触发(似乎是 Maui 错误),但是即使通过意图,您所要做的就是在 MainActivity 类中覆盖 Android 的本机 OnResume 方法:

protected override void OnResume()
{
    base.OnResume();

    var fromDeepLink = Preferences.Get("FromDeepLink", false);
    if (fromDeepLink)
    {
        Preferences.Set("FromDeepLink", false);
        Shell.Current.GoToAsync("myroute");
    }
}

protected override void OnNewIntent(Intent intent)
{
    base.OnNewIntent(intent);

    var action = intent.Action;
    var data = intent.DataString;
    if (!string.IsNullOrWhiteSpace(data) && data.Contains("/data/"))
    {
        Preferences.Set("FromDeepLink", true);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2019-01-12
    • 2022-12-26
    • 2018-06-05
    • 1970-01-01
    • 2014-12-17
    相关资源
    最近更新 更多