Flutter:使用共享首选项保存区域设置选择

时间:2018-10-17 02:25:17

标签: dart flutter

我构建了一个应用程序,使用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

我该怎么做才能使这项工作成功?

1 个答案:

答案 0 :(得分:0)

您尝试了吗?

if(delegate!=null){
preferences.setString("delegate", delegate.toString());
}