You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何给Flutter带实时更新的Stateful Widget传入用户ID参数

如何给实时更新的Stateful Widget添加用户ID参数

我刚开始用Firestore,同时在学Flutter和Dart。我写了两个展示users集合中用户年龄的Widget:

  • 一个Stateless Widget可以接收用户ID参数,但没法处理实时数据更新
  • 一个Stateful Widget能处理实时更新,但不知道怎么改才能让它也接收用户ID参数
    我参照Stateless Widget的写法改Stateful Widget没成功,应该是缺乏相关实践经验,求帮忙。

原代码

无状态组件代码

class GetAge extends StatelessWidget {
  final String documentId;

  const GetAge(this.documentId);

  @override
  Widget build(BuildContext context) {
    CollectionReference users =
        FirebaseFirestore.instance.collection('Users');

    return FutureBuilder<DocumentSnapshot>(
      future: users.doc(documentId).get(),
      builder:
          (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
        if (snapshot.hasError) {
          return const Text("Something went wrong");
        }

        if (snapshot.hasData && !snapshot.data!.exists) {
          return const Text("Document does not exist");
        }

        if (snapshot.connectionState == ConnectionState.done) {
          Map<String, dynamic> data =
              snapshot.data!.data() as Map<String, dynamic>;
          return Text('Age : ${data['age']} €');
        }

        return const Text("loading");
      },
    );
  }
}

有状态组件代码

class getAgeRT extends StatefulWidget {
  const getAgeRT({super.key});

  @override
  State<getAgeRT> createState() => _getAgeRTState();
}

class _getAgeRTState extends State<getAgeRT> {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>(
        stream: FirebaseFirestore.instance
            .collection('Users')
            .doc('User1')
            .snapshots(),
        builder: (BuildContext context,
            AsyncSnapshot<DocumentSnapshot<Map<String, dynamic>>> snapshot) {
          if (snapshot.hasError) {
            return const Text('Something went wrong');
          }

          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Text("Loading");
          }

          Map<String, dynamic> data =
              snapshot.data!.data() as Map<String, dynamic>;
          return Text(" age :  ${data['age']} ");
        });
  }
}

解决方案

要给Stateful Widget添加参数,核心是在StatefulWidget类中定义参数,然后在对应的State类里通过widget.参数名访问。具体修改如下:

修改后的完整代码

class GetAgeRT extends StatefulWidget {
  // 1. 添加documentId参数,标记为final
  final String documentId;

  // 2. 构造函数初始化参数,同时传递key
  const GetAgeRT({super.key, required this.documentId});

  @override
  State<GetAgeRT> createState() => _GetAgeRTState();
}

class _GetAgeRTState extends State<GetAgeRT> {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>(
        // 3. 使用widget.documentId替换硬编码的User1
        stream: FirebaseFirestore.instance
            .collection('Users')
            .doc(widget.documentId)
            .snapshots(),
        builder: (BuildContext context,
            AsyncSnapshot<DocumentSnapshot<Map<String, dynamic>>> snapshot) {
          if (snapshot.hasError) {
            return const Text('Something went wrong');
          }

          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Text("Loading");
          }

          // 新增文档不存在的判断,和无状态组件保持一致
          if (!snapshot.data!.exists) {
            return const Text("Document does not exist");
          }

          Map<String, dynamic> data =
              snapshot.data!.data() as Map<String, dynamic>;
          return Text(" age :  ${data['age']} ");
        });
  }
}

使用方式

调用时和无状态组件一样传入用户ID即可:

GetAgeRT(documentId: '你的用户ID')

内容的提问来源于stack exchange,提问作者Crapul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:35:39