Flutter:void方法内无法更新变量值,StatefulBuilder无效
问题原因及解决方案
核心问题
你的代码存在两个关键问题导致变量type不更新且Firestore写入无效:
showDialog是异步操作,后续代码同步执行:弹出对话框后,代码不会等待用户选择就直接执行FirebaseFirestore.update,此时type还是初始空字符串,根本没被用户选择修改。- Firestore更新逻辑位置错误:更新数据库的代码不应该放在对话框外部,而应该放在用户点击按钮的回调里,确保拿到用户选择的
type值后再执行写入。
修正后的代码
class HomeScreen extends StatefulWidget { const HomeScreen({super.key}); @override State<HomeScreen> createState() => _HomeScreenState(); } class _HomeScreenState extends State<HomeScreen> { final user = FirebaseAuth.instance.currentUser; String type = ""; void checkUser() async { // 统一用async/await替代then,逻辑更清晰 final documentSnapshot = await FirebaseFirestore.instance .collection('users') .doc(user!.uid) .get(); if (documentSnapshot.exists) { final res = documentSnapshot.data() as Map<String, dynamic>; if (res["type"] == "Salarié") { print('Salarié'); setState(() { type = "Salarié"; }); } else if (res["type"] == "Auto entrepreneur") { print('Auto entrepreneur'); setState(() { type = "Auto entrepreneur"; }); } else { // 等待用户在对话框中的选择结果 final selectedType = await showDialog<String>( context: context, builder: (_) => AlertDialog( title: const Text('Choissisez votre type'), content: const Text('Choisir votre type de user'), actions: <Widget>[ TextButton( onPressed: () { Navigator.pop(context, "Salarié"); }, child: const Text('Salarié'), ), TextButton( onPressed: () { Navigator.pop(context, "Auto entrepreneur"); }, child: const Text('Auto-entrepreneur'), ), ], ), ); // 确认用户选择了有效选项 if (selectedType != null) { setState(() { type = selectedType; }); // 更新Firestore数据库 await FirebaseFirestore.instance .collection("users") .doc(user!.uid) .update({ "type": type, }); } } } } @override void initState() { super.initState(); checkUser(); } @override Widget build(BuildContext context) { return Scaffold(/* 你的原有代码 */); } }
关键修改点
- 移除
StatefulBuilder:这里不需要用StatefulBuilder,因为对话框不需要自身状态更新,只需要返回用户选择的结果即可。 - 等待对话框结果:用
await获取showDialog的返回值,确保拿到用户选择的类型后再执行后续逻辑。 - 将Firestore更新移到选择回调后:只有当用户确认选择后,才更新
type变量并写入数据库。 - 统一使用
async/await:避免async和then混用导致的逻辑混乱,代码可读性更强。
内容的提问来源于stack exchange,提问作者Fedy Belaid
相关产品推荐
相关产品推荐

