Skip to content

Instantly share code, notes, and snippets.

@saturov
Created May 13, 2020 09:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save saturov/ceaf27a9f037c66830a71d2f6edac32c to your computer and use it in GitHub Desktop.
Save saturov/ceaf27a9f037c66830a71d2f6edac32c to your computer and use it in GitHub Desktop.
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