颤动切换开关和共享首选项

时间:2019-12-23 13:21:12

标签: android flutter flutter-dependencies

我需要将拨动开关的状态保存在我的应用中,并在开始时加载它。为此,我使用SharedPreferences

Future<bool> saveSwitchState(bool value) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setBool("switchState", value);
  return prefs.setBool("switchState", value);
}

Future<bool> getSwitchState() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  isSwitchedFT = prefs.getBool("switchState");
  print(isSwitchedFT);

  return isSwitchedFT;
}

每次更改切换值时,saveSwitchState()都会运行。

问题出在应用程序的开头。 我创建了一个布尔值:bool isSwitchedFT = false; 我初始化为false,因为null会给我错误。 我将如何设置isSwitchedFT = getSwitchState; 对于isSwitchedFT的空值,它可以编译,但是在模拟器上出现红色错误:

'package:flutter/src/material/toggleable.dart': Failed assertion: line 45 pos 15: 'tristate || value
 != null': is not true.

使用值编译时,开关可以正常工作并保存更改的值。

Switch(
  value: isSwitchedFT,
  onChanged: (bool value) {
    setState(() {
      isSwitchedFT = value;
      saveSwitchState(value);
      print('Saved state is $isSwitchedFT');
      //switch works
    });
    print(isSwitchedFT);
  },
  activeTrackColor: Color(0xFF1D1F33),
  activeColor: Colors.purple[500],
),

我想要的是用开关的最后一个值加载应用程序。 谢谢。

3 个答案:

答案 0 :(得分:0)

检查此代码以获取示例

class _MyAppState extends State<MyApp> {
  bool isSwitchedFT = false;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    getSwitchValues();
  }

  getSwitchValues() async {
    isSwitchedFT = await getSwitchState();
    setState(() {});
  }

  Future<bool> saveSwitchState(bool value) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setBool("switchState", value);
    print('Switch Value saved $value');
    return prefs.setBool("switchState", value);
  }

  Future<bool> getSwitchState() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    bool isSwitchedFT = prefs.getBool("switchState");
    print(isSwitchedFT);

    return isSwitchedFT;
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          child: Center(
            child: Switch(
              value: isSwitchedFT,
              onChanged: (bool value) {
                setState(() {
                  isSwitchedFT = value;
                  saveSwitchState(value);
                  print('Saved state is $isSwitchedFT');
                  //switch works
                });
                print(isSwitchedFT);
              },
              activeTrackColor: Color(0xFF1D1F33),
              activeColor: Colors.purple[500],
            ),
          ),
        ),
      ),
    );
  }
}

答案 1 :(得分:0)

您需要做的是加载SharedPreferences并将isSwitchedFT设置为init状态。但是因为您需要异步并等待,所以需要在单独的方法上进行操作(我也建议您仅实例化SharedPreferences一次,然后像下面所做的那样重新使用它):

SharedPreferences prefs;

@override
void initState() {
  loadSharedPreferencesAndSwitchState();
  super.initState();
}

void loadSharedPreferencesAndSwitchState() async {
  prefs = await SharedPreferences.getInstance();
  isSwitchedFT = prefs.getBool("switchState");
}

答案 2 :(得分:0)

谢谢大家。目前无法尝试。 该项目的结构由以下组成:

  • main.dart
  • switch.dart
  • jsonLogic.dart

main.dart同时具有Stateles和Statefull小部件。 在有状态的小部件中,我将其称为switch.dart和json部分。

isSwitchedFT的初始化在主文件中进行。 看起来应该将其带到switch.dart文件中 这是完整的switch.dart文件,没有导入:

class SwitchIt extends StatefulWidget {
  @override
  _SwitchItState createState() => _SwitchItState();
}

class _SwitchItState extends State<SwitchIt> {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Switch(
          value: isSwitchedFT,
          onChanged: (bool value) {
            setState(() {
              isSwitchedFT = value;
              saveSwitchState(value);
              print('Saved state is $isSwitchedFT');

              //switch works
            });
            print(isSwitchedFT);
          },
          activeTrackColor: Color(0xFF1D1F33),
          activeColor: Colors.purple[500],
        ),
      ],
    );
  }

Future<bool> saveSwitchState(bool value) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setBool("switchState", value);
  return prefs.setBool("switchState", value);
}

Future<bool> getSwitchState() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  isSwitchedFT = prefs.getBool("switchState");
  print(isSwitchedFT);
  return isSwitchedFT;
}

也许解决方案已经发布。现在无法检查。但是这个想法是将isSwitchedFT带到switch.dart并使用initState()从shared_preferences设置其值。