You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy+Firebase注册登录:页面跳转与错误提示实现求助

解决方案

1. 注册成功跳转页面 + 错误信息提示

要实现页面跳转和错误提示,核心是让Firebase操作类能访问Kivy的ScreenManager和UI控件。以下是具体修改:

修改loginsignup.py的MyFirebaseSignup类

class MyFirebaseSignup:
    def __init__(self, app):
        self.app = app  # 保存App实例,用于访问页面管理器和UI

    def sign_up(self, username, email, password):
        try:
            user = auth.create_user_with_email_and_password(email, password)
            data = {"email": email, "password": password, "idToken": True}
            info = auth.get_account_info(user["idToken"])
            auth.send_email_verification(user["idToken"])
            print("Successfully created account")
            # 跳转至login页面
            self.app.root.transition.direction = "left"
            self.app.root.current = "login"
        except Exception as e:
            # 解析Firebase返回的具体错误信息
            error_msg = self._parse_firebase_error(e)
            print(error_msg)
            # 找到signup页面的错误标签并设置文本
            signup_screen = self.app.root.get_screen("signup")
            signup_screen.ids.signup_message.text = error_msg

    def _parse_firebase_error(self, e):
        # 解析Firebase返回的JSON格式错误
        import json
        try:
            error_data = json.loads(e.args[1])
            return error_data["error"]["message"]
        except:
            return "注册失败,请检查输入内容"

修改App的build方法

将当前App实例传入Firebase操作类,让它能访问页面管理器:

def build(self):
    screen_manager = ScreenManager()
    screen_manager.add_widget(Builder.load_file("main.kv"))
    screen_manager.add_widget(Builder.load_file("signup.kv"))
    screen_manager.add_widget(Builder.load_file("login.kv"))
    screen_manager.add_widget(Builder.load_file("forgotpassword.kv"))
    screen_manager.add_widget(Builder.load_file("profile.kv"))
    self.my_firebasesignup = MyFirebaseSignup(self)  # 传入App实例
    self.my_firebaselogin = MyFirebaseLogin(self)
    return screen_manager

修正signup.kv的按钮调用(移除多余参数)

Button:
    text: "SIGNUP"
    on_release:
        print("Sign up", login_email.text, login_password.text)
        app.my_firebasesignup.sign_up(login_username.text,login_email.text,login_password.text)

2. 登录模块复用相同逻辑

对登录模块做镜像修改,实现跳转至profile页面和错误提示:

修改MyFirebaseLogin类

class MyFirebaseLogin():
    def __init__(self, app):
        self.app = app

    def Login(self, email, password):
        try:
            login = auth.sign_in_with_email_and_password(email, password)
            info = auth.get_account_info(login["idToken"])
            print("Successfully Logged in")
            # 跳转至profile页面
            self.app.root.transition.direction = "left"
            self.app.root.current = "profile"
        except Exception as e:
            error_msg = self._parse_firebase_error(e)
            print(error_msg)
            # 找到login页面的错误标签并设置文本
            login_screen = self.app.root.get_screen("login")
            login_screen.ids.login_message.text = error_msg

    def _parse_firebase_error(self, e):
        import json
        try:
            error_data = json.loads(e.args[1])
            return error_data["error"]["message"]
        except:
            return "登录失败,请检查账号密码"

修正login.kv的布局错误

原代码中login_message标签嵌套了TextInput,会导致UI异常,调整为:

<LoginScreen>:
MDScreen:
    name: "login"
    id: login
    MDFloatLayout:
        MDLabel:
            text: "Sign in to continue"
        MDLabel:
            id: login_message
            color: (1,0,0,1)
        MDFloatLayout:
            TextInput:
                id: login_email
                hint_text: "Email"
                multiline: False
        MDFloatLayout:
            TextInput:
                id: login_password
                hint_text: "Password"
                multiline: False
                password: True
        Button:
            text: "LOGIN"
            on_release:
                print("Sign in", login_email.text, login_password.text)
                app.my_firebaselogin.Login(login_email.text,login_password.text)
        MDTextButton:
            text: "Forgot Password?"
            on_release:
                root.manager.transition.direction = "left"
                root.manager.current = "forgotpassword"
        MDLabel:
            text: "Don't have an account?"
        MDTextButton:
            text: "Sign up"
            on_release:
                root.manager.transition.direction = "left"
                root.manager.current = "signup"

核心逻辑说明

  • 页面跳转:通过self.app.root获取ScreenManager实例,修改current属性切换页面,transition.direction控制动画方向。
  • 错误提示:捕获Firebase异常并解析JSON格式的错误信息,通过get_screen获取目标页面,再通过ids访问对应标签控件设置文本。
  • 复用性:注册和登录模块的错误解析逻辑完全一致,可抽取为公共工具函数进一步简化代码。

内容的提问来源于stack exchange,提问作者pebs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:35:29