如何“重试”构建?

Lan*_*dra 3 dart flutter

我正在创建一个应用程序,它可以恢复并显示在线存储在 mysql 主机上的 html 文本。如果快照没有任何数据,它应该重试查询并重建视图,直到它获得数据。

这就是我使用数据库中的数据创建小部件的方式:

FutureBuilder(
        future: crud_database.getDatos(url),
        builder: (context, snapshot){
          if(snapshot.hasError) print(snapshot.error);

          if( snapshot.hasData){
            return WebView(
              initialUrl: UriData.fromString(snapshot.data[0]["webhtml"], mimeType: "text/html").toString() ,
              onWebViewCreated: (WebViewController webViewController){
                _controller.complete(webViewController);
              },
            );
          }else{
            return Center(
              child: CircularProgressIndicator(),
            );
          }


        },
      )
Run Code Online (Sandbox Code Playgroud)

Pab*_*era 6

您可以使用StreamBuilder代替FutureBuilder,并创建一个方法来处理重试并使用Stream来通知 UI,如下所示:

  final _streamController = StreamController<YourData>();

  @override
  void initState() {
    super.initState();
    _fetchData();
  }

  Future _fetchData() async {
    YourData data = await crud_database.getDatos(url);
    if (data == null) {
      _streamController.sink.addError("No data, trying again");
      return await _fetchData();
    }
    _streamController.sink.add(data);
  }

  @override
  void dispose() {
    _streamController.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    body: StreamBuilder(
      stream: _streamController.stream,
      builder: (context, snapshot) {
        ...
      }
    )
  }
Run Code Online (Sandbox Code Playgroud)