添加flutter_gen后,URI的目标不存在:'package:flutter_gen/gen_l10n/app_localizations.dart'

问题描述 投票:0回答:1

背景

  1. 我正在使用
    flutter_localizations
    来本地化我的应用程序。
  2. 我使用
    build_runner
    来生成文件。 (
    riverpod
    freezed
    等)。

pubspec.yaml

...

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  intl: 0.18.1

...

dev_dependencies:
  build_runner: ^2.4.8
  flutter_gen: ^5.4.0

...

flutter:
  generate: true

...

l10n.yaml

arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart

some_widget.dart

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';

class SomeWidget extends StatelessWidget {
  const SomeWidget({super.key});

  @override
  Widget build(BuildContext context) {
    return Text(AppLocalizations.of(context).someText);
  }
}

问题

flutter_gen
是问题所在。我必须将包:flutter_gen添加到开发依赖项中。

  • 为什么我必须添加这个

    按照官方Flutter Doc实现本地化后,运行命令

    dart run build_runner build
    会出现错误(
    Bad state: Unable to generate package graph
    )。 此处对此进行了讨论。通过添加
    flutter_gen
    解决了。

  • 添加

    flutter_gen
    会导致问题

    包含本地化代码的文件,例如:

    AppLocalizations.of(context).someText
    会引发错误:导入行
    Target of URI doesn't exist: 'package:flutter_gen/gen_l10n/app_localizations.dart'
    上的
    'package:flutter_gen/gen_l10n/app_localizations.dart';
    here对此进行了解释。简单来说,flutter 在
    flutter_gen
    下的假包名称下创建了 l10n 生成的文件,这与在 dev 依赖项下添加的真实
    flutter_gen
    冲突。

我尝试过的

  • 重新启动 VS Code,重新启动 Dart 分析器。

  • flutter clean,其他各种删除缓存方法。

我正在寻找一种解决方案,可以毫无错误地导入

AppLocalizations
,并且可以毫无错误地运行
build_runner
命令。

flutter
1个回答
0
投票

由于在假包名

flutter_gen
下生成会导致问题,因此可以通过将生成的文件输出位置更改为源代码(在 lib/ 文件夹下)来防止该问题。

更改:

l10n.yaml

arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.g.dart # <-- The location where it's generated. Doesn't have to be a `.g.dart`.
output-dir: lib/l10n/generated
synthetic-package: false # <-- We won't reference l10n stuff by the fake package name anymore.

some_widget.dart

import 'package:flutter/material.dart';
import 'package:<project_name>/l10n/generated/app_localizations.g.dart';

class SomeWidget extends StatelessWidget {
  const SomeWidget({super.key});

  @override
  Widget build(BuildContext context) {
    return Text(AppLocalizations.of(context).someText);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.