Flutter/Dart - 加载未来的 CircularProgressIndicator 的透明背景?

Flutter/Dart - Transparent Background to CircularProgressIndicator on a Loading Future?

目前,当我滑动到新路线时,我得到一个带有旋转 CircularProgressIndicator 的白色背景。新路由有一个 FutureHTTP Post 获取数据。相反,我希望原始页面的背景保留在微调器后面,直到未来完成并发生过渡。那么如何使微调器的背景透明而不是白色呢?这是未来的代码,我假设它是微调器被触发的地方;

FutureBuilder<List<ReplyContent>> replyStage({String replyid, String replytitle}) {
  return new FutureBuilder<List<ReplyContent>>(
    future: downloadReplyJSON(),
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        List<ReplyContent> replycrafts = snapshot.data;
        return StageBuilderVR(replycrafts, replytitle);
      } else if (snapshot.hasError) {
        return Text('${snapshot.error}');
      }
      return CircularProgressIndicator();
    },
  );
}

这是滑动到未来的代码;

onSwipeUp: () {
Navigator.of(context).push(_createRoute());
}

以及 PageRouteBuilder 的代码:

Route _createRoute() {
  return PageRouteBuilder(
    opaque: false,
    pageBuilder: (context, animation, secondaryAnimation) => ReplyHome(),
    transitionsBuilder: (context, animation, secondaryAnimation, child) {
      var begin = Offset(0.0, 1.0);
      var end = Offset.zero;
      var curve = Curves.ease;

      var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));

      return SlideTransition(
        position: animation.drive(tween),
        child: child,
      );
    },
  );
}

您可以使用 showDialog 打开一个对话框,该对话框将使用 AlertDialog 打开透明背景,您可以 return 您自己的有状态小部件。而不是 streamBuilder 只需使用 future Builder。

试试下面的代码:

void uploadAndShowProgress() async {
    await showDialog(
      context: context,
      builder: (context) {
        return StreamBuilder(
          stream: uploadFile(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              StorageTaskEvent event = snapshot.data;
              final _snapshot = event.snapshot;
              _progress = _snapshot.bytesTransferred / _snapshot.totalByteCount;
            } else {
              //*  pop when there's no data or error...
              Navigator.pop(context);
            }

            if (snapshot.hasError) {
              SnackbarWidget.showSnackbar(
                  content: Text(snapshot.error.toString()), context: context);
            }

            return AlertDialogWidget(progress: _progress);
          },
        );
      },
    );
  }
Stack(
      children: <Widget>[
        Opacity(
          opacity: _isLoading ? 1.0 : 0, 
          child: CircularProgressIndicator(),
        ),
      ],
    );

该函数推送透明背景路由

onPressed: () {
                    Navigator.of(context).push(
                      PageRouteBuilder(
                        opaque: false,
                        pageBuilder: (_, __, ___) {
                          return MyTransperentRoute();
                        },
                      ),
                    );
                  }

因此,在您的 CircularProgressIndicator 页面中,您可以更改根 Widget 的背景颜色,如 color: Colors.transperent 或没有任何颜色设置的普通 Container 将达到您需要的效果


class MyTrnsperentPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: const Center(
        child: CircularProgressIndicator(),
      ),
    );
  }
}

查看 dartpad 上的工作代码 here

最后,我创建了一个虚拟页面,它以图形方式反映了前一页的所有图形元素以及代码的 none。我用它代替了 CircularProgressIndicator。我不知道它是否理想,但它似乎工作得很好。

FutureBuilder<List<ReplyContent>> replyStage({String replyid, String replytitle}) {
  return new FutureBuilder<List<ReplyContent>>(
    future: downloadReplyJSON(),
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        List<ReplyContent> replycrafts = snapshot.data;
        return StageBuilderVR(replycrafts, replytitle);
      } else if (snapshot.hasError) {
        return Text('${snapshot.error}');
      }
      return DummyPage();
    },
  );
}