Created
May 13, 2020 09:25
-
-
Save saturov/ceaf27a9f037c66830a71d2f6edac32c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/material.dart'; | |
import 'package:flutter/services.dart'; | |
/// виджет для настройки статус-бара | |
/// [child] - дочерний виджет для вёрстки всего остального экрана | |
/// | |
/// [statusBarColor] - цвет статус-бара (по-умолчанию прозрачный) | |
/// | |
/// [iconTone] - тон иконок в статус-баре (светлые/тёмные) | |
/// | |
/// Работает корректно и для Android L+ и для iOS. | |
/// - Android M+ поддерживает полную прозрачность статус-бара и два тона иконок; | |
/// - Android L всегда будет отображать полупрозрачный статус-бар и белые иконки; | |
/// - iOS поддерживает полную прозрачность статус-бара и два тона иконок. | |
class StatusBarWidget extends StatelessWidget { | |
final Widget child; | |
final Color statusBarColor; | |
final StatusBarIconTone iconTone; | |
const StatusBarWidget({ | |
Key key, | |
@required this.child, | |
Color statusBarColor, | |
StatusBarIconTone statusBarIconTone, | |
}) : assert(child != null), | |
statusBarColor = statusBarColor ?? Colors.transparent, | |
iconTone = statusBarIconTone ?? StatusBarIconTone.DARK, | |
super(key: key); | |
@override | |
Widget build(BuildContext context) { | |
return Theme( | |
data: Theme.of(context).copyWith( | |
appBarTheme: AppBarTheme( | |
brightness: StatusBarConfig._getAppBarThemeBrightness(iconTone), | |
), | |
), | |
child: AnnotatedRegion( | |
value: StatusBarConfig.getSystemUiOverlayStyle( | |
statusBarColor, | |
iconTone, | |
), | |
child: child, | |
), | |
); | |
} | |
} | |
/// виджет для статус-бара со светлыми иконками | |
/// | |
/// [statusBarColor] - цвет статус-бара (по-умолчанию прозрачный) | |
class LightIconStatusBarWidget extends StatusBarWidget { | |
const LightIconStatusBarWidget({ | |
Key key, | |
@required Widget child, | |
Color statusBarColor, | |
}) : super( | |
key: key, | |
child: child, | |
statusBarColor: statusBarColor, | |
statusBarIconTone: StatusBarIconTone.LIGHT, | |
); | |
} | |
/// виджет для статус-бара с тёмными иконками | |
/// | |
/// [statusBarColor] - цвет статус-бара (по-умолчанию прозрачный) | |
class DarkIconStatusBarWidget extends StatusBarWidget { | |
const DarkIconStatusBarWidget({ | |
Key key, | |
@required Widget child, | |
Color statusBarColor, | |
}) : super( | |
key: key, | |
child: child, | |
statusBarColor: statusBarColor, | |
statusBarIconTone: StatusBarIconTone.DARK, | |
); | |
} | |
/// Конфигуратор для статус-бара | |
class StatusBarConfig { | |
static SystemUiOverlayStyle getSystemUiOverlayStyle( | |
Color statusBarColor, | |
StatusBarIconTone iconTone, | |
) { | |
return SystemUiOverlayStyle( | |
statusBarColor: statusBarColor, | |
statusBarIconBrightness: _getStatusBarIconBrightness(iconTone), | |
statusBarBrightness: _getStatusBarBrightness(iconTone), | |
); | |
} | |
/// настройка цвета иконок для Android (M+) | |
static Brightness _getStatusBarIconBrightness(StatusBarIconTone iconTone) { | |
if (iconTone == StatusBarIconTone.DARK) { | |
return Brightness.dark; | |
} else if (iconTone == StatusBarIconTone.LIGHT) { | |
return Brightness.light; | |
} | |
return null; | |
} | |
/// настройка цвета иконок для iOS | |
static Brightness _getStatusBarBrightness(StatusBarIconTone iconTone) { | |
// не ошибка, тона действительно нужно инвертировать | |
if (iconTone == StatusBarIconTone.DARK) { | |
return Brightness.light; | |
} else if (iconTone == StatusBarIconTone.LIGHT) { | |
return Brightness.dark; | |
} | |
return null; | |
} | |
/// настройка яркости для AppBarTheme | |
/// | |
/// (код идентичен методу _getStatusBarBrightness(), но семантически несёт | |
/// иной смысл) | |
static Brightness _getAppBarThemeBrightness(StatusBarIconTone iconTone) { | |
// не ошибка, тона действительно нужно инвертировать | |
if (iconTone == StatusBarIconTone.DARK) { | |
return Brightness.light; | |
} else if (iconTone == StatusBarIconTone.LIGHT) { | |
return Brightness.dark; | |
} | |
return null; | |
} | |
} | |
/// Вариант окраски иконок в статус-баре | |
/// | |
/// DARK - тёмные иконки | |
/// LIGHT - белые иконки | |
enum StatusBarIconTone { | |
DARK, | |
LIGHT, | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment