【问题标题】:Flutter: Using Shared Preferences to Save Locale ChoiceFlutter:使用共享首选项保存语言环境选择
【发布时间】:2018-10-17 02:25:16
【问题描述】:

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

我能做些什么来完成这项工作?

【问题讨论】:

  • 您在哪里尝试检索以前保存的设置?我在任何地方都没有看到getString()
  • 我需要在 initState() 中创建一个 getString() 方法吗?既然我第一次还没有保存任何东西,那不会只返回一个空值吗?
  • 是的,你必须通过选择一个默认值来处理这个问题(并且可能立即保存它)。使用共享首选项,您总是必须编写代码来处理没有的初始安装,并适当地设置它们。

标签: dart flutter


【解决方案1】:

你试过了吗?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2012-03-29
    • 2019-04-09
    相关资源
    最近更新 更多