Реализация Normal и Dark Mode на Android и iOS без вспышек с использованием Xamarin.Forms 4.3.0.947036 - PullRequest
0 голосов
/ 06 ноября 2019

После некоторого обсуждения Original Post нам нужно было открыть новый вопрос для ответа из-за проблемы, обнаруженной с iOS .


Проблема:

После попытки и устранения неполадок с результатами асинхронный код iOS не делает 'не работает правильно. Хотя Android работает нормально, приведенный ниже код в App(), похоже, не работает правильно для iOS , так как у меня, по-видимому, не может быть await -ablesв App(), который необходим для получения правильной окраски при навигации.

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

даже при использовании _ = GetOperatingSystemTheme().ConfigureAwait(true); в App() код не вызывается, и поэтому тема неустановить:

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

    SetTheme(systemTheme);
    return systemTheme;

}

И проблема при попытке использовать его для iOS:

Использование этого не асинхронного кода Environment_iOS и SetTheme () в строке 53 приложения.cs Я получил

System.NullReferenceException Message = Ссылка на объект не установлена ​​на экземпляр объекта ". в строке" UIViewControllerrootController = UIApplication.SharedApplication.KeyWindow.RootViewController;

Если вы не вызываете его в App(), а вместо этого только в App.OnStart(), эта проблема мигания возникает .

Результаты поиска и устранения неисправностей:

Независимо от того, какое значение по умолчанию установлено в вашем приложении,Это будет мигать, когда происходит навигация. Другими словами, белый фон по умолчанию будет мигать, прежде чем страница будет переведена в темный режим. Установка значений по умолчанию (какие бы цвета для фона не требовались. Т. Е. App.Current.Resources = new DarkModeTheme() для темных страниц) перед вызовом страницы (т. Е. SomePage()) дает правильные результаты, как это должно быть сделано до навигации и отображения страницы.

Пример репозитория: https://github.com/Jakar510/FlickerTest

1 Ответ

0 голосов
/ 07 ноября 2019

Проблема

UIApplication.SharedApplication.KeyWindow пуста, потому что Xamarin.Forms еще не сгенерировала ее.

Решение

Переместите вызов в UIApplication.SharedApplication.KeyWindow из конструктораXamarin.Forms.Application до Xamarin.Forms.Application.OnStart().

Я также отправил вам PR, который реализует это исправление, а также правильно реализует MergedDictionaries для вашей Light Theme и Dark Theme: https://github.com/Jakar510/FlickerTest/pull/1

...