How do I pass an Internationalization Object to Child Widgets in Flutter
刚刚开始使用 Flutter/dart,过渡到 PHP,并努力弄清楚如何将类传递给小部件。
我正在使用 Flutter 创建我的第一个 android 和 iOS 应用程序。
我正在处理国际化,并且使用我拥有的国际化类在我的初始构建页面上一切正常。但是,当将它传递给另一个小部件时,我得到:
NoSuchMethodError: The getter textTitle was called on null.
Receiver: null
tried calling: textTitle
最好的处理方法是什么?
颤振医生
1 2 3 4 | [a?"] Flutter (Channel beta, v0.1.5, on Mac OS X 10.13.3 17D47, locale en-US) [a?"] Android toolchain - develop for Android devices (Android SDK 27.0.1) [a?"] Android Studio (version 3.0) [a?"] Connected devices (1 available) |
本地化dart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class HnLocalizations{ HnLocalizations(this.locale); final Locale locale; static HnLocalizations of(BuildContext context){ return Localizations.of<HnLocalizations>(context, HnLocalizations); } static Map<String, Map<String, String>> _localizedValues = { 'en': { 'btnLabelLoginS1': 'Login', 'btnLabelRegisterS1': 'Sign Up' }, ; String get s1ButtonLabelLogin => _localizedValues[locale.languageCode]['btnLabelLoginS1']; class HnLocalizationsDelegate extends LocalizationsDelegate<HnLocalizations> { const HnLocalizationsDelegate(); @override bool isSupported(Locale locale) => ['en', 'es'].contains(locale.languageCode); @override Future<HnLocalizations> load(Locale locale) => new SynchronousFuture<HnLocalizations>(new HnLocalizations(locale)); //HnLocalizations.load(locale); @override bool shouldReload(HnLocalizationsDelegate old) => false; } |
主要dart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | void main() { runApp(new MaterialApp( localizationsDelegates: [ const HnLocalizationsDelegate(), GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, ], supportedLocales: [ const Locale('en', 'US'), /// Americans const Locale('en', 'GB') /// Brits ], title: 'HN', home: new EntryPage(), )); } class EntryPage extends StatelessWidget { final HnColors _hnColors = new HnColors(); @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( // !!!**** THIS WORKS AS EXPECTED ****!!!! title: new Text(HnLocalizations.of(context).s1ButtonLabelLogin), backgroundColor: _hnColors.transparent(), elevation: 0.0, ), backgroundColor: _hnColors.accent(), body: new Container( decoration: new BoxDecoration( image: new DecorationImage( image: new AssetImage("assets/Background_World.png"), fit: BoxFit.fitWidth, ), ), child: new PanelArea(), ) ); } } class PanelArea extends StatelessWidget { @override Widget build(BuildContext context) { HnColors _hnColors = new HnColors(); return new Container( child: new Center( child: new Container( decoration: new BoxDecoration( borderRadius: new BorderRadius.circular(15.0), color: _hnColors.transparent() ), child: new Column( children: [ new Image.asset('assets/Icon_Intro_login'), new Text( // !!!**** ERROR IS HERE ****!!!! HnLocalizations.of(context).s1M1HeaderTitle, style: new TextStyle( color: _haillioColors.white() ), ), |
最好的处理方法是什么?
更新日期:2018 年 3 月 11 日
我发现如果我将所有代码移动到 main.dart 文件中。所有本地化工作正常。但是,当我将小部件移动到单独的 dart 文件中时,即使所有代码都相同,错误也会再次出现。
更新日期:2018 年 3 月 12 日
nicol??s-carrasco 通过这篇文章中的引用指出了正确的方向(谢谢)。问题与导入有关,本文在此处解决了该问题,最终成为对我有用的解决方案。该示例在下面的答案中添加。
Nicol??s Carrasco 通过指向这篇文章的链接指出了一个解决方案,该解决方案与导致我遇到问题的原因有关。
在
1 | import 'package:hn/hnLocalization.dart'; |
在
1 | import 'hnLocalization.dart'; |
这些和这里描述的不一样
确保所有文件都使用相对路径和包导入解决了这个问题。区别在于我的文件,而不是依赖项使用相对路径。起初那部分很难过。
现在我的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import 'hnLocalization.dart'; // <--- Using relative Path class PanelArea extends StatelessWidget { @override Widget build(BuildContext context) { ... child: new Column( children: [ new Image.asset('assets/Icon_Intro_login'), // This Now Works ---> new Text(HnLocalizations.of(context).s1M1HeaderTitle, ] ... |
现在一切正常。