Flutter i18n插件使用

  1. 首先需要安装Flutter i18n插件,AS中安装即可(目前此插件已经下线,可考虑使用Flutter_intl)
    在这里插入图片描述

2.创建Flutter工程,在res->values下会自动创建一个string_en.arb的文件,这就是多语言的资源文件。可以右键新建arb文件,根据向导即可添加不同语言。

arb文件内容就是json格式。来个简单的例子:

{
  "app_title": "app_title1",
  "main_title": "My Main Title"
}

3.在lib->generated目录中会自动根据arb文件生成一个i18n.dart文件,不用编辑该文件,其实你编辑了也没用,修改后马上又会自动生成。
编辑arb文件后会马上重新生成i18n.dart文件。
4.添加依赖库

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

5.在main.dart中导入

import '../generated/i18n.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
  1. 在main.dart文件添加相应内容
    @override
    Widget build(BuildContext context) {
    return MaterialApp(

    localizationsDelegates: [
    S.delegate,
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate
    ],
    supportedLocales: S.delegate.supportedLocales,
    如果需要强制使用某种语言可以添加如下代码
    //localeResolutionCallback:
    //S.delegate.resolution(fallback: Locale(“zh”, “”)),

title: ‘Flutter Demo’,
theme: ThemeData(
7.如何使用:S.of(context).key即可
Text(
S.of(context).app_title,
style: TextStyle(
color: Colors.blue,
fontSize: 30,
),
)

遇到的问题
升级AS3.3后,i18n的插件似乎不起作用了。无法自动生成i18n.dart文件。报错内容如下:

kotlin.KotlinNullPointerException
	at eu.long1.flutter.i18n.files.FileHelpers.getI18nFile(FileHelpers.kt:20)
	at eu.long1.flutter.i18n.workers.I18nFileGenerator.generate(I18nFileGenerator.kt:54)
	at eu.long1.flutter.i18n.actions.RebuildI18nFile$actionPerformed$1.run(RebuildI18nFile.kt:13)
	at com.intellij.openapi.command.WriteCommandAction.lambda$runWriteCommandAction$5(WriteCommandAction.java:363)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl$1.run(WriteCommandAction.java:124)
	at com.intellij.openapi.application.RunResult.run(RunResult.java:35)
	at com.intellij.openapi.command.WriteCommandAction.lambda$null$1(WriteCommandAction.java:264)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:1057)
	at com.intellij.openapi.command.WriteCommandAction.lambda$performWriteCommandAction$2(WriteCommandAction.java:263)
	at com.intellij.openapi.command.WriteCommandAction.lambda$doExecuteCommand$4(WriteCommandAction.java:321)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:220)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:188)
	at com.intellij.openapi.command.WriteCommandAction.doExecuteCommand(WriteCommandAction.java:323)
	at com.intellij.openapi.command.WriteCommandAction.performWriteCommandAction(WriteCommandAction.java:262)
	at com.intellij.openapi.command.WriteCommandAction.execute(WriteCommandAction.java:244)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.run(WriteCommandAction.java:126)
	at com.intellij.openapi.command.WriteCommandAction.runWriteCommandAction(WriteCommandAction.java:363)
	at com.intellij.openapi.command.WriteCommandAction.runWriteCommandAction(WriteCommandAction.java:355)
	at eu.long1.flutter.i18n.actions.RebuildI18nFile.actionPerformed(RebuildI18nFile.kt:13)
	at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:258)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:275)
	at com.intellij.openapi.actionSystem.impl.ActionButton.actionPerformed(ActionButton.java:184)
	at com.intellij.openapi.actionSystem.impl.ActionButton.performAction(ActionButton.java:148)
	at com.intellij.openapi.actionSystem.impl.ActionButton.processMouseEvent(ActionButton.java:410)
	at java.awt.Component.processEvent(Component.java:6313)
	at java.awt.Container.processEvent(Container.java:2237)
	at java.awt.Component.dispatchEventImpl(Component.java:4903)
	at java.awt.Container.dispatchEventImpl(Container.java:2295)
	at java.awt.Component.dispatchEvent(Component.java:4725)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4889)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4526)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4467)
	at java.awt.Container.dispatchEventImpl(Container.java:2281)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4725)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:764)
	at java.awt.EventQueue.access$500(EventQueue.java:98)
	at java.awt.EventQueue$3.run(EventQueue.java:715)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
	at java.awt.EventQueue$4.run(EventQueue.java:737)
	at java.awt.EventQueue$4.run(EventQueue.java:735)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:734)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:719)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:664)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:363)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

一开始就觉得是工程某些配置文件的事情。于是把之前可以正常使用的Project打开了,果然可以正常生成。看来不是插件的问题。应该是某些工程文件配置问题。于是对两个工程进行了对比。发现新建的工程的.idea目录下没有misc.xml文件。
将原来工程中的misc.xml拷贝到新工程,build,OK
又能愉快的生成i18n.dart文件了。
看来有可能是AS3.3对工程目录进行了优化(也可能是bug),造成i18n的插件无法进行文件的生成。所以报错了。
注意,拷贝完misc.xml后需要重新启动AS才能生效。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值