当前位置: 首页 > 知识库问答 >
问题:

如何将数据传递出onDataChange方法?[副本]

翟越
2023-03-14

我有一个布尔设置,以检查应用程序中的重复用户名。我希望boolean根据ValueEventListener中onDataChange的结果返回数据。以下是我所拥有的:

private boolean isUsernameValid(final String username) {


    mReference = FirebaseDatabase.getInstance().getReference();
    Query query = mReference.child("users").child(username);
    ValueEventListener mListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {

                //create condition that would make isUsernameValid return false

            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    };

    mReference.addListenerForSingleValueEvent(mListener);

    return //if that condition is not met;
}

共有1个答案

劳研
2023-03-14

如果您尝试这样做,您将始终返回false,因为Firebase是异步的,您将需要根据您的连接等待一点,以便返回datasnapshot()中的任何值

private boolean isUsernameValid(final String username) {

        boolean isUsernameValid;
        mReference = FirebaseDatabase.getInstance().getReference();
        Query query = mReference.child("users").child(username);
        ValueEventListener mListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {

                    //create condition that would make isUsernameValid return false
                     isUsernameValid = true;
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        };

        mReference.addListenerForSingleValueEvent(mListener);

        return isUsernameValid //if that condition is not met;
    }

要解决这个问题,您可以创建一个接口,当我们知道有来自ondatachange()的结果时,该接口将立即激发,然后您可以从那里返回任何内容

首先创建一个接口

public interface FirebaseSuccessListener {

    void onDataFound(boolean isDataFetched);

}
private void isUsernameValid(final String username, FirebaseSuccessListener dataFetched) {


            mReference = FirebaseDatabase.getInstance().getReference();
            Query query = mReference.child("users").child(username);
            ValueEventListener mListener = new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if (dataSnapshot.exists()) {

                        //here we are telling to our interface that the data has been found and then we can do anything with it outside this method
                         dataFetched.onDataFound(true);
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            };

            mReference.addListenerForSingleValueEvent(mListener);


        }
isUsernameValid.(new FirebaseSuccessListener() {
    @Override
    public void onCallback(boolean isDataFetched) {
        if(isDataFetched){
           //you know the value is true, here you can update or request any change for example you can do this 
            userIsOnFirebase(true);

      }else{
      userIsOnFirebase(false);
      }
    }
});


private boolean userIsOnFirebase(boolean isOnFirebase){
return isOnFirebase;
}
 类似资料:
  • 很新的反应。。。 我试图循环我的this.props.children,以便向他们传递一个在我的父项中定义的字符串。。。在没有在render方法中定义这些子对象的情况下,这是可能的吗? OwnRenderer应该将道具字符串传递给它的所有子级。。。OwnRenderer不知道要渲染哪个孩子,因此无法通过“”直接传递道具。。。 我试着绕过孩子们直接传递那根绳子,但不幸的是,这不起作用。 不知怎的,它

  • 在下面的代码中,我希望将'races.class'作为参数传递给方法'get allraces()'。我该怎么做?

  • 在控制器中(也可能是Main或另一个文件,我不确定这一切是如何工作的),我们有以下内容: 在Scene Bilder生成的FXML中,如下所示:

  • 我有一堆像这样的路由: 我正在使用通过对象访问路由信息。我想随时知道我在哪个“区域”。目前,我可以通过查看路由是否以某个值开始(例如“/users”)来实现这一点,但这似乎有点骇人听闻。当我定义每条路线时,我希望能够传递额外的信息——在本例中是区域信息?或者也许有更好的方法?

  • 当我点击它时,它会显示模态弹出 我想做的是以某种方式获取内容,显示使用用户编辑。我知道我可以在href上使用javascript设置一些变量,但我想知道是否有更好的方法。