【问题标题】:How am i able to retrieve specific users data using StreamBuilder?如何使用 StreamBuilder 检索特定用户数据?
【发布时间】:2020-09-24 22:09:43
【问题描述】:

1) 这是查看团队/查看花名册屏幕。 https://imgur.com/a/k63lQrt

  class ViewTeamScreen extends StatelessWidget {
  static const routeName = '/view-team';
  const ViewTeamScreen({Key key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return StreamProvider<List<User>>.value(
      value: DBService().getAllUsers,
      child: Scaffold(
        body: TeamList()
      ),
    );
  }
}

2) 这是在 ViewTeamScreen 上显示所有用户数据并返回我创建的 TeamTile 小部件的团队列表代码。

class TeamList extends StatefulWidget {
  @override
  _TeamListState createState() => _TeamListState();
}

class _TeamListState extends State<TeamList> {
  @override
  Widget build(BuildContext context) {
    final users = Provider.of<List<User>>(context) ?? [];
    //print(users);

    return ListView.builder(
      itemCount: users.length,
      itemBuilder: (context, index) {
        return TeamTile(
          user: users[index],
        );
      },
    );

3) 这是 TeamTile,一旦团队成员注册应用,它就会返回 ListViewBuilder。

class TeamTile extends StatelessWidget {
  final User user;
  TeamTile({this.user});

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.only(top: 8.0),
      child: Card(
        margin: EdgeInsets.fromLTRB(20, 6, 20, 0),
        child: ListTile(
          leading: CircleAvatar(
            radius: 30.0,
            backgroundColor: Colors.brown,
          ),
          title: Text(
            '${user.firstName}'
            " "
            '${user.lastName}', //how do i make the first letter of name always CAPS?
            style: TextStyle(fontSize: 23, letterSpacing: 1.0),
          ),
          trailing: Text(user.email),
          subtitle: Text('+44 0000 000 000'),
          onTap: () async {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => TeamDetailScreen(),
              ),
            );
          },
        ),

4) 这是团队详情屏幕,一旦用户点击 ViewTeamScreen 中的 ListTile,就会出现此页面。 https://imgur.com/a/7tSUO1c

class TeamDetailScreen extends StatelessWidget {
  @override
Widget build(BuildContext context) {
    final user = Provider.of<User>(context);
    return Scaffold(
      appBar: AppBar(
        title: Text('Employee Contact Info'),
      ),
      body: StreamBuilder<User>(
        stream: DBService(uid: user.uid).usersData,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            User userData = snapshot.data;

            return Column(children: <Widget>[
              Expanded(
                  child: Padding(
                padding: const EdgeInsets.all(8.0),
                child: Text(
                  'Name: ${userData.firstName}'
                  " "
                  '${userData.lastName}\n'
                  'Email: ${userData.email}',
                  style: TextStyle(fontSize: (20)),
                ),
              )),
            ]);
          } else {
            return Loading();

【问题讨论】:

  • 请您进一步澄清这个问题,我仍然对您要完成的工作或问题是什么感到有些困惑。
  • @Unbreachable 嗨,是的,我面临的问题是,一旦我单击这张图片中的 ListTile imgur.com/a/k63lQrt ,我希望能够在屏幕上显示用户详细信息,但我只能访问它登录用户名,电子邮件等。我不知道我还能扩展多少对不起。
  • 谢谢,能把剩下的代码贴出来吗? “名册页面”,您需要将每个索引从“名册页面”传递到“详细信息屏幕”
  • @Unbreachable 当然,您好,很抱歉我刚刚更新了代码并包含了所有相关文件,所以也许您可以了解应用程序的结构。谢谢您的任何帮助将不胜感激! - 我已经坚持了好几个小时了
  • 点击列表磁贴后尝试将用户数据添加到流中..

标签: firebase flutter dart google-cloud-firestore firebase-authentication


【解决方案1】:

这将排除 StreamProvider 并仅使用 StreamBuilder。这个概念很容易理解,因为我们所做的只是将 widget.index 作为参数传递给其他 Widget。

1

class ViewTeamScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<List<User>>(
        stream: DBService().getAllUsers,
        builder: (context, snapshot) {

          if (snapshot.hasData) {
            List<User> userData = snapshot.data;

            return Scaffold(body: TeamList(myData: userData));
          } else {
            return Loading();
          }
        });
  }
}

2

 class TeamList extends StatefulWidget {
      final List<User> myData;

      TeamList({this.myData});

      @override
      _TeamListState createState() => _TeamListState();
    }

    class _TeamListState extends State<TeamList> {
      @override
      Widget build(BuildContext context) {
        return ListView.builder(
          itemCount: widget.myData.length,
          itemBuilder: (context, index) {
            return TeamTile(
              usersInfo: widget.myData[index],
            );
          },
        );
      }
    }

3

class TeamTile extends StatelessWidget {
  final User usersInfo;
  TeamTile({this.usersInfo});

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.only(top: 8.0),
      child: Card(
        margin: EdgeInsets.fromLTRB(20, 6, 20, 0),
        child: ListTile(
          leading: CircleAvatar(
            radius: 30.0,
            backgroundColor: Colors.brown,
          ),
          title: Text(
            '${usersInfo.firstName}'
            " "
            '${usersInfo.lastName}', //how do i make the first letter of name always CAPS?
            style: TextStyle(fontSize: 23, letterSpacing: 1.0),
          ),
          trailing: Text(usersInfo.email),
          subtitle: Text('+44 0000 000 000'),
          onTap: () async {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => TeamDetailScreen(myDetails: usersInfo),
              ),
            );
          },
        ),
      ),
    );
  }
}

4

 class TeamDetailScreen extends StatelessWidget {
      final User myDetails;
      TeamDetailScreen({this.myDetails});

      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(),
          body: Column(children: <Widget>[
            Expanded(
                child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: Text(
                'Name: ${myDetails.firstName}'
                " "
                '${myDetails.lastName}\n'
                'Email: ${myDetails.email}',
                style: TextStyle(fontSize: (20)),
              ),
            )),
          ]),
        );
      }
    }

【讨论】:

  • 非常感谢@Unreachable 这就像一个魅力我没有意识到你可以通过streambuilder传递这样的数据并使用streamprovider过度复杂化它现在更有意义了!感谢您的帮助,如果没有您的帮助,我无法解决这个问题:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多