【发布时间】:2022-01-04 23:02:12
【问题描述】:
我创建了一个 Xamarin Forms 5.0 应用程序 (VS 2022)。我的项目由 Android 和 iOS 的主要应用程序和端口组成。我想添加一个启动画面,它执行以下操作:
- 显示徽标
- 在后台创建表(如果它们不存在)
- 从外部 API 中提取数据并加载表格。
- 完成第 2 步和第 3 步后,关闭启动屏幕并打开主应用程序(例如,在第 2 步和第 3 步完成之前,不要让用户使用该应用程序。)
我编写了执行步骤 2 和 3 的代码,但它在显示的第一个视图中运行。我宁愿在启动画面中运行此代码。有什么方法可以在主应用程序中构建启动画面,而无需将其添加到每个设备特定的应用程序(即 Android 和 iOS 应用程序)?
现在,我在 App.xaml.cs OnStart 方法中运行此代码。但是,这会导致屏幕保持空白,直到代码完成运行,然后屏幕才会显示。我就是这样设置的:
App.xaml.cs
public partial class App : Application
{
static Database database;
public IMyDataStore<MyViewPagesModel> _MyDataStore=> DependencyService.Get<IMyDataStore<MyViewPagesModel>>();
public static Database Database
{
get
{
if (database == null)
{
database = new Database(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "my_db.db3"));
}
return database;
}
}
public App()
{
InitializeComponent();
DependencyService.Register<MyDataStore>();
MainPage = new AppShell();
}
protected override void OnStart()
{
if(Database != null)
{
Database.CreateTables();
Task.Run(async () => await MyDataStore.PullDataFromAPI()).Wait();
}
}
}
MyDataStore.cs
public class MyDataStore: IMyDataStore<MyViewPagesModel>
{
static HttpClient client = new HttpClient();
readonly MyViewPagesModel _pages;
Database db;
private HttpClient httpClient;
public MyDataStore()
{
_pages = new MyViewPagesModel_pages();
db = App.Database;
httpClient = new HttpClient();
}
public async Task PullDataFromAPI(){
//do stuff
}
}
我正在尝试在启动时同时运行
Database.CreateTables();
Task.Run(async () => await MyDataStore.PullDataFromAPI()).Wait();
但是,我不希望屏幕冻结。我希望它显示一个徽标并滚动一些加载文本,但不确定如何?这可以在启动画面中完成,还是我需要在不同的线程上运行这两种方法?
谢谢
【问题讨论】:
-
也许您可以尝试创建一个新的 ContentPage,例如
SplashScreenPage。然后将您的徽标和动画添加到其中。然后在Database之前在OnStart()中调用它,例如MainPage = new SplashScreenPage ();。最后,在Database事情完成后致电MainPage = new AppShell();。
标签: c# xamarin xamarin.forms xamarin.android xamarin.ios