Flutter/Dart - 加载未来的 CircularProgressIndicator 的透明背景?
Flutter/Dart - Transparent Background to CircularProgressIndicator on a Loading Future?
目前,当我滑动到新路线时,我得到一个带有旋转 CircularProgressIndicator
的白色背景。新路由有一个 Future
从 HTTP 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();
},
);
}
目前,当我滑动到新路线时,我得到一个带有旋转 CircularProgressIndicator
的白色背景。新路由有一个 Future
从 HTTP 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();
},
);
}