Kivy二次跳转single_chat屏幕报不存在该屏幕错误如何解决
问题原因
报错的核心原因是你覆盖了Screen类自带的name属性。
Kivy的ScreenManager是靠每个Screen实例的name属性匹配、查找屏幕的,这个值是屏幕注册时就固定的唯一标识,不能随意修改。你在SingleChat类里把name定义成了可变的StringProperty,还在on_pre_enter生命周期里把它赋值成了聊天对象的用户名:第一次跳转到单聊页时,屏幕初始name是single_chat,跳转成功后on_pre_enter触发,直接把这个屏幕的name改成了当前聊天的用户名,等于把屏幕在ScreenManager里的注册名改没了。等你第二次跳转时,ScreenManager再找叫single_chat的屏幕自然找不到,直接抛异常。
修复方法
- 不要占用Screen自带的
name属性存业务数据- 给SingleChat设置固定的name值为
single_chat,全程不要修改 - 单独定义一个新的属性(比如
chat_target)存当前聊天对象的用户名,替换原来所有用self.name取聊天对象的逻辑
修改后的SingleChat核心代码如下:
- 给SingleChat设置固定的name值为
class SingleChat(Screen): # 屏幕标识固定,不要动态修改 name = "single_chat" # 单独定义属性存聊天对象 chat_target = StringProperty("") chat_input = ObjectProperty(None) def on_pre_enter(self, *args): # 赋值给业务属性,不要改self.name self.chat_target = self.manager.get_screen("directory").ids.message.text def send(self): # ...省略其他原有逻辑... # 原来判断self.name的地方换成self.chat_target for i in chat_download: client_one = chat_download[i]['clients']["client_one"] client_two = chat_download[i]['clients']["client_two"] if self.chat_target == client_one or self.chat_target == client_two and new_user == client_two or new_user == client_one: # ...省略后续发消息逻辑...
- 额外优化建议
你的message_list方法每次调用都会往self.ids.chat里重复添加聊天项组件,建议每次调用前先清空容器内已有组件,避免出现重复的聊天条目。
内容的提问来源于stack exchange,提问作者Olaniyi Philip
相关产品推荐
相关产品推荐

