Flutter 本地化 - 在 Null 上调用文本
Flutter localization - Text was called on Null
我正在尝试为我的 Flutter 应用实现本地化。但是有一个错误是 The method 'text' was called on null. Receiver: null Tried calling: text("title")
.
问题出在选择语言时的语言选择器页面。标题应该根据语言改变。目前有英文和中文。
import 'package:MyApp/services/AppTranslations.dart';
import 'package:MyApp/services/Application.dart';
import 'package:flutter/material.dart';
class LanguageSelectorPage extends StatefulWidget {
@override
_LanguageSelectorPageState createState() => _LanguageSelectorPageState();
}
class _LanguageSelectorPageState extends State<LanguageSelectorPage> {
//languagesList also moved to the Application class just like the languageCodesList
static final List<String> languagesList = application.supportedLanguages;
static final List<String> languageCodesList =
application.supportedLanguagesCodes;
final Map<dynamic, dynamic> languagesMap = {
languagesList[0]: languageCodesList[0],
languagesList[1]: languageCodesList[1],
};
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
AppTranslations.of(context).text("title") //This is where the error come from
),
),
body: _buildLanguagesList(),
);
}
_buildLanguagesList() {
return ListView.builder(
itemCount: languagesList.length,
itemBuilder: (context, index) {
return _buildLanguageItem(languagesList[index]);
},
);
}
_buildLanguageItem(String language) {
return InkWell(
onTap: () {
print(language);
application.onLocaleChanged(Locale(languagesMap[language]));
},
child: Center(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 20.0),
child: Text(
language,
style: TextStyle(
fontSize: 24.0,
),
),
),
),
);
}
}
在我的 json 文件中有标题。
{
"title" : "Testing Title",
}
这是我的 AppTranslations
import 'dart:async';
import 'dart:convert';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
class AppTranslations {
Locale locale;
static Map<dynamic, dynamic> _localisedValues;
AppTranslations(Locale locale) {
this.locale = locale;
_localisedValues = null;
}
static AppTranslations of(BuildContext context) {
return Localizations.of<AppTranslations>(context, AppTranslations);
}
static Future<AppTranslations> load(Locale locale) async {
AppTranslations appTranslations = AppTranslations(locale);
String jsonContent = await rootBundle.loadString("assets/lang/${locale.languageCode}.json");
_localisedValues = json.decode(jsonContent);
return appTranslations;
}
get currentLanguage => locale.languageCode;
String text(String key) {
return _localisedValues[key] ?? "$key not found";
}
}
如果你关注了下面的视频
https://www.youtube.com/watch?v=lDfbbTvq4qM&t=611s
那么你肯定会得到一个空错误。
这就是我解决问题的方法。
只需更改:
由此
localeResolutionCallback: (locale, supportedLocales) {
// Check if the current device locale is supported
for (var supportedLocale in supportedLocales) {
if (supportedLocale.languageCode == locale.languageCode &&
supportedLocale.countryCode == locale.countryCode) {
return supportedLocale;
}
}
// If the locale of the device is not supported, use the first one
// from the list (English, in this case).
return supportedLocales.first;
},
到此
localeResolutionCallback: (locale, supportedLocales) {
// Check if the current device locale is supported
for (var supportedLocale in supportedLocales) {
if (supportedLocale.languageCode == locale?.languageCode ||
supportedLocale.countryCode == locale?.countryCode) {
return supportedLocale;
}
}
// If the locale of the device is not supported, use the first one
// from the list (English, in this case).
return supportedLocales.first;
},
它会工作..!
我正在尝试为我的 Flutter 应用实现本地化。但是有一个错误是 The method 'text' was called on null. Receiver: null Tried calling: text("title")
.
问题出在选择语言时的语言选择器页面。标题应该根据语言改变。目前有英文和中文。
import 'package:MyApp/services/AppTranslations.dart';
import 'package:MyApp/services/Application.dart';
import 'package:flutter/material.dart';
class LanguageSelectorPage extends StatefulWidget {
@override
_LanguageSelectorPageState createState() => _LanguageSelectorPageState();
}
class _LanguageSelectorPageState extends State<LanguageSelectorPage> {
//languagesList also moved to the Application class just like the languageCodesList
static final List<String> languagesList = application.supportedLanguages;
static final List<String> languageCodesList =
application.supportedLanguagesCodes;
final Map<dynamic, dynamic> languagesMap = {
languagesList[0]: languageCodesList[0],
languagesList[1]: languageCodesList[1],
};
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
AppTranslations.of(context).text("title") //This is where the error come from
),
),
body: _buildLanguagesList(),
);
}
_buildLanguagesList() {
return ListView.builder(
itemCount: languagesList.length,
itemBuilder: (context, index) {
return _buildLanguageItem(languagesList[index]);
},
);
}
_buildLanguageItem(String language) {
return InkWell(
onTap: () {
print(language);
application.onLocaleChanged(Locale(languagesMap[language]));
},
child: Center(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 20.0),
child: Text(
language,
style: TextStyle(
fontSize: 24.0,
),
),
),
),
);
}
}
在我的 json 文件中有标题。
{
"title" : "Testing Title",
}
这是我的 AppTranslations
import 'dart:async';
import 'dart:convert';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
class AppTranslations {
Locale locale;
static Map<dynamic, dynamic> _localisedValues;
AppTranslations(Locale locale) {
this.locale = locale;
_localisedValues = null;
}
static AppTranslations of(BuildContext context) {
return Localizations.of<AppTranslations>(context, AppTranslations);
}
static Future<AppTranslations> load(Locale locale) async {
AppTranslations appTranslations = AppTranslations(locale);
String jsonContent = await rootBundle.loadString("assets/lang/${locale.languageCode}.json");
_localisedValues = json.decode(jsonContent);
return appTranslations;
}
get currentLanguage => locale.languageCode;
String text(String key) {
return _localisedValues[key] ?? "$key not found";
}
}
如果你关注了下面的视频
https://www.youtube.com/watch?v=lDfbbTvq4qM&t=611s
那么你肯定会得到一个空错误。
这就是我解决问题的方法。
只需更改: 由此
localeResolutionCallback: (locale, supportedLocales) {
// Check if the current device locale is supported
for (var supportedLocale in supportedLocales) {
if (supportedLocale.languageCode == locale.languageCode &&
supportedLocale.countryCode == locale.countryCode) {
return supportedLocale;
}
}
// If the locale of the device is not supported, use the first one
// from the list (English, in this case).
return supportedLocales.first;
},
到此
localeResolutionCallback: (locale, supportedLocales) {
// Check if the current device locale is supported
for (var supportedLocale in supportedLocales) {
if (supportedLocale.languageCode == locale?.languageCode ||
supportedLocale.countryCode == locale?.countryCode) {
return supportedLocale;
}
}
// If the locale of the device is not supported, use the first one
// from the list (English, in this case).
return supportedLocales.first;
},
它会工作..!