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

Flutter 什么是未来?我如何使用它?,flutter,dart,async-await,future,flutter-futurebuilder,async,await,Flutter,Dart,Async Await,Future,Flutter Futurebuilder,Async,Await,我得到以下错误: 无法将“Future”类型的值分配给“int”类型的变量 它可能是另一种类型,而不是int,但基本上模式是 无法将“Future”类型的值分配给“t”类型的变量 所以 什么是未来 如何获得我想要的实际值 当我只有一个未来时,我使用什么小部件来显示我的价值 如果您熟悉or和异步/等待模式,那么您可以直接跳到“如何使用flatter中的小部件使用未来”部分 什么是未来?我如何使用它? 那么,报告说, 表示延迟计算的对象 这是正确的。它也有点抽象和枯燥。通常,函数返回一个结果。

我得到以下错误:

无法将“Future”类型的值分配给“int”类型的变量
它可能是另一种类型,而不是
int
,但基本上模式是

无法将“Future”类型的值分配给“t”类型的变量
所以

  • 什么是未来
  • 如何获得我想要的实际值
  • 当我只有一个
    未来
    时,我使用什么小部件来显示我的价值
如果您熟悉or和
异步
/
等待
模式,那么您可以直接跳到“如何使用flatter中的小部件使用未来”部分

什么是未来?我如何使用它? 那么,报告说,

表示延迟计算的对象

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

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

这是通过称为and的模式实现的。它不是特定于或,它在许多其他语言中以相同的名称存在。您可以找到Dart的文档

由于需要一段时间的方法不能立即返回,因此它将在完成时返回传递值的承诺

这就是所谓的未来。因此,从数据库加载数字的承诺将返回
未来
,而从互联网搜索返回电影列表的承诺可能返回
未来
。一个
未来
是一个未来会给你一个
T
的东西

让我们尝试另一种解释:

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

最有可能的情况是,由于您这样做不仅仅是为了好玩,您实际上需要
未来的结果才能在应用程序中取得进展。您需要显示数据库中的编号或找到的电影列表。所以你要等待,直到结果出现。这就是
wait
的作用:

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

// right here, you need the result. So you wait for it:
List<Movie> movies = await result;
我们的getPizza函数必须等待pizza,因此它不是立即返回
pizza
,而是返回未来将有一个pizza的承诺。现在,您可以依次在某处等待getPizza函数

如何在flatter中使用未来的小部件? Flatter中的所有小部件都期望实际值。而不是承诺以后会有价值。当按钮需要文本时,它不能使用文本稍后会出现的承诺。现在需要显示按钮,所以现在需要文本

但有时,你所拥有的只是一个未来。这就是问题所在。当你有未来时,你可以使用它,在你等待它的时候显示一件事(例如进度指示器),在它完成的时候显示另一件事(例如结果)

让我们看一下我们的比萨饼示例。您想要订购比萨饼,在等待比萨饼时想要一个进度指示器,您想要在比萨饼交付后看到结果,并且可能在出现错误时显示错误消息:

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(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: [
          RaisedButton(
            onPressed: delivery != null ? null : () => setState(() { delivery = orderPizza(); }),
            child: Text('Order Pizza Now')
          ),
          delivery == null
            ? 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 CircularProgressIndicator();
                }
              })
        ]);
  }
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
///点一份比萨需要5秒钟的时间,然后给你一份比萨意大利腊肠加上额外的奶酪
未来订单(){
return Future.delayed(持续时间(秒:5),()异步=>“比萨沙拉,额外的奶酪”);
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:ThemeData.dark(),
家:脚手架(
正文:中(
child:PizzaOrder(),
),
),
);
}
}
类PizzaOrder扩展StatefulWidget{
@凌驾
_PizzaOrderState createState()=>\u PizzaOrderState();
}
类PizzaOrderState扩展状态{
未来交付;
@凌驾
小部件构建(构建上下文){
返回列(
crossAxisAlignment:crossAxisAlignment.center,
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
升起的按钮(
onPressed:delivery!=null?null:()=>setState((){delivery=orderPizza();}),
子项:文本('Order Pizza Now')
),
传递==null
?文本(“未安排交付”)
:未来建设者(
未来:交付,
生成器:(上下文,快照){
if(snapshot.hasData){
返回文本('Delivery done:${snapshot.data}');
}else if(snapshot.hasrerror){
返回文本('传递错误:${snapshot.error.toString()}');
}否则{
返回循环ProgressIndicator();
}
})
]);
}
}
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(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: [
          RaisedButton(
            onPressed: delivery != null ? null : () => setState(() { delivery = orderPizza(); }),
            child: Text('Order Pizza Now')
          ),
          delivery == null
            ? 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 CircularProgressIndicator();
                }
              })
        ]);
  }
}
Future<int> getValue() async {
    return Future.value(5);
  }
Future<int> value = await getValue();  // Not Allowed
// Error
A value of type 'Future<int>' can't be assigned to a variable of type 'int'
  int value = await getValue(); // right way as it returning the potential value.