流行的跨平台框架 Flutter 为开发人员提供了两个强大的小部件来处理异步操作:StreamBuilder 和 FutureBuilder。尽管它们有相似之处,但了解它们的不同之处,以便为您的特定用例选择合适的一个是至关重要的。在这篇博文中,我们将深入研究这两个小部件的特性和用法,让您全面了解何时使用它们。
FutureBuilder 简介
首先,让我们探索 FutureBuilder ,它是为处理将来返回单个值的异步操作而设计的。请按照以下步骤来利用 FutureBuilder 的强大功能:
- 当您有一个返回值的一次性异步操作(例如 HTTP 请求或从文件中读取)时,请使用 FutureBuilder。
- 导入所需的依赖项:import 'dart:async';。
- 创建一个 Future对象来表示您要执行的异步操作。例如,您可以使用http.get()发出 HTTP 请求并获取响应。
- 将取决于未来结果的 UI 部分包装在 FutureBuilder小部件内。
你最好理解这些代码。
打开您的 main.dart 文件并执行此代码,看看输出结果如何。
import 'package:flutter/material.dart';
void main() => runApp(MaterialApp(home: HomePage()));
class HomePage extends StatefulWidget {
  
  _HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
  int _count = 0; // used by StreamBuilder
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('StreamBuilder VS FutureBuilder',style: TextStyle(fontSize: 18,color: Colors.black),),
        centerTitle: true,
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          _buildFutureBuilder(),
        ],
      ),
    );
  }
  // constructing FutureBuilder
  Widget _buildFutureBuilder() {
    return Center(
      child: FutureBuilder<int>(
        future: _calculateSquare(10),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done)
            return Text("Square = ${snapshot.data}",style: TextStyle(fontSize: 20,color: Colors.purple),);
          return CircularProgressIndicator(color: Colors.green,);
        },
      ),
    );
  }
  // used by FutureBuilder
  Future<int> _calculateSquare(int num) async {
    await Future.delayed(Duration(seconds: 5));
    return num * num;
  }
}
输出:

StreamBuilder 简介
接下来,我们讨论 StreamBuilder ,它适合处理随着时间的推移产生多个值的异步操作。请按照以下步骤有效实施 StreamBuilder :
- 当您拥有可随时间变化的异步数据流(例如来自数据库或 Web 服务的实时更新)时,请使用 StreamBuilder。
- 导入所需的依赖项:import 'dart:async';。
- 创建一个 Stream对象来表示您要侦听的数据流。它可以是StreamController的实例,或者您可以使用Stream.fromFuture或Stream.periodic等内置流。
- 将依赖于 StreamBuilder小部件内的流数据的 UI 部分包装起来。
好的,如果您看到代码,那么您会更好地理解我在说什么
import 'package:flutter/material.dart';
void main() => runApp(MaterialApp(home: HomePage()));
class HomePage extends StatefulWidget {
  
  _HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
  int _count = 0; // used by StreamBuilder
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('StreamBuilder VS FutureBuilder',style: TextStyle(fontSize: 18,color: Colors.black),),
        centerTitle: true,
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          _buildStreamBuilder(),
        ],
      ),
    );
  }
  // constructing StreamBuilder
  Widget _buildStreamBuilder() {
    return Center(
      child: StreamBuilder<int>(
        stream: _stopwatch(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.active)
            return Text("Stopwatch = ${snapshot.data}",style: TextStyle(fontSize: 20,color: Colors.orange),);
          return CircularProgressIndicator();
        },
      ),
    );
  }
  // used by StreamBuilder
  Stream<int> _stopwatch() async* {
    while (true) {
      await Future.delayed(Duration(seconds: 1));
      yield _count++;
    }
  }
}
输出:
 
结论
总之, StreamBuilder 和 FutureBuilder 都是 Flutter 中重要的 widget,用于处理异步操作并根据结果数据更新 UI。
我希望你现在了解什么是 StreamBuilder 和 FutureBuilder,以及我们为什么和在哪里使用它们 ❤️❤️❤️。
原文:https://medium.com/@saurabhsinghaswal/what-is-difference-between-streambuilder-and-futurebuilder-in-flutter-2d6637583db1










