-
Notifications
You must be signed in to change notification settings - Fork 208
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Kotlin class support #47
Comments
Nothing planned for now, I don't have much experience with Kotlin. That could change in a couple of months tho, so I'll keep this issue open. I know Jake ported his ButterKnife to Kotlin, so it shouldn't be too hard. Pull requests or more info about what's required to make it work with Kotlin greatly appreciated. |
Kotterknife, which is Jake's version of Butterknife view injection is not really a port and does not use annotation processing at all. He instead used Kotlin's property delegation support, which would not work well for Icepick. The bottom line is that Kotlin does not support raw field access from one class to another. It has properties not fields from which it generates a private field and get/set methods. What Icepick would need to do is add support for properties (using get/set methods) in addition to raw field access. That should be supported in 2 ways:
The first case above lets you do this:
where set and get could be customized such that there actually is no generated field. Future versions of Kotlin will allow this to be more concise. The second case is the more basic:
which applies the Icicle annotation to the generated private field but generates get and set methods. Note that adding property support would actually be useful in Java as well and would allow you to have get/seet for things you want to save that actually are computed without actually having backing fields. |
Here are the relevant parts of Kotlin documentation: http://kotlinlang.org/docs/reference/properties.html There is also this: http://kotlinlang.org/docs/reference/java-interop.html, but the only relevant line is:
|
Simply using setters and getters when field is not accessible would make it work. Please refer to this: sockeqwe/fragmentargs#21 |
The addition of the @JvmField annotation to Kotlin makes this request just a nice to have. |
@dalewking Yes, handling only fields is not a deal-breaker when @State is used in conjuction with @JvmField (lateinit does a similar thing). Nonetheless, as you say, it'd be nice to have setters and getters being handled properly by Icepick. |
Thanks all for the useful information shared in this discussion. If there is an effective workaround at the moment to get Icepick working with Kotlin I'd be inclined not to add complexity and change the codebase. Kotlin is a fast evolving language and adding explicit support for it makes me chase a moving target. Happy to reconsider it in the future if the conditions change but closing it for now. |
FYI Kotlin has reached its 1.0.0 and is not a moving target anymore. Le jeu. 12 nov. 2015 21:58, Frankie Sardo notifications@github.com a
|
Also it's not about making a Kotlin-specific change but safe-and-efficient-Java-coding change. As I said before: "There's a reason why all Java books tell you to use private fields with non-private setters/getters." |
If you're not a fan of exposing your variables and using @JvmField, I've started a simple lib that should work as Icepick: https://github.com/tinsukE/icekick |
what is the workaround here in Kotlin? I tried the following, without success.
EDIT: this works, had a build issue preventing annotation processing |
And here's another alternative. Same API like Icepick, but works well with properties: https://github.com/evernote/android-state |
@ZakTaccardi do you have an example of it working? |
Is there planned support for classes written in Kotlin? Currently members in a Kotlin class annotated with "Icicle" do not get saved.
The text was updated successfully, but these errors were encountered: