【问题标题】:Xamarin Forms RefreshView stopped working randomlyXamarin Forms RefreshView 随机停止工作
【发布时间】:2022-06-17 23:41:44
【问题描述】:

谁能告诉我我做错了什么? RefreshView 昨天才工作,今天我无法让它在任何页面上工作。我创建了一个只有 RefreshView 的全新页面,当我尝试下拉时它并没有让步。不下拉,不刷新,什么都没有。它只是在昨晚工作,今天在没有更改代码后它不起作用。我已经在模拟器和我的实际 iPad 上尝试过。在任何人建议之前,我的任何 NuGet 包都没有更新,我在 Google 上找不到任何关于此问题的参考。

XF:v5.0.0.2244

查看:

<?xml version="1.0" encoding="utf-8" ?>
<views:MvxContentPage
    x:Class="MyApp.UI.Pages.PricingPage"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:viewModels="clr-namespace:MyApp.Core.ViewModels;assembly=MyApp.Core"
    xmlns:views="clr-namespace:MvvmCross.Forms.Views;assembly=MvvmCross.Forms"
    Title="{Binding Title}"
    x:DataType="viewModels:PricingViewModel"
    x:TypeArguments="viewModels:PricingViewModel">
    <views:MvxContentPage.Content>
        <RefreshView Command="{Binding RefreshCommand}" IsRefreshing="{Binding IsRefreshing}">
            <CollectionView ItemsSource="{Binding MenuItems}" />
        </RefreshView>
    </views:MvxContentPage.Content>
</views:MvxContentPage>

视图模型:

using System.Threading;
using System.Threading.Tasks;
using MyApp.Core.ChurromigosApi;
using MyApp.Core.Services;
using MyApp.Core.ViewModels.Base;
using MvvmCross.Commands;
using MvvmCross.ViewModels;

namespace MyApp.Core.ViewModels
{
    public class PricingViewModel : BaseViewModel
    {
        private readonly IMenuItemService menuItemService;

        public PricingViewModel(IMenuItemService menuItemService)
        {
            this.menuItemService = menuItemService;

            this.RefreshCommand = new MvxAsyncCommand(this.Refresh);
            this.MenuItems = new MvxObservableCollection<MenuItem>();
            this.Title = "Pricing";
        }

        public MvxObservableCollection<MenuItem> MenuItems { get; set; }

        public IMvxAsyncCommand RefreshCommand { get; }

        public bool IsRefreshing { get; set; }

        public override Task Initialize()
        {
            this.IsRefreshing = true;

            return Task.CompletedTask;
        }

        private async Task Refresh()
        {
            var allMenuItems = await this.menuItemService.GetMenuItems(CancellationToken.None);

            this.MenuItems.Clear();
            this.MenuItems.AddRange(allMenuItems);
        }
    }
}

【问题讨论】:

  • 神秘问题是最糟糕的。我会尝试的事情,每次检查是否有效:1)重新启动。 2) 重建解决方案。 3)通过删除所有 bin 和 obj 文件夹彻底清理(首先保存到 repo 或将整个解决方案复制到另一个文件夹,以防意外删除重要的东西)。 4)创建一个全新的解决方案,创建一个新页面,看看是否可行。
  • 请不要将代码或错误作为图片发布
  • @Jason 更新为代码而不是图像
  • @ToolmakerSteve 已经尝试了所有这些:(
  • 能否请您发布有关此问题的相关错误日志?

标签: ios xamarin.forms pull-to-refresh


【解决方案1】:

我发现 RefreshView 存在类似问题,但在我的情况下,应用程序并没有变得无响应,而是崩溃了。

看来我们需要更加注意Mode 用于IsRefreshing 指标的属性的绑定:

  • 如果我们希望 RefreshView 在 VM 的绑定属性更改为 True 时自动触发命令,则不要包含 Mode,或使用 Mode=TwoWay,但不要手动更改值或你会陷入一个循环(或者在你的命令中包含if(IsRefreshing) return;,否则你不会得到任何结果)
  • 如果我们想在后端手动设置虚拟机的属性来显示/隐藏IsRefreshing活动指示器而不触发命令,那么使用Mode=OneWay,否则你会陷入循环。

在您的特定情况下,这可能与您将IsRefreshing 属性设置为true,然后您从未将其设置回false 的事实有关?我会用try 包装你的Refreshing() 方法的代码,在开头设置IsRefreshing=false,然后在finally 块中设置=false

【讨论】:

    猜你喜欢
    • 2014-04-11
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2018-02-22
    相关资源
    最近更新 更多