【问题标题】:type 'Future<dynamic>' is not a subtype of type 'bool' shared_preferences'Future<dynamic>' 类型不是 'bool' 类型的子类型 shared_preferences
【发布时间】:2019-11-14 07:50:58
【问题描述】:

试图让这个开关仍然起作用,以及保存和保持应用关闭/重新打开。这些事情都没有实现,一旦激活开关,尝试将开关改回时会抛出错误。

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

【问题讨论】:

  • 不确定发生了什么,尝试了给出的解决方案。他们暂时工作然后停止工作,现在开关根本不起作用。从版本控制恢复到旧版本,并且只有一个页面可以使用最初预期的值更改。

标签: flutter dart sharedpreferences


【解决方案1】:

您的onChange 期望bool 作为参数,而您传入​​value &amp;&amp; _setValue()。你确定这评估为bool

看起来_setValue 正在返回一个Future&lt;dynamic&gt;,并且这与&amp;&amp; 一起不会评估为bool,并且正在触发断言错误,我怀疑。

您可以将_setValue 调用移动到您的onChange 方法,然后使用新值调用它,或者将对onChange 的调用从一个到_setValue 分开:

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

【讨论】:

  • 谢谢你,这可行,我不再收到错误消息,但关闭应用程序后开关变回。
【解决方案2】:

我认为你的问题在于 _setValue() in

onChange(value && _setValue());

没有返回任何东西。

您应该尝试将此调用放在 onChange() 之上,或者让它在最后返回 true。

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

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

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

【讨论】:

  • 你有没有试过最后返回true?在您的情况下,值 && _setValue() 无法评估为布尔值。
  • 谢谢你,这可行,我不再收到错误消息,但关闭应用程序后开关变回。
  • 是的,我在最后添加了 return true。
  • 然后您需要在构建您的交换机(可能使用 FutureBuilder)之前加载 sharedpreferences 并获取该值并将该值传递给它。
  • 如果您需要帮助,我可以在当天晚些时候举个例子
【解决方案3】:

只需将您的代码更改如下,

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

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

这将解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-05
    • 2020-01-01
    • 2020-09-24
    • 2020-09-11
    • 2020-10-13
    • 2021-02-10
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多