Firebase数据获取并在Fragment的TextView展示逻辑问题及代码不可达语句报错求助
Firebase数据获取并在Fragment的TextView展示逻辑问题及代码不可达语句报错求助
嘿,我来帮你梳理下问题哈!首先你遇到的「不可达语句」报错是最容易解决的,咱们先搞定这个,再优化Firebase数据展示的逻辑。
一、先解决「不可达语句」报错
你看你在onCreateView方法里,写完return binding.getRoot();之后才去初始化auth和设置数据库监听——return语句会直接结束当前方法,后面的代码根本没机会执行,所以编译器就提示“不可达语句”了。
把return语句移到方法的最后就行,调整后这部分的代码顺序应该是:
@Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { binding = FragmentHomeBinding.inflate(inflater, container, false); // 把所有初始化、监听逻辑放在return之前 auth = FirebaseAuth.getInstance(); DatabaseReference mRef = FirebaseDatabase.getInstance().getReference("users"); mRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { FirebaseUser currentUser = auth.getCurrentUser(); // 先判断用户是否登录,避免空指针 if (currentUser != null) { String id = currentUser.getUid(); if (snapshot.child(id).exists()) { UserHelperClass userHelper = snapshot.child(id).getValue(UserHelperClass.class); // 再判断userHelper是否解析成功,避免空指针 if (userHelper != null) { binding.tvGetUser.setText("Hi, " + userHelper.getUname() + "!"); } else { binding.tvGetUser.setText("Hi there!"); } } else { binding.tvGetUser.setText("Hi there!"); } } } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(getActivity(), "数据加载失败:" + error.getMessage(), Toast.LENGTH_SHORT).show(); } }); // 最后再返回视图 return binding.getRoot(); }
二、Firebase数据获取的逻辑优化
除了代码顺序问题,还有几个点可以优化,避免潜在的崩溃和逻辑漏洞:
- 空安全检查:你原来的代码直接调用
auth.getCurrentUser().getUid(),如果用户在这个瞬间登出了,会抛出空指针异常,所以要先判断currentUser是否为空 - 监听类型选择:如果只需要获取一次用户数据(不需要实时监听用户信息变化),可以用
addListenerForSingleValueEvent代替addValueEventListener,减少不必要的数据库监听开销 - 错误提示优化:把
onCancelled里的提示改成包含错误信息的内容,方便调试 - 视图初始化时机:你在
onViewCreated里做了登录检查和按钮点击监听,这部分是没问题的,但要注意如果用户在onCreateView之后才登出,checkIfLoggedIn已经执行过了,不过你这个逻辑是启动页的跳转,影响不大
三、TextView的布局代码确认
你的TextView布局是没问题的,只要tvGetUser的id和绑定类里的对应上,修正代码后就能正常显示内容啦。
备注:内容来源于stack exchange,提问作者koocuddles
相关产品推荐
相关产品推荐

