Flutter - 在抽屉中打开和关闭对话框



我有一个简单的抽屉,我用drawer: CustomizedDrawer()行将其添加到主页的Scaffold中,并且抽屉只有1个ListTile可以登录或注销用户。在我的主页上,你可以打开&从左到右合上抽屉。

我正在使用Firebase身份验证。

如果已经有登录用户,我可以看到注销文本。如果单击它,我将调用AuthService类中的logOutUser方法。在这里你可以看到我的抽屉:

class CustomizedDrawer extends StatelessWidget
{
@override
Widget build(BuildContext context) {
return Drawer(
backgroundColor: Colors.white,
child: ListView(
padding: EdgeInsets.zero,
children: [
const DrawerHeader(
decoration: BoxDecoration(
color: Colors.green,
),
child: Image(
image: AssetImage("images/myimage.png"),
alignment: Alignment.center,
),
),
checkUserIsLoggedIn(context),
],
),
);
}
ListTile checkUserIsLoggedIn(context){
if(FirebaseAuth.instance.currentUser == null) {
return ListTile(
title: const Text('Login / Sign Up'),
onTap: () {
Navigator.of(context).push(MaterialPageRoute(builder: (context) => LoginScreen()));
},
);
}
else {
return ListTile(
title: const Text('Log out'),
onTap: () async {
await showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context)
{
return ProgressDialog(message: "Please wait...",);
}
);
AuthService authService = AuthService();
authService.logOutUser(context);
},
);
}
}
}

在这里,你可以在我的AuthService类中获得我的logOutUser方法:

void logOutUser(context) async{
try {
await FirebaseAuth.instance.signOut()
.catchError((errMsg){
Navigator.pop(context);
displayToastMessage("Error: " + errMsg.toString(), context);
});
//Navigator.of(context).push(MaterialPageRoute(builder: (context) => LoginScreen()));
}
catch (e){
showDialog(
context: context,
builder: (context)
{
return AlertDialog(
title: Text("Error Message"),
content: Text(e.toString()),
);
}
);
Navigator.pop(context);
}
}

我想要的是;当我单击"注销"时,我想看到我的ProgressDialog,然后注销用户,然后自动关闭对话框,然后自动打开抽屉,然后我可以看到我的主页。

关于这里的答案,我试过了。我点击"注销",它显示对话框,它注销了,但对话框没有关闭,我无法关闭抽屉。

我错过了什么?我想我的awaitasync单词有问题,但我需要帮助。。。

logOutUser函数中,只需在出现错误时关闭对话框,否则不会关闭对话框。

您可以在signOut函数之后将Navigator.pop(context)添加到try块中,如下所示:

void logOutUser(context) async {
try {
await FirebaseAuth.instance.signOut()
.catchError((errMsg){
Navigator.pop(context);
displayToastMessage("Error: " + errMsg.toString(), context);
});
Navigator.pop(context); // close dialog after sign out
Navigator.pop(context); // close drawer
}
catch (e){...}
}

使用scaffoldKey的上下文代替BuildContext来关闭showDialog((;例如:

final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();
showDialog(
context: scaffoldKey.currentContext,
barrierDismissible: false,
)

或在抽屉中使用以下代码

Navigator.pop(context);
showDialog(
context: scaffoldKey.currentContext,
barrierDismissible: false,
builder: (_) => Center(
child: Container(
height: MediaQuery.of(context).size.height * .6,
width: MediaQuery.of(context).size.width * .9,
decoration: BoxDecoration(
border: Border.all(color: Colors.black, width: .5),
borderRadius:
BorderRadius.only(topLeft: Radius.circular(0)),
color: backGroundColor),
child: Column(
children: [
Row(
children: [
SizedBox(width: MediaQuery.of(context).size.width * .3),
Text(
'My Profile',
style:
TextStyle(fontSize: 22, color: Colors.white),
),
Spacer(),
GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: Icon(
Icons.clear,
color: Colors.white,
size: 30,
)),
SizedBox(
width: 10,
)
],
),
],
),
),
));

最新更新