【问题标题】:How to get the 'bool' value from a Future<bool> into a field variable, for later use如何将 Future<bool> 中的 'bool' 值获取到字段变量中,以供以后使用
【发布时间】:2021-09-30 04:32:57
【问题描述】:

我正在使用flutter_blue 包来使用蓝牙服务。我想检查设备是否具有蓝牙功能。方法isAvailable 似乎可以做到。但是,它返回一个 Future,我试图将其放入一个变量中,如下所示:

import 'package:flutter_blue/flutter_blue.dart';

class BT_Base {

final FlutterBlue _fb = FlutterBlue.instance;
bool BTAvailable = true;     // as a default placeholder

BT_Base () {
    BTAvailable = _fixAvail();
}

_fixAvail () async {
  return await _fb.isAvailable;
}

...

我尝试从中获取未来值并将其存储到BTAvailable。稍后,我使用固定的 BTAvailable 字段来获取要传递的适当 Widget,如下所示:

class BTDevicePrompt extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    BT_Base bt = BT_Base();
    var btDeviceRes = bt.scan();

    if(!bt.BTAvailable) return Text('Bluetooth unavailable on device...');
    else if (btDeviceRes.isEmpty) return Text('No Bluetooth devices in range...');
    else {
      return CupertinoActionSheet(
        actions: [
                  ...
                 ],
      )
    }
  }
}

但我在运行时不断收到错误type 'Future&lt;dynamic&gt;' is not a subtype of type 'bool'。在这种情况下如何正确使用 Future?如果整个过程停止并等待这部分也可以。

我已经经历了很多解决方案,但我无法将它们拼凑起来。

【问题讨论】:

    标签: flutter dart future flutter-futurebuilder


    【解决方案1】:

    任何标记为async 的方法总是返回某种Future。你可以给它一个显式的返回类型,比如Future&lt;bool&gt; function() async { ... },或者如果你忽略它,它会推断出Future&lt;dynamic&gt;

    简而言之,您无法在 async 函数之外从 Future&lt;bool&gt; 获取 bool(从技术上讲有一些方法,但几乎可以肯定在 Flutter 中不是您想要的)。

    这是有道理的,因为Future&lt;bool&gt; 的全部意义在于它将成为bool在未来。如果有一些过程可以从Future&lt;bool&gt; 转换为bool,如果未来还没有完成应该怎么办?也许它应该等到它完成。在这种情况下,您只是在描述 await 关键字。

    但是,如果您想在 Flutter 应用程序的 UI 中使用 Future,您有几个选择。

    对于您的情况,最简单的方法是将其移至initState()

    class BTDevicePrompt extends StatefulWidget {
      // stateful widget boilerplate
    }
    
    class BTDevicePromptState extends State<BTDevicePrompt> {
      bool isAvailable = false;
    
      @override
      void initState() {
        super.initState();
        checkAvailable();  // use a helper method because initState() cannot be async
      }
    
      Future<void> checkAvailable() async {
        // call an async function and wait for it to complete
        bool result = await checkIfBluetoothAvailable();
        setState(() => bluetoothAvailable = result);  // set the local variable
      }
    
      @override
      Widget build(BuildContext context) {
        if (bluetoothAvailable) return Text('bluetooth available');
        else return Text('bluetooth not available');
      }
    }
    

    【讨论】:

    • 谢谢,工作就像一个魅力。我现在对States和Futures有了更好的了解!
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 2023-04-11
    • 2020-07-04
    • 2021-10-02
    相关资源
    最近更新 更多