在Flutter

时间:2018-03-09 13:12:10

标签: localization dart flutter

我目前正在试驾,我已经建立了一个本地化的#Hello Hello"在tutorial之后。但是,当我试图将我的小部件移动到另一个文件时,我得到一个红色的死亡屏幕,错误:

The following NoSuchMethodError was thrown building ToDoItem(dirty):
The method 'helloWorld' was called on null.
Receiver: null
Tried calling: helloWorld()

My To Do项目类看起来像这样

todo_item.dart

import 'package:flutter/material.dart';
import 'package:to_do_app/localization.dart';

class ToDoItem extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return new Text(ToDoLocalizations.of(context).helloWorld());
  }
}

当然问题是我的Localization类还没有初始化,但我不知道如何初始化它,因为Text小部件没有LocalizationDelegates参数。

我知道这可以通过将String直接注入我的widget的构造函数来解决,但为了它,我想知道如何本地化小部件。

编辑:这是我的本地化课程

import 'dart:async';
import 'dart:developer';
import 'package:flutter/widgets.dart';
import 'package:intl/intl.dart';
import 'package:to_do_app/l10n/messages_all.dart';

class ToDoLocalizations {
  ToDoLocalizations(Locale locale) : _localeName = locale.toString();

  final String _localeName;

  static Future<ToDoLocalizations> load(Locale locale) {
    return initializeMessages(locale.toString()).then((Object _) {
      return new ToDoLocalizations(locale);
    });
  }

  static ToDoLocalizations of(BuildContext context) {
    return Localizations.of<ToDoLocalizations>(context, ToDoLocalizations);
  }

  String helloWorld() {
    return Intl.message(
        'Hello, World!',
        name: 'helloWorld',
        desc: 'A friendly salutation',
        locale: _localeName
    );
  }
}

class ToDoLocalizationsDelegate
    extends LocalizationsDelegate<ToDoLocalizations> {


  @override
  bool isSupported(Locale locale) {
    return ['en', 'nb'].contains(locale.languageCode);
  }

  @override
  bool shouldReload(LocalizationsDelegate<ToDoLocalizations> old) {
    return false;
  }

  @override
  Future<ToDoLocalizations> load(Locale locale) {
    return ToDoLocalizations.load(locale);
  }
}

2 个答案:

答案 0 :(得分:0)

在密切关注上述教程和此示例中列出的代码repository但未成功之后,answer向我指出了正确的方向。我的所有代码都是合理的,唯一缺少的部分是使用相对路径而不是绝对路径编写import语句,然后错误就消失了。

答案 1 :(得分:0)

我已经在main.dart中添加了MaterialApp小部件,再次在偶然添加了MaterialApp的一些文件中添加了它。因此,添加第二个MaterialApp小部件将覆盖我之前定义的内容。