当前位置: 首页 > 知识库问答 >
问题:

什么是未来,我如何使用它?

米俊晤
2023-03-14

我得到以下错误:

A value of type 'Future<int>' can't be assigned to a variable of type 'int'

它可能是另一种类型,而不是int,但基本上模式

A value of type 'Future<T>' can't be assigned to a variable of type 'T'

所以

  • 什么是未来
  • 如何获得我想要的实际值
  • 当我只有一个未来时,我用什么小部件来显示我的价值

共有3个答案

薛修能
2023-03-14

下面列出了其他语言与Dart的未来类似之处:

  • JS:promise

就像在其他语言中一样,Future是一种特殊类型的对象,它允许使用异步/等待语法糖,以同步/线性方式编写异步代码。您从异步方法返回Future,而不是接受回调作为参数并避免回调地狱——Futures和回调都解决了相同的问题(稍后触发一些代码),但方式不同。

凤自珍
2023-03-14

<代码>未来

例如:

Future<int> getValue() async {
    return Future.value(5);
  }

以上代码正在返回未来。值(5)属于int类型,但从方法接收值时,我们不能使用类型未来

Future<int> value = await getValue();  // Not Allowed
// Error
A value of type 'Future<int>' can't be assigned to a variable of type 'int'

要解决上述问题,应在inttype下接收getValue()

  int value = await getValue(); // right way as it returning the potential value. 

阴宏爽
2023-03-14

如果您熟悉任务

文件上说:

表示延迟计算的对象。

没错。它也有点抽象和枯燥。通常,函数会返回一个结果。按顺序。函数被调用、运行并返回其结果。在那之前,来电者会等待。有些功能,尤其是当它们访问硬件或网络等资源时,需要一点时间。想象一下,从网络服务器加载一张化身图片,从数据库加载用户数据,或者从设备内存加载多语言的应用文本。这可能很慢。

默认情况下,大多数应用程序只有一个控制流。当这个流被阻塞时,例如等待一个需要时间的计算或资源访问,应用程序就会冻结。如果你已经足够大了,你可能会记得这是一个标准,但在当今世界,这将被视为一个错误。即使有些事情需要时间,我们也会有一点活力。旋转器,沙漏,或者进度条。但是,应用程序如何在运行和显示动画的同时仍然等待结果呢?答案是:异步操作。代码等待时仍在运行的操作。现在,编译器如何知道,它应该停止所有操作并等待结果,还是继续所有后台工作并仅在这个实例中等待?好吧,它自己无法解决这个问题。我们必须说出来。

这是通过称为异步和等待的模式实现的。它不特定于flutter或dart,它在许多其他语言中以相同的名称存在。您可以在此处找到Dart的留档。

由于需要一段时间的方法无法立即返回,因此它将在完成时返回交付价值的promise。

这称为Future。因此,promise从数据库加载一个数字将返回一个Future

让我们尝试不同的解释:

future表示异步操作的结果,可以有两种状态:未完成或已完成。

最有可能的是,因为你这样做不是为了好玩,你实际上需要的是未来的结果

Future<List<Movie>> result = loadMoviesFromSearch(input);

// right here, you need the result. So you wait for it:
List<Movie> movies = await result;

但是等等,我们不是绕了一圈吗?我们不是又在等结果了吗?是的,的确如此。如果程序没有顺序流的相似性,它们将是完全混乱的。但关键是,使用关键字wait我们已经告诉编译器,此时,虽然我们希望等待结果,但我们不希望应用程序只是冻结。我们希望所有其他运行操作(例如动画)继续。

但是,您只能在本身标记为async的函数中使用wait关键字,并返回Future

Future<Pizza> getPizza() async {
    Future<PizzaBox> delivery = orderPizza();        

    var pizzaBox = await delivery;

    var pizza = pizzaBox.unwrap();
    
    return pizza;   
}

我们的getPizza函数必须等待披萨,因此它必须返回未来会有披萨的promise,而不是立即返回Pizza。现在您可以反过来,在某个地方等待getPizza函数。

Flatter中的所有小部件都期望有真正的价值。而不是promise以后会有价值。当按钮需要文本时,它不能保证文本稍后会出现。它现在需要显示按钮,所以现在需要文本。

但有时,你所拥有的只是一个未来

让我们来看一下我们的披萨示例。你想要点披萨,你想要一个进度指示器,当你等待它的时候,你想要在它交付后看到结果,当出现错误时,你可能会显示一条错误消息:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

/// ordering a pizza takes 5 seconds and then gives you a pizza salami with extra cheese
Future<String> orderPizza() {
  return Future<String>.delayed(const Duration(seconds: 5), () async => 'Pizza Salami, Extra Cheese');
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark(),
      home: Scaffold(
        body: Center(
          child: PizzaOrder(),
        ),
      ),
    );
  }
}

class PizzaOrder extends StatefulWidget {
  @override
  _PizzaOrderState createState() => _PizzaOrderState();
}

class _PizzaOrderState extends State<PizzaOrder> {
  Future<String>? delivery;

  @override
  Widget build(BuildContext context) {
    return Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: [
          ElevatedButton(
            onPressed: delivery != null ? null : () => setState(() { delivery = orderPizza(); }),
            child: const Text('Order Pizza Now')
          ),
          delivery == null
            ? const Text('No delivery scheduled')
            : FutureBuilder(
              future: delivery,
              builder: (context, snapshot) {
                if(snapshot.hasData) {
                  return Text('Delivery done: ${snapshot.data}');
                } else if(snapshot.hasError) {
                  return Text('Delivery error: ${snapshot.error.toString()}');
                } else {
                  return const CircularProgressIndicator();
                }
              })
        ]);
  }
}

这就是你如何使用FutureBuilder来显示你拥有未来的结果。

 类似资料:
  • 我所知道的关于排字的只是它们以某种方式取代了舱单。互联网上的信息很少,不能给我提供一个很好的主题意识。 因此,如果有人分享一些关于排字的有用材料的链接,包括示例和流行的用例,我会很高兴的。也欢迎详细的解答和解释。

  • 问题内容: 我一直在搜索,但仍然不确定“盐”是什么以及如何使用/实现它。对不起这个问题,我是自学php。 问题答案: 我绝对不是专家,但是真正简短的答案是“涂一行”文本意味着在其末尾添加一些额外的字符。您可以将“ salt”和“ abcdefg”加盐以获得“ saltabcdefg”。如果“盐”恰好是您想要使其更难猜测的密码,则这可能很有用。 通常,密码+盐会通过一些难以逆转的过程转换(“散列”)

  • 使用它来分析C或C++中的代码? 使用它来分析x86汇编程序中的代码?

  • 问题内容: 我正在阅读有关该功能的信息。问题是我仍然无法理解其用法。据我所知的唯一的事情是相同调用。 我不明白这本书何时提到你如何在运行时不知道其名称的情况下如何使用它来获取对函数的引用。总的来说,也许这是我在编程方面的菜鸟。谁能给这个问题一些启发?我什么时候以及如何使用它? 问题答案: 完全等同于。 有只有两个原因使用它: 你无法编写,因为你事先不知道想要哪个属性(它来自字符串)。对于元编程非常

  • 我正在研究一些对象的Flux,比如

  • 问题内容: 我一直在听到所有添加到JVM的新功能,这些功能之一是invokedynamic。我想知道它是什么,它如何使Java中的反射式编程更容易或更好? 问题答案: 这是一条新的JVM指令,它允许编译器生成代码,该代码以比以前更宽松的规范来调用方法-如果您知道“ 鸭子类型 ”是什么,invokedynamic基本上允许进行鸭子类型。作为Java程序员,您可以做的事情太多了。但是,如果您是工具创建