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才能生效。

flutter_map是一个用于在Flutter应用程序中集成地图的插件[^2]。下面是一个使用flutter_map插件的示例: 首先,您需要在`pubspec.yaml`文件中添加flutter_map的依赖项: ```yaml dependencies: flutter_map: ^0.3.0 ``` 然后,运行`flutter packages get`命令来获取依赖项。 接下来,您可以在Flutter应用程序中使用flutter_map插件。以下是一个简单的示例,展示如何在地图上显示一个标记点: ```dart import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong/latlong.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Map Demo', home: Scaffold( appBar: AppBar( title: Text('Flutter Map Demo'), ), body: FlutterMap( options: MapOptions( center: LatLng(51.5, -0.09), zoom: 13.0, ), layers: [ TileLayerOptions( urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", subdomains: ['a', 'b', 'c'], ), MarkerLayerOptions( markers: [ Marker( width: 80.0, height: 80.0, point: LatLng(51.5, -0.09), builder: (ctx) => Container( child: FlutterLogo(), ), ), ], ), ], ), ), ); } } ``` 在上面的示例中,我们创建了一个Flutter应用程序,并在地图上显示了一个标记点。我们使用了`FlutterMap`小部件来显示地图,并使用`MapOptions`来设置地图的中心点和缩放级别。我们还使用了`TileLayerOptions`来指定地图瓦片的URL模板,以及`MarkerLayerOptions`来添加标记点。 请注意,为了使用flutter_map插件,您还需要在`pubspec.yaml`文件中添加`latlong`库的依赖项: ```yaml dependencies: latlong: ^0.6.1 ``` 这是一个简单的示例,您可以根据自己的需求进行更多的定制和功能扩展。希望对您有帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值