代码之家  ›  专栏  ›  技术社区  ›  SeaFuzz

如何将国际化对象传递给Flutter中的子小部件

  •  2
  • SeaFuzz  · 技术社区  · 6 年前

    刚刚开始使用flatter/dart,正在为PHP进行转换,并且正在努力找出如何将类传递到小部件中。

    我正在使用flutter创建我的第一个android和iOS应用程序。

    我正在处理国际化,使用我的国际化类在我的初始构建页面上一切都很好。然而,当将其传递给另一个小部件时,我得到:

    NoSuchMethodError:对null调用了getter textTitle。
    接收方:空
    已尝试调用:textTitle

    处理这个问题的最佳方法是什么?

    颤振医生

      [✓] Flutter (Channel beta, v0.1.5, on Mac OS X 10.13.3 17D47, locale en-US)
      [✓] Android toolchain - develop for Android devices (Android SDK 27.0.1)
      [✓] Android Studio (version 3.0)
      [✓] Connected devices (1 available)
    

    本地化省道

    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;
        }
    

    主省道

    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 指向正确的方向 a reference in this post (谢谢)。这个问题与已解决的进口有关 in this post here 这最终成为了对我有效的解决方案。下面的答案中添加了该示例。

    1 回复  |  直到 6 年前
        1
  •  1
  •   SeaFuzz    6 年前

    Nicolás Carrasco 指出了与我的问题原因相关的解决方案 by way of link to this post

    localization.dart 我的文件导入:

    import 'package:hn/hnLocalization.dart';
    

    main.dart 我的文件导入:

    import 'hnLocalization.dart';
    

    这些与描述的不同 here

    确保使用相对路径和包导入所有文件解决了此问题。区别在于我的文件,而不是依赖项使用相对路径。那部分起初很难理解。

    现在我的 本地化。飞奔 文件具有以下内容。

    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,
                ] 
           ...
    

    现在一切都好了。