导航到新选项卡时调用异步函数

Posted

技术标签:

【中文标题】导航到新选项卡时调用异步函数【英文标题】:Calling an asynchronous function when navigating to a new tab 【发布时间】:2020-08-03 14:16:47 【问题描述】:

当用户导航到我的一个标签页时,我正在尝试立即显示 James Montemagno 的媒体选择器。我找到了一个名为 OnAppearing() 的函数,我尝试重写它来创建这个结果。尽管从技术上讲,当我切换选项卡时它会立即显示相机,但在我关闭媒体选择器后,我收到一条错误消息,提示“一次只能激活一个操作”。

这是我尝试实现此功能的方式:

protected override async void OnAppearing()
    
        TakePhotoButton_Clicked();
    


    async void TakePhotoButton_Clicked()
    
        //Allows users to take pictures in the app
        if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
        
            DisplayAlert("No Camera", "Camera is not available.", "OK");
            return;
        

        var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
        
            //Sets the properties of the photo file 
            SaveToAlbum = true,
            PhotoSize = PhotoSize.MaxWidthHeight,
            DefaultCamera = CameraDevice.Rear
        );

        if (file == null)
            return;
    

我对这一切都很陌生,我觉得自己好像犯了技术错误。我读了这篇 https://damian.fyi/2016/07/06/only-one-operation-can-be-active-at-at-time/ 的帖子,关于有人遇到同样的错误。他们声称,“我终于意识到,在拍摄照片后,它正在重新显示表单,导致出现的事件再次被触发,从而导致在拍摄旧照片的同时拍摄新照片。因此发生了崩溃。 "

但是,我不明白我的代码是如何造成这种情况的。任何指导将不胜感激。

【问题讨论】:

【参考方案1】:

使用bool 变量来检查您是否已经拍照

bool first = true;

protected override async void OnAppearing()

   if (first) TakePhotoButton_Clicked();


async void TakePhotoButton_Clicked()

    first = false;

    ...

【讨论】:

这可以消除我的错误,但它只会显示一次媒体选择器。如果我切换到其他选项卡并返回到相机选项卡,则不会显示媒体选择器。你对此有什么建议吗? 如果你真的想这样做,更好的方法可能是使用 TabbedPage 的 CurrentPageChanged 事件来触发选择器而不是 OnAppearing

以上是关于导航到新选项卡时调用异步函数的主要内容,如果未能解决你的问题,请参考以下文章

选择 UITabBar 时调用方法?

CSS 突出显示活动选项卡

Layui(三):导航菜单、选项卡、进度条和面板

如何从 JavaScript 函数导航到 <p:tabView> 的特定选项卡

如何将不同的域或子域打开到新选项卡以及相同的域链接到相同的选项卡

习题 导航栏 选项卡 图片左右切换