flutter - 如何在 Flutter 中实现 CircularProgressIndicator
问题描述
我在等待用户完成身份验证过程时尝试实现 CircularProgressIndicator,这是代码,我使用 Firebase 作为身份验证后端
Future<void> signIn() async {
if (_formKey.currentState.validate()) {
new Loading();
_formKey.currentState.save();
try {
final user = await FirebaseAuth.instance
.signInWithEmailAndPassword(email: _email, password: _password);
if (user != null) {
final FirebaseUser user = await auth.currentUser();
print('success login');
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => Home(user: user),
));
}
} catch (e) {
print(e);
}
}
}
如何在代码中实现循环进度指示器?
解决方案
CircularProgressIndicator 可以在带有条件的 UI 中实现。如果你想在页面的某个区域实现它,你可以使用 boolean 使其像这样工作:
bool showCircular = false;
Future<void> signIn() async {
if (_formKey.currentState.validate()) {
new Loading();
_formKey.currentState.save();
setState(() {
showCircular=true;
});
try {
final user = await FirebaseAuth.instance
.signInWithEmailAndPassword(email: _email, password: _password);
if (user != null) {
final FirebaseUser user = await auth.currentUser();
setState(() {
showCircular=false;
});
print('success login');
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => Home(user: user),
));
}
} catch (e) {
print(e);
}
}
}
现在在你的 UI 中的任何地方添加这个小部件:
showCircular ? CircularProgressIndicator() : SizedBox(),
推荐的方法是使用AlertDialog来显示进度指示器。这是 AlertDialog 的示例。要打开对话框,您需要上下文,因此将 BuildContext 作为参数并调用 signIn(context); 从登录按钮。我们将使用openLoadingDialog函数调用对话框,当登录完成后,我们将使用Navigator.of(context).pop()弹出它 ;
Future<void> signIn(BuildContext context) async {
if (_formKey.currentState.validate()) {
new Loading();
_formKey.currentState.save();
openLoadingDialog(context, 'Signing In...');
try {
final user = await FirebaseAuth.instance
.signInWithEmailAndPassword(email: _email, password: _password);
if (user != null) {
final FirebaseUser user = await auth.currentUser();
Navigator.of(context).pop();
print('success login');
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => Home(user: user),
));
}
} catch (e) {
print(e);
}
}
}
将此对话框粘贴到应用程序的任何位置。您可以通过传递要显示的上下文和消息来调用它。
openLoadingDialog(BuildContext context, String text) {
showDialog(
context: context,
barrierDismissible: false,
builder: (context) => AlertDialog(
content: Row(children: <Widget>[
SizedBox(
width: 30,
height: 30,
child: CircularProgressIndicator(
strokeWidth: 1,
valueColor: AlwaysStoppedAnimation(Colors.black)
)
),
SizedBox(width: 10),
Text(text)
]),
)
);
}
推荐阅读
- python - 如何从 csv 标题行获取周数和星期几,然后附加值
- python - 无法在 jupyter notebook 中安装模块
- c# - 使用从 C# DLL 获取 PS 脚本名称?获取“对象引用未设置为对象的实例。”
- nearprotocol - 如何测试 NEAR 是否被转移?
- reactjs - 我可以通过组件列表进行映射吗?
- c# - WPF DataGrid:使用 GongSolutions.WPF.DragDrop 重新排序和编辑行
- x86 - Intel的xHC如何寻址USB设备以及如何知道设备是USB2还是USB3?
- bash - 如何编写“gpg --edit-key”操作脚本?
- javascript - 如何从应用程序控制器调用 Rails 控制器方法作为 js 请求?
- java - Netbeans 平台开发 Java 语言对嵌入式语言的支持