-
Notifications
You must be signed in to change notification settings - Fork 0
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
Icon 컴포넌트 추가, filled/line 아이콘 정의 #5
Conversation
|
||
private var _add: ImageVector? = null | ||
|
||
public val HandyIcons.Filled.Add: ImageVector |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이거 저 밑에 있는 것처럼 어떻게 하신건가요?
moveTo랑 이것저것 있는거요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
따로 추출한 방법이 있나요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
https://www.composables.com/svgtocompose
이런 사이트가 있더라구요. 여기서 했습니당
} | ||
|
||
@Composable | ||
@NonRestartableComposable |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이건 언제 붙이는건가요? NonRestartableComposable?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
사실 material의 Icon에 해당 어노테이션이 있어서 그대로 따라한거긴 한데, 질문 주신 덕분에 좀 찾아봤어요
- https://developer.android.com/reference/kotlin/androidx/compose/runtime/NonRestartableComposable
- https://medium.com/@limsaehyun/deepdive-into-nonrestartablecomposable-3f77b1b771e1
아직은 러프하게만 알아본거긴 하지만, Icon의 경우에는 리컴포지션 될 필요가 없기 때문에 (아이콘이 바뀌지 않는 한) 명시적으로 그 사실을 컴파일러에게 알려줘서 리컴포지션 관련 코드를 generate 하지 않도록 설정해준다고 이해할 수 있을 것 같네요.
잘못 이해했었네요. NonRestartableComposable
이 컴포즈 컴파일러에게 명시적으로 리컴포지션되지 않도록 알려주는 것은 맞는데, Icon 컴포넌트 자체가 리컴포지션 될 필요가 없어서 그런 건 아니네요.
This may be desirable for small functions which just directly call another composable function and have very little machinery in them directly, and are unlikely to be invalidated themselves.
를 보면 (거의) 바로 다른 composable 함수를 호출할 때, 그러니까 본인이 직접 뷰를 그리는(invalidate) 게 아닐 때 사용하는 것이 적절하다라고 하네요. 루트가 되는 Icon 컴포넌트는 해당 어노테이션을 제거하는 게 맞을 것 같습니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
07de9f9 반영한 커밋입니다. 다시 보니까 머티리얼도 마지막에 호출되는 Icon 함수는 해당 어노테이션이 없더라구요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
좋습니다!!!
object Line | ||
} | ||
|
||
inline fun handyIcon( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
handyIcon, handyPath 각각의 역할이 무엇인가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이건 그냥 중복 제거하기 위한 유틸 함수예요
pathBuilder = pathBuilder | ||
) | ||
|
||
@PublishedApi |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오 이건 처음보는건데 뭔가용
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-published-api/
- https://kotlinlang.org/docs/inline-functions.html#restrictions-for-public-api-inline-functions
원래는 public inline function에서 non-public API는 참조하지 못하는데요, 왜냐하면 컴파일 할 때 non-public API의 변경사항을 반영하지 못할 수 있기 때문이에요(표현이 좀 애매한 것 같은데 두 번째 링크나 아래 문구 참고해주세요).
This imposes certain risks of binary incompatibility caused by changes in the module that declares an inline function in case the calling module is not re-compiled after the change.
아무튼 non-public API 중에서 internal
로 명시된 API는 @PublishedApi
어노테이션을 추가해서 public인 것처럼 컴파일할 때 반영할 수 있다 이렇게 이해하면 될 것 같습니다.
물론 internal이니까 모듈 외부에서는 접근할 수 없는 건 동일하구요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이런게 있었군요~!
하하 파일이 많아서 로딩이 오래걸렸네요.
|
Summary
아이콘 정의와 Icon 컴포넌트를 추가했습니다.
Icon 컴포넌트는 위와 같이 사용할 수 있고,
HandyIcons.Filled.XXX
,HandyIcons.Line.XXX
와 같은 형식으로 아이콘 리소스를 참조할 수 있습니다.Icon.kt
HandyIcons.kt
IconsPreview.kt
이 파일들만 확인하시면 됩니다.
앞으로 preview와 관련된 파일은 IconsPreview와 같이 앱 모듈에 모아두는 건 어떨까요?
Ref