title: How to prevent FutureBuilder's rebuilds even its underlying future does not change
body: <p>In Flutter, I am getting unwanted rebuilds. In my case I use FutureBuilder to show a list by fetching db result, which is a future and have a dependency on query parameter. I tried to make it that FutureBuilder's future does not change if the query parameter does not change, But still the FutureBuilder's builder block is called every time. How can I make the FutureBuilder does not rebuild itself where its future does not change.</p>
  
  <p>Below is my codes, every time the MusicList2's parent widget build, MusicList2 get rebuild, its FutureBuilder get rebuild.</p>
  
  <pre><code>class MusicList2 extends StatefulWidget {
    final MusicRowActionCallback onTapItem;
    final MusicRowActionCallback onDoubleTap;
    final MusicRowActionCallback onLongPressed;
    final String facetName;
    final String facetValue;
    const MusicList2(
        {Key key,
          this.onTapItem,
          this.onDoubleTap,
          this.onLongPressed,
          this.facetName,
          this.facetValue}) : super(key: key);
    @override
    State&lt;StatefulWidget&gt; createState() {
  
      return _MusicList2State();
    }
  
  
  }
  
  class _MusicList2State extends State&lt;MusicList2&gt; {
    Future&lt;List&lt;Music&gt;&gt; loadMusicByFacet;
    @override
    Widget build(BuildContext context) {
  
      return FutureBuilder&lt;List&lt;Music&gt;&gt;(
        future:
          loadMusicByFacet,
        builder: (context, snapshot) {
          if (snapshot.data == null)
            return Center(child: CircularProgressIndicator(),);
          return ListView.builder(
            shrinkWrap: true,
            key: const ValueKey&lt;String&gt;('music-list'),
            itemCount: snapshot.data.length,
            itemBuilder: (BuildContext context, int index) {
              final random = Random();
              var i = random.nextInt(5);
              return MusicRow(
                avatarBgColor: colors[i],
                music: snapshot.data[index],
                onTap: widget.onTapItem,
                onDoubleTap: widget.onDoubleTap,
                onLongPressed: widget.onLongPressed,
              );
            },
          );
        },
      );
    }
  
    @override
    void initState() {
      super.initState();
      loadMusicByFacet = MusicsDatabaseRepository.get.getMusicsByFacet(widget.facetName, widget.facetValue);
    }
    @override
    void didUpdateWidget(MusicList2 oldWidget) {
      super.didUpdateWidget(oldWidget);
      if (oldWidget.facetValue != widget.facetValue || oldWidget.facetName != widget.facetName) {
        loadMusicByFacet = MusicsDatabaseRepository.get.getMusicsByFacet(widget.facetName, widget.facetValue);
      }
    }
  }
  </code></pre>