c# - Xamarin 选项卡式表单应用程序模板:微调器不停止,异步任务无效
问题描述
更新:这不会发生在 Android 设备或 Android 模拟器上;这是 iOS 设备和 iOS 模拟器特定的错误。
我在 Mac 上运行一个开箱即用的模板。要测试自己,您可以简单地转到 Visual Studio:
- 文件
- 新解决方案
- 多平台:应用程序
- 选项卡式表单应用程序
在 iPhone 设备或 iPhone 模拟器上运行时,列表顶部的微调器不会停止旋转。我怀疑这是由于共享表单项目中的这段代码:
public class ItemsViewModel : BaseViewModel
{
public ObservableCollection<Item> Items { get; set; }
public Command LoadItemsCommand { get; set; }
public ItemsViewModel()
{
Title = "Browse";
Items = new ObservableCollection<Item>();
LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand());
MessagingCenter.Subscribe<NewItemPage, Item>(this, "AddItem", async (obj, item) =>
{
var newItem = item as Item;
Items.Add(newItem);
await DataStore.AddItemAsync(newItem);
});
}
async Task ExecuteLoadItemsCommand()
{
if (IsBusy)
return;
IsBusy = true;
try
{
Items.Clear();
var items = await DataStore.GetItemsAsync(true);
foreach (var item in items)
{
Items.Add(item);
}
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
finally
{
IsBusy = false;
}
}
}
具体来说,LoadItemsCommand = new Command(async () => await ExecuteLoadItemCommand())
与方法签名一起将其视为async Task<void>
.
我虽然将 Tasks 调用为 void 是一个很大的禁忌,因为除其他原因外,CLR 状态机不能对任务的结果做任何事情?此外,某些代表(值得注意)正在监视的此任务更改的任何内容IsBusy
都不会受到影响?
从BaseViewModel.cs:
public class BaseViewModel : INotifyPropertyChanged
{
public IDataStore<Item> DataStore => DependencyService.Get<IDataStore<Item>>();
bool isBusy = false;
public bool IsBusy
{
get { return isBusy; }
set { SetProperty(ref isBusy, value); }
}
...
}
从视图中,特别是微调控件ItemsPage.xaml:
IsRefreshing="{Binding IsBusy, Mode=OneWay}"
MacOS: 10.15.2, Visual Studio for Mac: 8.3.10(Build 2), Xcode: 11.3(11C29), iOS 模拟器: 11.3(SimulatorApp-912.5 SimulatorKit-570.3 CoreSimulator-681.17)
解决方案
在 Forms 和 iOS 项目中更新以下内容后,
- Xamarin.Forms (4.2.0.709249) -> (4.4.0.991265)
- Xamarin.Essentials (1.2.0) -> (1.3.1)
加载列表后,微调器现在停止旋转。应该注意的是,在创建这些项目时,尽管 Visual Studio 是最新的,但它选择使用过时的 NuGet 包创建所述项目。
推荐阅读
- javascript - Shopify API 访问已被禁用
- c++ - 来自 if/else 语句的 MSVC 编译器反汇编代码
- wpf - 在用户控件(winforms)的 windowsformhost(wpf)上调用鼠标双击
- python - 如何在程序使用 python 运行时从数据库中获取新数据而不刷新我的程序
- python - 更改 urllib2 的 IP 地址
- ubuntu - 安装 TPM 模拟器时出现 SSL 错误
- java - 如何使按钮单击功能被多次单击?
- google-sheets - 动态条件格式(最后一个值为 +1 的单元格)
- sql-server - 如何在 SSIS 数据流中捕获多个错误列
- vue.js - Vue 源代码 Q1:对“this._init”感到困惑