gpt4 book ai didi

flutter - 什么是 future ,我将如何使用它?

转载 作者:行者123 更新时间:2023-12-03 03:50:42 26 4
gpt4 key购买 nike

我收到以下错误:

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'
所以...
  • 什么是Future
  • 如何获取要获取的实际值?
  • 当我只有Future<T>时,我该使用什么小部件来显示我的值?
  • 最佳答案

    如果您熟悉 Task<T> Promise<T> async / await模式,则可以直接跳至“如何在Flutter中使用Future的控件”部分。
    什么是 future ,我将如何使用它?
    好吧,documentation说:

    An object representing a delayed computation.


    那是正确的。它也有点抽象和干燥。通常,函数返回结果。依序。该函数将被调用,运行并返回结果。在此之前, call 者等待。有些功能,尤其是当它们访问诸如硬件或网络之类的资源时,需要一些时间来完成。想象从网络服务器上加载头像图片,从数据库中加载用户数据,或者仅从设备内存中加载多种语言的应用程序文本。那可能很慢。
    默认情况下,大多数应用程序只有一个控制流。当阻止此流时(例如,通过等待耗时的计算或资源访问),应用程序将冻结。如果年龄足够大,您可能会记得这是标准配置,但是在当今世界,这将被视为错误。即使花费一些时间,我们也会获得一些动画效果。一个微调器,一个沙漏,或者一个进度条。但是,应用程序如何运行并显示动画却仍然等待结果?答案是:异步操作。代码等待某些操作时仍在运行的操作。现在,编译器如何知道是应该停止所有操作并等待结果,还是继续所有后台工作并仅在此情况下等待?好吧,它自己不能弄清楚。我们必须告诉它。
    这可以通过称为 的模式来实现。它不特定于 ,在许多其他语言中以相同的名称存在。您可以找到Dart here的文档。
    由于花费一些时间的方法不能立即返回,因此它将返回完成后传递值的 promise 。
    这称为 Future。因此,从数据库中加载数字的 promise 会返回 Future<int>,而从互联网搜索中返回电影列表的 promise 可能会返回 Future<List<Movie>>。将来会为您提供 Future<T>
    让我们尝试不同的解释:

    A future represents the result of an asynchronous operation, and can have two states: uncompleted or completed.


    最有可能的是,因为您这样做并不是为了娱乐,所以实际上您需要 T的结果才能在应用程序中进行。您需要显示数据库中的号码或找到的电影列表。因此,您要等待,直到结果出现为止。这是 Future<T>出现的地方:
    Future<List<Movie>> result = loadMoviesFromSearch(input);

    // right here, you need the result. So you wait for it:
    List<Movie> movies = await result;
    但是,等等,我们还不完整吗?我们不是又在等待结果吗?是的,确实如此。如果程序与顺序流没有某种相似之处,它们将完全困惑。但是关键是我们使用关键字 await告诉编译器,此时,虽然我们要等待结果,但我们不希望应用程序冻结。我们希望所有其他正在运行的操作(例如动画)继续进行。
    但是,只能在本身被标记为 await并返回 await的函数中使用 async关键字。因为当您用 Future<T>编码时,正在等待的函数不再能立即返回其结果。您只能退还所拥有的东西,如果您必须等待,则必须退还 promise 以稍后交付。
    Future<Pizza> getPizza() async {
    Future<PizzaBox> delivery = orderPizza();

    var pizzaBox = await delivery;

    var pizza = pizzaBox.unwrap();

    return pizza;
    }
    我们的getPizza函数必须等待比萨饼,因此与其立即返回 await而不是立即返回披萨的 promise ,不如立即返回 Pizza。现在,您可以依次在某处对getPizza函数进行 await编码。
    如何在Flutter中将Future与窗口小部件一起使用?
    flutter中的所有小部件都期望真实值。将来没有值(value)的 promise 。当按钮需要文本时,它不能使用稍后会出现文本的 promise 。它需要立即显示按钮,所以现在需要文本。
    但是有时候,您所拥有的只是一个 Future<T>。这就是 FutureBuilder 出现的地方。您可以在有 future 时使用它,在等待时显示一件事(例如进度指示器),在完成时显示另一件事(例如结果)。
    让我们看一下我们的披萨示例。您想订购披萨,想要在等待时显示进度指示器,想要在交货后查看结果,并且可能在出现错误时显示错误消息:
    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();
    }
    })
    ]);
    }
    }
    这是您使用FutureBuilder来显示 future 结果的方式。

    关于flutter - 什么是 future ,我将如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63536998/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com