Files
friflex_flutter_starter/lib/l10n/localization_notifier.dart

63 lines
2.4 KiB
Dart
Raw Normal View History

2025-01-21 14:24:31 +03:00
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
/// Тип функции для построения виджета с учетом локализации
2025-01-21 14:24:31 +03:00
typedef LocalizationBuilder = Widget Function();
/// {@template localization_consumer}
/// Виджет для подписки на изменения локализации приложения.
///
/// Автоматически перестраивает дочерние виджеты при изменении языка,
/// обеспечивая реактивность интерфейса к изменениям настроек локализации.
/// {@endtemplate}
2025-01-21 14:24:31 +03:00
class LocalizationConsumer extends StatelessWidget {
/// {@macro localization_consumer}
const LocalizationConsumer({required this.builder, super.key});
2025-01-21 14:24:31 +03:00
/// Функция для построения виджета с учетом текущей локализации
2025-01-21 14:24:31 +03:00
final LocalizationBuilder builder;
@override
Widget build(BuildContext context) {
return Consumer<LocalizationNotifier>(
builder: (_, _, _) {
2025-01-21 14:24:31 +03:00
return builder();
},
);
}
}
/// {@template localization_notifier}
/// Класс для управления локализацией приложения.
///
/// Отвечает за:
/// - Хранение текущей локали приложения
/// - Уведомление подписчиков об изменениях языка
/// - Переключение между поддерживаемыми языками
/// {@endtemplate}
2025-01-21 14:24:31 +03:00
final class LocalizationNotifier extends ChangeNotifier {
/// {@macro localization_notifier}
LocalizationNotifier();
2025-01-21 14:24:31 +03:00
/// Текущая локаль приложения
/// По умолчанию используется русский язык
Locale _locale = const Locale('ru', 'RU');
/// Получение текущей локали
2025-01-21 14:24:31 +03:00
Locale get locale => _locale;
/// Получение текущего языка в виде кода языка
String get language => _locale.languageCode;
/// Метод для изменения локали приложения.
///
/// Принимает:
/// - [locale] - новая локаль для установки
///
/// Уведомляет всех подписчиков об изменении локали.
2025-01-21 14:24:31 +03:00
void changeLocal(Locale locale) {
_locale = locale;
notifyListeners();
}
}