Вопрос или проблема
Я пытаюсь разбить код на различные пакеты в приложении, которое я сейчас программирую. (приходя из среды C#/WPF и желая ограничить “кто может использовать какой код”, это кажется правильным для меня) Соответственно, я создал пакет, в котором управляю .dart файлами с представлениями или виджетами (название: presentation). Теперь я хотел бы поддерживать несколько языков в своем приложении и хранить тексты в .arb файле. Я следовал документации https://docs.flutter.dev/ui/accessibility-and-internationalization/internationalization и создал файлы в своем пакете (l10n.yaml в корне пакета, папка lib/l10n в lib пакета, а папка “flutter_gen” также отображается в папке .dart_tool пакета после сборки. Теперь я хочу добавить импорт
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
Когда я собираю приложение, я получаю следующую ошибку:
presentation/lib/providers/multi_provider_builder.dart:13:8: Error: Ошибка при чтении '../../AppData/Local/Pub/Cache/hosted/pub.dev/flutter_gen-5.7.0/lib/gen_l10n/app_localizations.dart': Системе не удается найти указанный путь.
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
^
Целевая программа kernel_snapshot_program завершилась с ошибкой: Исключение
ОШИБКА: Сборка завершилась с исключением.
* Что пошло не так:
Ошибка выполнения задачи ':app:compileFlutterBuildDebug'.
> Процесс 'команда 'C:\flutter\flutter\bin\flutter.bat'' завершился с ненулевым кодом выхода 1
* Попробуйте:
> Запустите с параметром --stacktrace, чтобы получить трассировку стека.
> Запустите с параметром --info или --debug, чтобы получить больше логов.
> Запустите с параметром --scan для получения полной информации.
> Получите дополнительную помощь на https://help.gradle.org.
СБОРКА НЕ УДАЛАСЬ за 3s
Ошибка: Задача Gradle assembleDebug завершилась с кодом выхода 1
Пробовал ли кто-нибудь добавить .arb файлы в пакет?
Мой пакет “presentation” находится внутри папки приложения. Может быть, структура моего приложения является проблемой? Пример:
- App
- lib
- main.dart
- pubspec.yaml (приложения)
- presentation (пакет)
- lib
// dart файлы и папки - pubspec.yaml (пакета с установленными flutter_localizations + intl)
- lib
- lib
Следование документации в тестовом приложении дало работающий результат, но не с той структурой пакетов, которую я хотел использовать.
Ответ или решение
Для решения вашей проблемы с интернационализацией во Flutter при использовании пакетов, необходимо следовать определённым шагам и убедиться, что структура вашего проекта настроена правильно. Давайте рассмотрим основные моменты.
1. Структура проекта
Убедитесь, что ваша структура проекта выглядит примерно так:
App/
├── lib/
│ ├── main.dart
├── pubspec.yaml (основного приложения)
├── presentation/
│ ├── lib/
│ │ ├── ... (ваши файлы Dart)
│ │ └── l10n/ (папка для arb файлов)
│ └── pubspec.yaml (пакета)
2. Настройка pubspec.yaml
вашего пакета
В pubspec.yaml
вашего пакета presentation добавьте необходимые зависимости:
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: ^0.17.0 # Убедитесь, что версия актуальна
Также обязательно укажите конфигурацию для генерации локализаций:
flutter:
generate: true
# Укажите путь к вашим arb файлам
l10n:
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
3. Создание .arb файлов
В папке lib/l10n
вашего пакета создайте .arb файлы, такие как:
app_en.arb
(английский)app_ru.arb
(русский)
Пример app_en.arb
:
{
"title": "Hello World",
"@title": {
"description": "The title of the application"
}
}
Пример app_ru.arb
:
{
"title": "Привет, мир",
"@title": {
"description": "Название приложения"
}
}
4. Генерация локализаций
После настройки вы должны выполнить команду для генерации локализаций:
flutter pub get
flutter pub run build_runner build --delete-conflicting-outputs
Это создаст файл app_localizations.dart
в папке .dart_tool
вашего проекта.
5. Импортирование локализаций
В вашем коде (например, в multi_provider_builder.dart
) импортируйте сгенерированный файл:
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
6. Проблемы с путями
Исходя из вашей ошибки, важно убедиться, что программа правильно видит путь к файлу app_localizations.dart
. Ошибка, которую вы получили, указывает, что оболочка не может найти файл. Попробуйте:
- Убедиться, что вы действительно выполняете команду сборки из корневой директории проекта.
- Использовать абсолютные пути, если возникли вопросы с относительными.
7. Добавление локализаций в MaterialApp
В вашем main.dart
важно правильно инициализировать локализацию:
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:presentation/...'; // Ваш путь к нужному импорту
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
const Locale('en', ''), // Английский
const Locale('ru', ''), // Русский
],
home: MyHomePage(),
);
}
}
Итог
Следуя этим шагам, вы должны быть в состоянии интегрировать интернационализацию в свой проект, организованный в пакеты. Если после выполнения этих шагов проблема не решится, возможно, стоит проверить наличие других конфликтов в зависимостях или конфигурациях вашего проекта.