空安全迁移:如何使用 intl 包迁移应用程序?

Posted

技术标签:

【中文标题】空安全迁移:如何使用 intl 包迁移应用程序?【英文标题】:Null Safety Migration: How to migrate an App with intl package? 【发布时间】:2021-12-10 10:13:45 【问题描述】:

我在要迁移到空安全的应用程序中使用intl: ^0.17.0。我所有的包,包括 intl,都支持 null 安全,所以 dart migrate 分析工作没有问题,我可以转到迁移助手链接。

但是,当我到达那里时,l10n.dart 和每个翻译消息 dart 文件都出现错误,如下所示。

如前所述,如果我想迁移到 null 安全,我必须对 Changed S to be nullableChanged type MessageLookupByLibrary 类型进行一些更正

但是,这些文件是自动生成的,并有一条明确的消息说明它们不得修改。

// 不要编辑。这是通过生成的代码 package:intl/generate_localized.dart // 这是一个看起来像的库 通过//委托给适当的语言来为特定语言环境添加消息 图书馆。

// 生成的代码 - 不要手动修改

真的可以将使用 intl(或翻译成不同语言)的 App 迁移到 null 安全性吗?

如果我使用 intl 包,如何迁移到 null 安全?

【问题讨论】:

不要迁移生成的文件,一旦你完成了迁移,用最新版本的 intl 重新生成这些文件 感谢@AmanVerma。你有任何关于它的文件吗?其余文件的迁移将需要很长时间,我不希望自己最终因国际不兼容而不得不归还所有文件而感到惊讶。 抱歉,我没有这样的文档。但我建议在单独的分支中使用 intl 的 null 安全版本重新生成这些文件。 【参考方案1】:

我想与您分享我在使用 intl 包来处理不同语言的相对较大的应用程序迁移到 Null Safety 的经验。我希望它服务于其他人。

在我不得不承认我害怕进行此迁移之前,因为在将所有依赖项更新为 null 安全性并且一旦我运行 dart migrate 之后,我遇到了很多错误并建议进行更改(173 个文件中超过 1000 个)它预示着一个乏味的未来。

在这些变化中,我最关心的是这个问题中出现的关于修改包自动生成的文件的不便。

按照这个思路,我将告诉你我进行迁移的过程。

    在master之外生成一个新的git分支(我称之为migratingToNullSafety)。当然,您不希望在迁移过程中无法对以前的版本进行紧急更改(master)

    运行dart migrate 并按照@AmanVerma 在 cmets 中的建议取消选择生成的文件

    就我而言,我接受了几乎所有的 dart 迁移建议,除了变量,我很清楚它们不会以空状态到达,因此我必须使用 !旗帜。根据文档中的建议,审查是从那些依赖较少的文件开始对那些依赖较多的文件进行的。

    应用迁移后,您可能会在编辑器中看到更多错误。就我而言,它们相对容易手动更正。

    由于我还没有迁移intl 包生成的文件,我以与intl package Null Safety problems 中出现的类似的方式进行操作,并使用以下命令:

flutter pub global list // to check the version

flutter pub global activate intl_utils 2.4.1 // to update to the latest version

    一旦执行,就会出现很多错误,但很容易纠正,因为在我的情况下唯一需要做的就是将S.of(context)!. 更改为S.of(context). 即删除!在国际化的呼唤中旗帜。要在所有文件中更改它,我在 VS Code 中使用了 Cmd + Shift + H

    当我不再有错误时,我在模拟器中运行应用程序并正确打开。我进行了测试,主要是在我知道我可能会遇到 null 问题并进行修复的地方。

就是这样。一些我认为需要几天乏味的工作的事情,却花了我几个小时。

我希望它服务于其他人!

【讨论】:

以上是关于空安全迁移:如何使用 intl 包迁移应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

迁移空安全后颤振模拟单元测试错误

迁移到空安全版本 Provider 5.0.0 后对 Stream Provider 的更改

flutter项目迁移空安全

将颤振代码迁移到空安全后,模拟对象不接受“任何”

如何在 Azure 服务结构中迁移 Windows 服务

将我的 bloc 应用程序迁移到空安全。错误:“AssignmentBloc”不符合类型参数“B”的绑定“BlocBase<AssignmentState>”