Изменить язык приложения Flutter по нажатию на кнопку в настройках
У меня в приложении есть настройки, одна из настроек это сменить язык приложения, например сейчас приложение на русском языке, а по нажатию на кнопку "изменить язык" - приложение должно стать на английском языке. Так же у меня имеется большое количество страниц в приложении, которые все привязаны к main.dart и нужно чтобы язык менялся одновременно на всех страницах, привязанных к main.dart. Помогите, пожалуйста! Спасибо!
Ответы (2 шт):
В данный момент занимаюсь разработкой первого в моём опыте настоящего приложения на flutter. Переключение языков реализовывал сам.
Приложение построено по паттерну MVVM, правда, предполагаю, что костыльно :D
Использовал библиотеку stacked, она помогает реализовать реактивное изменение данных при работы с ViewModel. `
Создал ViewModel (объект, управляющий логикой) для контроля языка.
return ViewModelBuilder<AppLanguageViewModel>.reactive(
viewModelBuilder: () => locator<AppLanguageViewModel>(),
builder: (context, AppLanguageViewModel viewModel, _) => MaterialApp(locale: viewModel.currentLocale))
Реализация моего ViewModel:
import 'package:flutter/cupertino.dart';
import 'package:myapp/src/app/locator.dart';
import 'package:myapp/src/misc/enums/language_enum.dart';
import 'package:myapp/src/models/app/language_model.dart';
import 'package:myapp/src/services/app/app_language_service.dart';
class AppLanguageViewModel extends ChangeNotifier {
AppLanguageViewModel();
final AppLanguageService _service = locator<AppLanguageService>();
AppLanguage get current => _service.getCurrent();
Locale get currentLocale => Locale(current.value);
void setLanguage(AppLanguage lang) {
_service.setCurrent(lang);
notifyListeners();
}
}
Ну вот, далее, от этого же объекта viewModel в дочерних экранах вызываем callback переключения языка.
При вызове метода setLanguage(AppLanguage lang) в любой части приложения от этого же экземпляра объекта AppLanguageViewModel благодаря ViewModelBuilder произойдёт обновление данных, приложение будет уведомлено и оно обновится с новым параметром MaterialApp(locale: viewModel.currentLocale)