Как изменить локаль приложения с помощью нажатия кнопок?

Как изменить локаль приложения с помощью нажатия кнопок? Что-то происходит не так в методах, когда присваивается имя локали.

 void _f1() {
  setState(() {
   //установка локали
   _locale = Locale('en', '');
   //загрузка локали
   S.delegate.load(_locale);
  });
 }

 void _f2() {
  setState(() {
   //установка локали
   _locale = Locale('ru', '');
   //загрузка локали
   S.delegate.load(_locale);
  });
 }

полный код

strings_en.arb

{
 "str1" : "Name Page",
 "str2" : "english",
 "str3" : "russian",
 "str4" : "Hello World!"
}

strings_ru.arb

{
 "str1" : "Имя Страницы",
 "str2" : "английский",
 "str3" : "русский",
 "str4" : "Привет Мир!"
}

main.dart

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:f1/generated/i18n.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
  Locale locale = Locale('en', '');
  return MaterialApp(
   localizationsDelegates: [
    //делегат локализации
    S.delegate,
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
   ],
   //установка локали для приложения
   locale: locale,
   //вытаскиваем из библиотеки поддерживаемые локали
   supportedLocales: S.delegate.supportedLocales,
   debugShowCheckedModeBanner: false,
   title: 'Name App',
   theme: ThemeData(
    primarySwatch: Colors.blue,
   ),
   home: MyHomePage(locale),
  );
 }
}

class MyHomePage extends StatefulWidget {
 Locale locale;

 MyHomePage(this.locale,{Key key}) : super(key: key);

 @override
 _MyHomePageState createState() => _MyHomePageState(locale);
}

class _MyHomePageState extends State<MyHomePage> {
 //объявление переменных
 Locale _locale;

 _MyHomePageState(this._locale);

 //вызывается один раз при инициализации виджета
 @override
 void initState() {
  super.initState();
 }

 void _f1() {
  setState(() {
   //установка локали
   _locale = Locale('en', '');
   //загрузка локали
   S.delegate.load(_locale);
  });
 }

 void _f2() {
  setState(() {
   //установка локали
   _locale = Locale('ru', '');
   //загрузка локали
   S.delegate.load(_locale);
  });
 }

 @override
 Widget build(BuildContext context) {
  var scaffold = Scaffold(
   appBar: AppBar(
    title: Text(S
     .of(context)
     .str1),
   ),
   body: Stack(
    children: <Widget>[
     Align(
      alignment: Alignment.topLeft,
      child: Row(
       children: <Widget>[
        Expanded(
         flex: 1,
         child: Container(
          height: 40.0,
          margin: const EdgeInsets.all(5.0),
          child: FlatButton(
           onPressed: () {
            _f1();
           },
           shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(10.0)
           ),
           color: Colors.black26,
           child: Text(
            S.of(context).str2,
            style: TextStyle(
             color: Colors.white,
             fontSize: 20.0,
            ),
           ),
          ),
         ),
        ),
        Expanded(
         flex: 1,
         child: Container(
          height: 40.0,
          margin: const EdgeInsets.all(5.0),
          child: FlatButton(
           onPressed: () {
            _f2();
           },
           shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(10.0)
           ),
           color: Colors.black26,
           child: Text(
            S.of(context).str3,
            style: TextStyle(
             color: Colors.white,
             fontSize: 20.0,
            ),
           ),
          ),
         ),
        ),
       ],
      ),
     ),
     Align(
      alignment: Alignment.center,
      child: Text(
       S.of(context).str4,
       style: TextStyle(
        color: Colors.pink,
        fontSize: 36.0,
       ),
      ),
     ),
    ],
   ),
  );

  return Localizations.override(
   context: context,
   child: scaffold,
   locale: _locale,
  );
 }

}

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