Xamarin.Forms Page.OnAppearing 中的 Page.DisplayAlert

2024-03-17

我无法获得DisplayAlert弹出窗口显示在OnAppearingXamarin.Forms 的回调Page。这是我到目前为止所尝试过的:

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

    this.DisplayAlert("Alert", "Consider yourself alerted", "OK");
}

考虑到DisplayAlert从技术上讲是async函数,返回一个Task,我还尝试了以下方法:

protected async override void OnAppearing()
{
    base.OnAppearing();

    await this.DisplayAlert("Alert", "Consider yourself alerted", "OK");
}

然而,这两种方法似乎都不起作用。我的猜测是这并没有多大意义OnAppearing to be async根本没有,因为它不返回Task,因此对于调用框架来说,这变成了一种即发即忘的情况。扩展相同DisplayAlert在此背景下。所以一方面,我真的不希望这能起作用,但万一我错了,是否可以使用DisplayAlert in OnAppearing?

Update

看来我未能提供一些背景信息。我正在使用 Xamarin.Forms Shell 模板;虽然我已经开发了一些超越最初的模板,所以现在很难说 Shell 本身的贡献有多大。另外,我的主要目标平台是Android。

话虽这么说,我能够启动一个空白的应用程序模板,并在其他新鲜的应用程序中尝试上面的代码MainPage——两者都工作得很好。我仍然不知道为什么它们在我的实际应用程序环境中不起作用,所以我将在那里进行一些挖掘并报告任何发现。


我的小实验更进一步,尝试了基本的 Shell 模板应用程序。

添加 OP 示例DisplayAlert代码到mainItemsPage代码隐藏不起作用。如果我这样做的话

protected async override void OnAppearing()
{
    base.OnAppearing();

    if (viewModel.Items.Count == 0)
        viewModel.LoadItemsCommand.Execute(null);

    await this.DisplayAlert("Alert", "Consider yourself alerted", "OK");
}

项目将加载,但不会显示对话框。如果我将对话框向上移动,

protected async override void OnAppearing()
{
    base.OnAppearing();

    await this.DisplayAlert("Alert", "Consider yourself alerted", "OK");

    if (viewModel.Items.Count == 0)
        viewModel.LoadItemsCommand.Execute(null);
}

该对话框不会显示,也不会加载项目。因此,异步执行死了和/或溜进了天空中的大桶中。

然后我尝试添加DisplayAlert样本到主要AppShell页面,才发现OnAppearing根本不会调用 overrideShell班级。以下开放的 Shell 问题证实了这一点:[Bug] Shell - OnAppearing 未执行 第6486章 https://github.com/xamarin/xamarin.forms/issues/6486#.

最后,作为最后的努力,我尝试拨打电话DisplayAlert进入异步回调执行LoadItemsCommand in ItemsPage.OnAppearing。有点令人讨厌,因为它将视图传递到视图模型中,这首先就直接违背了良好的 MVVM ——

async Task ExecuteLoadItemsCommand(ItemsPage view)
{
    if (IsBusy)
        return;

    IsBusy = true;

    try
    {
        Items.Clear();
        var items = await DataStore.GetItemsAsync(true);
        foreach (var item in items)
        {
            Items.Add(item);
        }

        await Device.InvokeOnMainThreadAsync(async () =>
            await view.DisplayAlert("Alert", "Consider yourself alerted", "OK"));
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex);
    }
    finally
    {
        IsBusy = false;
    }
}

别用石头砸我。

这似乎并没有取得更好的结果。就像打电话时一样DisplayAlert直接在页面的OnAppearing执行时,刚刚午休。旋转器绑定到IsBusy标志从未停止,因此表明finally块甚至从未被执行。

我目前的一般理解是,目前可以从 Shell 完成的异步操作类型存在一些限制。ContentPage。即便是await埃德致电DataStore.GetItemsAsync在这个实现中并不是真正的异步,所以我有点怀疑它是否真的能在真正的异步数据库连接下工作。我已经能够得到DisplayAlert在正常事件处理程序的上下文中工作,所以我认为问题的范围是在初始化逻辑期间发生的任何事情OnAppearing以及它最终直接调用或调度的任何内容。其中大部分只是观察性猜测,但我可能会将其作为错误转发,除非有人可以提供更完整的分析。

Update(用于关闭、强迫症、文档等)

正如评论所示,我使用的 Xamarin.Forms 版本 (4.2.0) 有一个错误,该错误已在更高版本中修复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xamarin.Forms Page.OnAppearing 中的 Page.DisplayAlert 的相关文章

随机推荐

  • Cassandra 时间序列数据模型

    我正在研究用于存储时间序列的 Cassandra 数据模型 我是 Cassandra 新手 我有两个应用程序 日内股票数据和传感器数据 股票数据将以一分钟的时间分辨率保存 七个数据字段构建一个时间范围 符号 日期时间 开盘价 最高价 最低价
  • 如何测试两个时间范围是否重叠?

    我需要实现预订功能并确保预订不会在 Rails 应用程序中重叠 The cover and between 方法不太符合我的需要 与同一模型上的其他潜在范围相比 我必须确保时间范围的唯一性 并高效地做到这一点 我认为可以使用overlaps
  • Python:Ascii字符<->十进制表示转换

    您好 我需要能够将 ascii 字符转换为其十进制等效字符 反之亦然 我怎样才能做到这一点 num ord char char chr num 例如 gt gt gt ord a 97 gt gt gt chr 98 b 您可以阅读有关 P
  • 添加不存在的订单元数据以扩展 WooCommerce 管理订单对特定产品的搜索

    继我之前的问题之后 我还有一个问题 添加不存在的订单元数据以扩展 WooCommerce 管理订单搜索 https stackoverflow com questions 77206771 add unexisting order meta
  • 读已提交隔离级别是否会导致死锁(Sql Server)?

    我的理解deadlocks是 两个进程试图争夺同一资源 通常是两个进程试图 写入 同一行数据 如果一个进程所做的只是读取数据 而另一个进程正在更新数据 那么这怎么会是资源争用呢 然而 在我们的数据库中 它被设置为默认事务级别ReadComm
  • 如何禁止取消选择 ListView 中的项目?

    I ve got
  • 如何在不进行字符串转换的情况下计算整数中的数字?

    我担心这个问题有一个简单而明显的答案 我需要确定物品计数的位数 以便我可以用minimum保持对齐所需的前导零的数量 例如 如果总数 一种解决方案是将项目计数转换为字符串 然后计算字符数 哎呀 有没有更好的办法 编辑 我不会想到使用常用对数
  • 执行“docker Push”时 gcloud ping 尝试失败

    我运行了以下命令 gcloud preview docker push gcr io project name an image 我收到以下错误 有谁知道我如何解决这个问题或者这意味着什么 我所做的只是遵循标准示例只是为了了解它是如何工作的
  • Android MediaPlayer 卡在prepare() 中

    我遇到了一个严重的问题 媒体播放器 MP 卡在prepare 方法 我的应用程序运行prepare in an AsyncTask以避免阻塞 UI 因为来源来自网络 有几个 播放 按钮用户可以随时单击 因此我添加了prepare 在同步方法
  • 屏障/栅栏以及获取、释放语义是如何在微架构上实现的?

    很多问题以及文章 书籍 例如https mirrors edge kernel org pub linux kernel people paulmck perfbook perfbook 2018 12 08a pdf https mirr
  • 每当我单击“档案”选项卡时,Xcode 4.3.2 管理器都会冻结

    我尝试归档一个项目以便将其上传到 TestFlight 然而 当我打开 Organizer 将存档导出为 ipa 时 当我单击 存档 选项卡时 它就冻结了 我尝试创建另一个用户 同样的问题 我也尝试删除档案文件夹的内容 也是如此 Xcode
  • 如何将地图设置为另一个div内的div?

    我是 javascript 的新手 我需要您的帮助来将 google 地图设置为另一个 div 元素内的 div 元素 以下是在 div 元素未嵌套时有效的代码 function initialize var myOptions cente
  • jqPlot荧光笔改变x值

    我有一个 jqPlot 线图 我正在尝试弄清楚如何自定义 X 值的荧光笔文本 所以 我有以下内容 var line1 100 68 63 36 28 var line2 100 71 68 42 32 var line3 100 60 45
  • Google Dataproc 初始化脚本错误找不到文件

    我正在使用 Google Dataproc 来初始化 Jupyter 集群 起初 我使用了 github 中提供的 dataproc initialization actions 它的工作方式非常神奇 这是文档中提供的创建集群调用 gclo
  • x-webkit-speech,如何自动点击麦克风图标自动录制多个单词?

    I am working on chrome browser The code
  • Android Studio 无法识别 LG G4

    我刚刚拿到 LG G4 手机 打开开发人员选项模式 尝试从 Android Studio 运行应用程序 但它无法识别我的手机 我什至尝试从 MTP 切换到 PTP 但仍然无法识别 我尝试了很多那里的资源 仍然一无所获 请问有人可以帮忙吗 所
  • 为什么 JavaScript 中 (1 < NaN) 为假?

    为什么 1 lt NaN 回报false并不是undefined 在 JavaScript 中 在 11 8 5 抽象关系比较算法 中 它说如果其中一个值是 NaN 在 ToPrimitive 和 ToNumber 之后 在我看来 这不应该
  • 请求stream_tag表

    我正在尝试使用应用程序的 php api 请求stream tag facebook 表 SELECT post id actor id target id FROM stream tag WHERE target id me 它只给我 1
  • DRY 实体框架搜索调用

    我有一个实体框架 v5 0 DbContext called Entities这是由框架自动生成的 我认为我的设计模式是数据库优先 我有一个在整个应用程序中调用的搜索命令 如下面的代码片段所示 我想干燥我的控制器代码并将其重构为方法调用 u
  • Xamarin.Forms Page.OnAppearing 中的 Page.DisplayAlert

    我无法获得DisplayAlert弹出窗口显示在OnAppearingXamarin Forms 的回调Page 这是我到目前为止所尝试过的 protected override void OnAppearing base OnAppear