如何使用Flutter StreamBuilder重试错误?

Ozy*_*mas 2 flutter

我有一个StreamBuilder对象来呈现FireStore集合中的列表:

Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
    stream: Firestore.instance.collection('posts').snapshots(),
    builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
        switch (snapshot.connectionState) {
            default:
            return new ListView(
            children:
            snapshot.data.documents.map((DocumentSnapshot document) {
                return Post(document: document);
            }).toList());
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使其,如果snapshot.hasError,则StreamBuilder会再次尝试。我怎样才能做到这一点?

bof*_*mer 6

通常,您应该始终结合StreamBuilder有状态的小部件。否则,每次build调用该方法时都将重新创建流。

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Stream<QuerySnapshot> postsStream;

  @override
  void initState() {
    super.initState();
    postsStream = Firestore.instance.collection('posts').snapshots();
  }

  void retryLoad() {
    setState(() {
      postsStream = Firestore.instance.collection('posts').snapshots();
    })
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: postsStream,
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasError) {
          return RaisedButton(
            child: Text('Retry'),
            onPressed: retryLoad,
          );
        }
        // ...
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)