Flutter StreamBuilder vs FutureBuilder

后端 未结 3 1780
渐次进展
渐次进展 2020-12-07 18:15

What is the main difference between StreamBuilder and FutureBuilder.

  • What to use and when to use?

  • What are the ta

3条回答
  •  孤城傲影
    2020-12-07 18:52

    FutureBuilder is used for one time response, like taking an image from Camera, getting data once from native platform (like fetching device battery), getting file reference, making an http request etc.

    On the other hand, StreamBuilder is used for fetching some data more than once, like listening for location update, playing a music, stopwatch, etc.


    Here is full example mentioning both cases.

    FutureBuilder solves a square value and returns the result after 5 seconds, till then we show progress indicator to the user.

    StreamBuilder shows a stopwatch, incrementing _count value by 1 every second.

    void main() => runApp(MaterialApp(home: HomePage()));
    
    class HomePage extends StatefulWidget {
      @override
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State {
      int _count = 0; // used by StreamBuilder
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              _buildFutureBuilder(),
              SizedBox(height: 24),
              _buildStreamBuilder(),
            ],
          ),
        );
      }
    
      // constructing FutureBuilder
      Widget _buildFutureBuilder() {
        return Center(
          child: FutureBuilder(
            future: _calculateSquare(10),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done)
                return Text("Square = ${snapshot.data}");
    
              return CircularProgressIndicator();
            },
          ),
        );
      }
    
      // used by FutureBuilder
      Future _calculateSquare(int num) async {
        await Future.delayed(Duration(seconds: 5));
        return num * num;
      }
    
      // constructing StreamBuilder
      Widget _buildStreamBuilder() {
        return Center(
          child: StreamBuilder(
            stream: _stopwatch(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.active)
                return Text("Stopwatch = ${snapshot.data}");
    
              return CircularProgressIndicator();
            },
          ),
        );
      }
    
      // used by StreamBuilder
      Stream _stopwatch() async* {
        while (true) {
          await Future.delayed(Duration(seconds: 1));
          yield _count++;
        }
      }
    }
    

提交回复
热议问题