代码之家  ›  专栏  ›  技术社区  ›  Ricardo

Android kotlin-二级构造函数

  •  0
  • Ricardo  · 技术社区  · 7 年前

    user:FirebaseUser

    但我得到的信息是错误的:

    “授权变更有一个周期”

    class UserModel(user: FirebaseUser) {
    
        var uid: String?
        val email: String?
        val phoneNumber: String?
        val photoUrl: String
        val displayName: String?
    
        //error message: There is a cycle in the delegation change
        constructor():this() {}
    
    
        init {
            this.displayName = user.displayName
            this.email = user.email
            this.phoneNumber = user.phoneNumber
            this.photoUrl = user.photoUrl!!.toString()
            this.uid = user.uid
        }
    
    
    
        companion object {
    
            @Exclude
            val CURRENT_LOCATION = "location"
        }
    
    }
    

    我试过几种方法都没有成功。有什么帮助吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   zsmb13    7 年前

    您必须从拥有的每个二级构造函数调用主构造函数,因为它的参数可能在属性初始值设定项和初始值设定项块中使用,就像您使用的那样 user init 阻止你的代码。

    constructor() : this() {}
    

    constructor() : this(FirebaseUser()) {} // get FirebaseUser from somewhere
    

    或者,如果你想做的是离开一切 null 当调用第二个no param构造函数时,可以选择如下方式:

    class UserModel(user: FirebaseUser?) {
    
        var uid: String? = user?.uid
        val email: String? = user?.email
        val phoneNumber: String? = user?.phoneNumber
        val photoUrl: String? = user?.photoUrl?.toString()
        val displayName: String? = user?.displayName
    
        constructor() : this(null)
    
    }
    
        2
  •  2
  •   Zoe - Save the data dump 张群峰    7 年前

    所有的二级构造函数都必须直接或间接地调用主构造函数。也就是说:

    class X(var x: Int){
        constructor() : this(0.0);
        constructor(x: Double) : this(x.toInt());
    }
    

    但是,您不能这样做:

    class X(var x: Int){
        constructor() : this();
        constructor(x: Double) : this();
    }
    

    因为这会导致堆栈溢出异常。

    所以用这句话:

    constructor():this() {}
    

    FirebaseUser 作为论据。我对Firebase不熟悉,那就交给你吧。

    constructor() : this(FirebaseUser());
    

    但是,如果您正在处理可为null的问题,假设大部分代码都在Kotlin中,您可以使用默认值使其为null,然后删除二级构造函数:

    class UserModel(user: FirebaseUser? = null){
        init{
            // Now that `user` is nullable, you need to change the assignments to include null-safe or non-null assertion (?. or !!. respectively)
        }
    }