我目前正在试驾,我已经建立了一个本地化的#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);
}
}
答案 0 :(得分:0)
在密切关注上述教程和此示例中列出的代码repository但未成功之后,answer向我指出了正确的方向。我的所有代码都是合理的,唯一缺少的部分是使用相对路径而不是绝对路径编写import语句,然后错误就消失了。
答案 1 :(得分:0)
我已经在main.dart中添加了MaterialApp小部件,再次在偶然添加了MaterialApp的一些文件中添加了它。因此,添加第二个MaterialApp小部件将覆盖我之前定义的内容。