No MaterialLocalizations found. Easy localizations с использованием route в Flutter
Я использую 'package:easy_localization/easy_localization.dart' для перевода своего приложения, текста немного, поддержка всего двух языков. Если смотреть примеры для модуля easy_localization, то всё сводится к тому, что есть одна страница и на ней прекрасно всё работает, так и в моём случае - на одной странице всё работает, а далее - нет. Я использую именованный роутинг. При переходе по '/' - это страница авторизации, т.к. я уже вошёл, перенаправляюсь на '/home' - на этой странице всё хорошо, текст переводится. При переходе с '/home' по кнопке на '/search_plate', получаю ошибку No MaterialLocalizations found. AppBar widgets require MaterialLocalizations to be provided by a Localizations widget ancestor.
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
await EasyLocalization.ensureInitialized();
runApp(EasyLocalization(
startLocale: const Locale('ua'),
useFallbackTranslations: true,
fallbackLocale: const Locale('ua'),
supportedLocales: const [
Locale('ua'),
Locale('ru'),
],
path: 'assets/languages',
child: const FlutterApp(),
));
}
class FlutterApp extends StatelessWidget {
const FlutterApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
theme: ThemeData(
primarySwatch: Colors.grey,
primaryColorDark: const Color.fromRGBO(50, 65, 85, 1),
//textTheme: TextTheme() надо доделать
),
initialRoute: '/',
routes: {
'/': (context) => const SignInScreen(),
'/home': (context) => const Home(),
'/search_plate': (context) => const SearchPlate(),
'/recognition': (context) => const Recognition(),
},
);
}
}
Переход с '/home' на '/search_plate:
Navigator.pushNamed(context, '/search_plate');
'/search_plate'
class SearchPlate extends StatefulWidget {
const SearchPlate({Key? key}) : super(key: key);
@override
State<SearchPlate> createState() => _SearchPlateState();
}
class _SearchPlateState extends State<SearchPlate> {
return Scaffold(
backgroundColor: const Color.fromRGBO(50, 65, 85, 1),
appBar: AppBar(
title: const Text('search_plate').tr(),
centerTitle: true,
backgroundColor: const Color.fromRGBO(50, 65, 85, 1),
),
body: Builder(
builder: (context) => Column(
children: [
Padding(
padding: const EdgeInsets.all(10),
child: Align(
alignment: Alignment.topCenter,
child: const Text('search').tr(),
),
),
if (_isSearching)
const CircularProgressIndicator(
strokeWidth: 2.0,
color: Colors.orange,
),
if (!_isSearching) Expanded(child: carInfoWidget),
],
),
),
);
}
}
Ответы (1 шт):
Locale('ua') - это неверно, недостаточно просто так назвать файл, а потом указать это как локаль, существуют стандарты указания локали, правильно Locale('uk'),надо так и файл называть, тогда подтягивается локаль для всех сложных элементов, как то поле ввода, например контекстное меню: в файле это не прописано, но по uk мы получаем полный перевод из системы, теперь не будет "Paste", а будет "вставити". Вот такая мелочь, а возни на два дня.