【问题标题】:Flutter toggle switch and shared preferencesFlutter 切换开关和共享首选项
【发布时间】:2020-04-14 18:54:06
【问题描述】:

我需要在我的应用中保存切换开关的状态并在开始时加载它。为此我使用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],
),

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

【问题讨论】:

  • 您使用的是StatefulWidget吗?如果是这样,您可以使用initState 获取数据并将其设置为Switch 正在使用的值。如果可能,请在DartPad 中显示您的完整代码。

标签: android flutter flutter-dependencies


【解决方案1】:

谢谢大家。暂时不能试用。 项目的结构组成:

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

main.dart 有 stateles 和 statefull 小部件。 在 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 中设置其值。

【讨论】:

    【解决方案2】:

    您需要做的是加载 SharedPreferences 并将您的 isSwitchedFT 设置为 init 状态。但是因为你需要一个 async 和 await,你需要在一个单独的方法上执行它(我还建议你只实例化 SharedPreferences 一次,然后像我在下面所做的那样重新使用它):

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

    【讨论】:

      【解决方案3】:

      检查此代码以获取示例

      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],
                  ),
                ),
              ),
            ),
          );
        }
      }
      

      【讨论】:

      • 第一次尝试就成功了。应用程序加载它在退出时的值。现在我有另一个问题。我的 main.dart 中有用于检查开关状态的逻辑。但是 isSwitchedFT 现在是本地的。我是否使用 getter 方法来检索 main.dart 的值?完成我知道的菜鸟问题。感谢您的快速回复!
      • isSwitchedFT 声明为 local 是为了方便您可以直接从 getter 返回值
      • 在尝试我真正的 android 设备和 iOS 模拟器后说得太快了:═══════ 小部件库捕获的异常══════════════ ═════════════════════ 在构建 Builder(dependencies: [MediaQuery, _LocalizationsScope-[GlobalKey#20e6f], Directionality]): 'package:flutter /src/material/toggleable.dart':断言失败:第 221 行 pos 12:'tristate || value != null': 不正确。
      • 将 switch 的值从 isSwitchedFT 更改为 isSwitchedFT ?? false , 在 Switch( value: isSwitchedFT ?? false 下写代码
      • 重启几次后重新安装,效果很好。泰。现在我正在尝试了解 getter/setter 以将此值传递给 MyHomePage 类。有一些逻辑需要知道 isSwitchedFT 的值。任何提示指向一些视频/文章?
      猜你喜欢
      • 1970-01-01
      • 2019-10-01
      • 2023-04-08
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      相关资源
      最近更新 更多