Изменить язык приложения Flutter по нажатию на кнопку в настройках

У меня в приложении есть настройки, одна из настроек это сменить язык приложения, например сейчас приложение на русском языке, а по нажатию на кнопку "изменить язык" - приложение должно стать на английском языке. Так же у меня имеется большое количество страниц в приложении, которые все привязаны к main.dart и нужно чтобы язык менялся одновременно на всех страницах, привязанных к main.dart. Помогите, пожалуйста! Спасибо!


Ответы (2 шт):

Автор решения: Sergey K.

В данный момент занимаюсь разработкой первого в моём опыте настоящего приложения на 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)

→ Ссылка