我构建了一个应用程序,使用Shared Preferences包来存储用户选择的语言环境,该语言环境将通过遵循this示例来覆盖当前语言环境。
该示例按预期工作,但目前我正在尝试找到一种方法,将共享首选项包与本教程结合使用,以便用户可以保存他们选择的语言。
这是当前代码:
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_localization_intl/locale/locales.dart';
import 'dart:async';
import 'package:shared_preferences/shared_preferences.dart';
void main() => runApp(new MyApp());
class MyApp extends StatefulWidget {
@override
MyAppState createState() {
return new MyAppState();
}
}
Future<bool> saveLocalePreference(SpecifiedLocalizationDelegate delegate) async{
SharedPreferences preferences = await SharedPreferences.getInstance();
preferences.setString("delegate", delegate.toString());
return preferences.commit();
}
class MyAppState extends State<MyApp> {
bool isSaved = false;
SpecifiedLocalizationDelegate _localeOverrideDelegate;
@override
void initState() {
_localeOverrideDelegate = new SpecifiedLocalizationDelegate(null);
super.initState();
}
onLocaleChange(Locale locale) {
setState(() {
_localeOverrideDelegate = new SpecifiedLocalizationDelegate(locale);
saveLanguage(_localeOverrideDelegate);
});
}
void makeDialog(){
showDialog(
context: context,
builder: (_) => new AlertDialog(
content: new Text("Locale has been Saved!")
)
);
}
void saveLanguage(SpecifiedLocalizationDelegate delegate){
saveLocalePreference(delegate).then((bool commited){
isSaved = commited;
setState(() {
commited = true;
print(commited);
});
makeDialog();
});
}
@override
Widget build(BuildContext context) {
return new MaterialApp(
localizationsDelegates: [
_localeOverrideDelegate,
AppLocalizationsDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
Locale('en', ""),
Locale('es', ""),
Locale('fr', "")
],
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(onLocaleChange: onLocaleChange),
);
}
}
typedef void LocaleChangeCallback(Locale locale);
class MyHomePage extends StatefulWidget {
final LocaleChangeCallback onLocaleChange;
MyHomePage({Key key, this.onLocaleChange}) : super(key: key);
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
Locale myLocale = Localizations.localeOf(context);
print(myLocale);
return new Scaffold(
appBar: new AppBar(
title: new Text(
AppLocalizations.of(context).title
),
),
body: new Center(
child: new Column(
children: <Widget>[
new MaterialButton(
child: new Text(AppLocalizations.of(context).buttonText),
onPressed: (){}),
new MaterialButton(
child: new Text("ENGLISH"),
onPressed: (){
widget.onLocaleChange(const Locale("en", ""));
}),
new MaterialButton(
child: new Text("SPANISH"),
onPressed: (){
widget.onLocaleChange(const Locale("es", ""));
}),
new MaterialButton(
child: new Text("FRENCH"),
onPressed: (){
widget.onLocaleChange(const Locale("fr", ""));
}),
new MaterialButton(
child: new Text("DEFAULT"),
onPressed: (){
widget.onLocaleChange(null);
}),
],
),
),
);
}
}
问题是:
共享的首选项似乎不起作用,因为无论何时重新启动应用程序,共享首选项仍将返回默认语言。我尝试删除initState()
,但它将返回此错误-
I/flutter ( 5254): The getter 'type' was called on null.
I/flutter ( 5254): Receiver: null
我该怎么做才能使这项工作成功?
答案 0 :(得分:0)
您尝试了吗?
if(delegate!=null){
preferences.setString("delegate", delegate.toString());
}