我不知道为什么Flutter定位代码不工作与零安全。
当我检查值时,我总是得到用于空值的空检查操作符。
getTranslated导致错误。
main.dart
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
List<Locale> _locals = [];
AppConstants.languages.forEach((language) {
_locals.add(Locale(language.languageCode, language.countryCode));
});
return MaterialApp(
title: AppConstants.APP_NAME,
navigatorKey: MyApp.navigatorKey,
debugShowCheckedModeBanner: false,
theme: Provider.of<ThemeProvider>(context).darkTheme ? dark : light,
locale: Provider.of<LocalizationProvider>(context).locale,
localeResolutionCallback: (locale, supportedLocales) {
for (var supportedLocale in supportedLocales)
{
if(supportedLocale.languageCode == locale?.languageCode|| supportedLocale.countryCode == locale?.countryCode)
{
return supportedLocale;
}
}
return supportedLocales.first;
},
localizationsDelegates: [
AppLocalization.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: _locals,
home: Scaffold(
appBar: AppBar(
title: const Text('Material App Bar'),
),
body: Center(
child: Text(getTranslated("hi", context)!,),
),
),
);
}
}
获取已翻译
此方法无法返回任何值。
String? getTranslated(String key, BuildContext context) {
return AppLocalization.of(context)?.translate(key);
}
应用程序_本地化.dart
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import '../utils/app_constants.dart';
class AppLocalization {
AppLocalization(this.locale);
late Locale locale;
static AppLocalization? of(BuildContext context) {
return Localizations.of<AppLocalization>(context, AppLocalization);
}
late Map<String, String> _localizedValues;
Future<void> load() async {
String jsonStringValues = await rootBundle
.loadString('assets/languages/${locale.languageCode}.json');
Map<String, dynamic> mappedJson = json.decode(jsonStringValues);
_localizedValues =
mappedJson.map((key, value) => MapEntry(key, value.toString()));
print("inside app loca: $_localizedValues");
}
String translate(String key) {
return _localizedValues[key]!;
}
static const LocalizationsDelegate<AppLocalization> delegate =
_DemoLocalizationsDelegate();
}
class _DemoLocalizationsDelegate
extends LocalizationsDelegate<AppLocalization> {
const _DemoLocalizationsDelegate();
@override
bool isSupported(Locale locale) {
List<String> _languageString = [];
AppConstants.languages.forEach((language) {
_languageString.add(language.languageCode);
});
return _languageString.contains(locale.languageCode);
}
@override
Future<AppLocalization> load(Locale locale) async {
AppLocalization localization = AppLocalization(locale);
await localization.load();
return localization;
}
@override
bool shouldReload(LocalizationsDelegate<AppLocalization> old) => false;
}
应用程序本地化代码处理语言数据。
错误堆栈为
The following _CastError was thrown building MyApp(dirty, dependencies:
[_InheritedProviderScope<LocalizationProvider>, _InheritedProviderScope<ThemeProvider>], state:
_MyAppState#522f6):
Null check operator used on a null value
The relevant error-causing widget was:
MyApp MyApp:file:///D:/1npcheck/np3/lib/main.dart:28:18
When the exception was thrown, this was the stack:
#0 _MyAppState.build (package:np_3/main.dart:77:51)
#1 StatefulElement.build (package:flutter/src/widgets/framework.dart:4992:27)
#2 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4878:15)
#3 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5050:11)
#4 Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
1条答案
按热度按时间avwztpqn1#
load()
是一个未来方法,它将需要一些帧来分配数据。代替空Assert,您可以在空情况下提供默认值,而这只是字符串情况。还有
查找更多关于null-safety的信息,也可以查看FutureBuilder-class来处理将来的方法。