【问题标题】:Retrieving Firebase data and assigning it to variables检索 Firebase 数据并将其分配给变量
【发布时间】:2023-03-31 19:20:01
【问题描述】:

目前我正在尝试从我的 Firebase 数据中检索数据,然后我将使用这些数据在 onCreate() 方法中帮助创建我的导航抽屉。

在我使用的 Mike Penz 的 Material Drawer library 中,有一个选项可以指定 AccountHeader 的名称和电子邮件等帐户信息,因此我尝试在创建之前从 Firebase 数据库中的用户表中检索这些详细信息导航抽屉。

不幸的是,使用 addValueEventListener()addListenerForSingleValueEvent() 不能满足我的需要,因为变量(userEmail、userRole、userName)仅在创建导航抽屉后才被赋值。

if(authData != null) {
        firebase.child("users").child(authData.getUid()).addValueEventListener(new ValueEventListener() {

            @Override
            public void onDataChange(DataSnapshot 
                Users user = snapshot.getValue(Users.class);                    
                userEmail = authData.getProviderData().get("email").toString();
                userRole = user.getRole();
                if (user.getFirstName() != null && user.getLastName() != null) {
                    userName = user.getFirstName() + " " + user.getLastName();
                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {
                System.out.println("The read failed: " + firebaseError.getMessage());
            }
        });

我已经在这个 addValueEventListener 方法中和在这个方法之后记录了变量的值,所以我知道这些变量正在检索值,但只有在我的导航抽屉创建之后而不是之前。

希望我已经提供了足够的信息,以便有人能够帮助我解决这个问题,如果我没有让我知道你在 cmets 中需要什么。

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    我假设您在询问如何在创建后将项目添加到 Drawer。即使在创建之后,也可以更新删除添加项目到Drawer。欲了解更多信息,请点击此处https://github.com/mikepenz/MaterialDrawer#modify-items-or-the-drawer

    编辑:

        AccountHeader header = new AccountHeaderBuilder()
                .withActivity(this)
                .withHeaderBackground(R.drawable.header)
                .withOnAccountHeaderListener(new AccountHeader.OnAccountHeaderListener() {
                    @Override
                    public boolean onProfileChanged(View view, IProfile profile, boolean current) {
                        //Handle Profile changes
                        return false;
                    }
                })
                .build();
    
        Drawer drawer = new DrawerBuilder()
                .withActivity(this)
                .withToolbar(toolbar)
                .withAccountHeader(header)
                .addDrawerItems(
                        new DividerDrawerItem(),
                        new SecondaryDrawerItem().withName(R.string.drawer_item_settings),
                        new SecondaryDrawerItem().withName(R.string.drawer_item_about)
                )
                .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
                    @Override
                    public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
                        // Handle clicks
                        return true;
                    }
                })
                .build();
    
        //Later
        header.addProfile(new ProfileDrawerItem().withIcon(bitmap).withName(name).withEmail(email), 0);
    

    这是如何工作的?

    【讨论】:

    • 不,我问在创建导航抽屉之前如何加载 Firebase 数据。
    • 在实际创建抽屉之前,您不应等待网络调用。最好先创建 Drawer,然后在从 Firebase 加载数据后更新并向 Drawer 添加更多项目。
    • 导航抽屉建好后是否可以添加AccountHeader?为什么在制作抽屉之前不能检索数据?似乎没有使用addValueEventListener()addListenerForSingleValueEvent() 就无法检索数据
    • 试试这个;添加一个AccountHeader,没有Profile。然后在 Firebase 数据之后,将用户配置文件添加到标题中。 (或虚拟配置文件,首先说出应用程序的名称、图标和开发人员,然后在可用时说出真实数据)
    • "...为什么不能在抽屉制作完成之前检索数据?" - 因为网络呼叫与用户的网络速度一样快......可能永远不会加载或需要很长时间。但是尝试一下,看看应用程序是否可以正常运行,假设用户在加载他/她的信息之前不需要Drawer
    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2018-09-03
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多