类型'Future <dynamic>'不是类型'bool'的子类型shared_preferences

时间:2019-11-14 07:50:58

标签: flutter dart sharedpreferences

尝试使此开关仍然起作用,并保存并保持应用程序关闭/重新打开。这些都无法实现,一旦激活开关,尝试将开关改回原位时将抛出错误。

The following assertion was thrown while handling a gesture:
type 'Future<dynamic>' is not a subtype of type 'bool'

-

void onChange(bool value) {
    setState(() {
      brain.units = value;
    });
  }

  //Shared Prefs saver

  void initState() {
    super.initState();
    _loadValue();
  }

  _loadValue() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      units = (prefs.getBool('boolValue'));
    });
  }

  _setValue() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      units = (prefs.getBool('boolValue'));
      prefs.setBool('boolValue', units);
    });
  }

  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: SwitchListTile(
          title: Text(this.unitName = brain.unitClass(),
          value: brain.units,
          secondary: Icon(FontAwesomeIcons.balanceScale, color: kIconColor),
          onChanged: (
            bool value,
          ) {
            onChange(value && _setValue());
          },
        ),
      ),
    );
  }
}

3 个答案:

答案 0 :(得分:0)

我认为您的问题在于_setValue()在

onChange(value && _setValue());

没有返回任何内容。

您应该尝试将此调用放在onChange()的顶部,或者让它在末尾返回true。

 _setValue() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      units = (prefs.getBool('boolValue'));
      prefs.setBool('boolValue', units);
    });
    return true
  }

或者如果不需要在onChange(value)调用之前完成_setValue()

onChanged: (bool value) {
     _setValue();
     onChange(value);
},

答案 1 :(得分:0)

您的onChange期望以bool作为参数,而您正在传递value && _setValue()。您确定这计算为bool吗?

我怀疑_setValue似乎正在返回Future<dynamic>,并且它与&&一起不能得出bool并触发了断言错误。

您可以将_setValue调用移至onChange方法,然后使用新值对其进行调用,或者将对onChange的调用从对_setValue的调用中分开:

onChanged: (bool value,) {
     _setValue();
     onChange(value);
},

答案 2 :(得分:0)

只需按以下步骤更改代码,

onChanged: (bool value,) asyc
          {
            var isValueSet=await _setValue();
            onChange(value && isValueSet);
          },

在这里,您要用于传递内部onChange()方法的_setValue()具有Future返回类型。这意味着您必须等到未评估_setValue()为止。因此,请尝试如上所述分配未来值。

这将解决您的问题。