【问题标题】:Normal and Dark Mode implementation on both Android and iOS without the flashes using Xamarin.Forms 4.3.0.947036使用 Xamarin.Forms 4.3.0.947036 在没有闪光灯的情况下在 Android 和 iOS 上实现正常和暗模式
【发布时间】:2023-03-28 23:01:01
【问题描述】:

在对Original Post 进行了一些讨论之后,由于在 iOS 中发现了一个问题,我们需要为其回答提出一个新问题。


问题:

尝试此操作并对结果进行故障排除后,iOS async code 无法正常工作。虽然 Android 可以正常工作,但 App() 中的以下代码似乎不适用于 iOS,因为我显然不能 await >-ables 在App() 中,这是导航时正确着色所必需的。

Theme theme = await DependencyService.Get<IEnvironment>().GetOperatingSystemTheme();

即使在App() 中使用_ = GetOperatingSystemTheme().ConfigureAwait(true);,也不会调用代码,因此也不会设置主题:

public static async Task<Theme> GetOperatingSystemThemeAsync()
{
    Theme systemTheme = await DependencyService.Get<IEnvironment>().GetOperatingSystemTheme().ConfigureAwait(true);

    SetTheme(systemTheme);
    return systemTheme;

}

以及尝试将其用于 iOS 时的问题:

使用这个non-async Environment_iOS code 和the SetTheme() at Line 53 of the App.cs 我得到了一个

System.NullReferenceException Message=Object reference not set to an instance of an object”。在“UIViewController rootController = UIApplication.SharedApplication.KeyWindow.RootViewController;

如果您不在App() 中调用它,而是仅在App.OnStart() 中调用它,则此flashing issue occurs。

故障排除结果:

无论您的应用程序中的默认设置是什么,导航发生时都会闪烁,换句话说,默认的白色背景将在页面呈现为暗模式之前闪烁。在调用页面(即SomePage())之前设置默认值(所需的背景颜色。即App.Current.Resources = new DarkModeTheme() 用于深色页面)可以提供正确的结果,因为它必须在导航发生和呈现页面之前完成。

示例存储库:https://github.com/Jakar510/FlickerTest

【问题讨论】:

  • @Julipan 谢谢。忘记了那些格式选项。
  • 您可以编辑问题并添加来自 App.cs 的代码吗?
  • @BrandonMinnick 已更新;但是,示例存储库目前尚未针对 iOS 进行测试。明天将进行测试,因为我目前无法访问 Mac。

标签: c# xamarin.forms xamarin.android xamarin.ios


【解决方案1】:

问题

UIApplication.SharedApplication.KeyWindow 为 null,因为 Xamarin.Forms 尚未生成它。

解决方案

将对UIApplication.SharedApplication.KeyWindow 的调用从Xamarin.Forms.Application 的构造函数移至Xamarin.Forms.Application.OnStart()。

我还向您发送了一个 PR,它实现了此修复并为您的浅色主题和深色主题正确实现了 MergedDictionaries:https://github.com/Jakar510/FlickerTest/pull/1

【讨论】:

  • 它在 iOS 上按预期工作。然而,要在 Android 上移除闪光灯,还需要额外的。 if (Device.RuntimePlatform == Device.Android) { 主题 systemThemeAsync = GetOperatingSystemThemeAsync().Result;初始化组件(); MainPage = new NavigationPage(new MainPage(systemThemeAsync)); } else { InitializeComponent(); MainPage = new NavigationPage(new MainPage()); }
  • 谢谢@Jakar510!您也可以将此评论添加到 Xamarin.Forms GitHub 问题吗?既然您知道了修复程序,它将帮助团队并节省一些时间进行故障排除。 ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 2018-03-13
  • 2022-06-29
  • 1970-01-01
相关资源
最近更新 更多