我想知道如何更改Jetpack Compose.
在Fragment世界上实现这一目标需要做这样的事情:
class SampleFragment : Fragment() {
override fun onCreate(context: Context) {
super.onCreate(context)
setHasOptionsMenu(true)
}
// Set the R.menu.sampleMenu in the AppBar
override fun onCreateOptionsMenu(menu: Menu) {
...
menuInflater.inflate(R.menu.sampleMenu, menu)
}
// To handle clicks on the menu
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// Check id of menu item and process as follow
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何在 Compose 中做同样的事情。我在想:
// Have a top level state which could be set
var menu by remember { …Run Code Online (Sandbox Code Playgroud) 我一直在使用这里SingleLiveData可以找到的课程.我的问题是:
是SingleLiveData实际上是Android架构组件的一部分?
使用它是个好主意吗?
android android-livedata android-architecture-components mutablelivedata
我们如何使用 Koin 为 ViewModel 注入依赖项?
所以例如,我有一个ViewModel这样的:
class SomeViewModel(val someDependency: SomeDependency, val anotherDependency: AnotherDependency): ViewModel()
Run Code Online (Sandbox Code Playgroud)
现在这里的官方文档指出,要提供一个ViewModel我们可以执行以下操作:
val myModule : Module = applicationContext {
// ViewModel instance of MyViewModel
// get() will resolve Repository instance
viewModel { SomeViewModel(get(), get()) }
// Single instance of SomeDependency
single<SomeDependency> { SomeDependency() }
// Single instance of AnotherDependency
single<AnotherDependency> { AnotherDependency() }
}
Run Code Online (Sandbox Code Playgroud)
然后注入它,我们可以这样做:
class MyActivity : AppCompatActivity(){
// Lazy inject SomeViewModel
val model : SomeViewModel by viewModel()
override fun …Run Code Online (Sandbox Code Playgroud) 例如,我有以下代码:
scope.launch {
val job = launch {
doSomethingHere()
}
job.join()
callOnlyWhenJobAboveIsDone()
}
Run Code Online (Sandbox Code Playgroud)
Job.join() 在文档中是这样的状态:
暂停协程,直到此作业完成。当作业因任何原因完成并且调用协程的作业仍处于活动状态时,此调用将正常恢复(无一例外)。如果 Job 仍处于新状态,此函数还会启动相应的协程。
如果我理解正确,因为join()在协程完成之前挂起协程,那么我上面的代码将完全符合它的要求。也就是说,callOnlyWhenJobAboveIsDone()只有在doSomethingHere()完成时才会调用该方法。那是对的吗?
任何人都可以进一步解释job.join()? 提前致谢。
进一步解释我的用例:
val storeJobs = ArrayList<Job>()
fun callThisFunctionMultipleTimes() {
scope.launch {
val job = launch {
doSomethingHere()
}
storeJobs.add(job)
job.join()
callOnlyWhenJobAboveIsDone()
}
}
fun callOnlyWhenJobAboveIsDone() {
// Check if there is still an active job
// by iterating through the storedJobs
// and checking if any is active
// if no job …Run Code Online (Sandbox Code Playgroud) 假设我有两个接口,例如:
interface LetterClassifier
interface NumberClassifier
Run Code Online (Sandbox Code Playgroud)
然后这些接口将应用于这个类:
class Classifier() : LetterClassifier, NumberClassifier
Run Code Online (Sandbox Code Playgroud)
现在,我想提供这些实例只是作为LetterClassifier和NumberClassifier不作为Classifier在Koin。
我认为这样做的方法是:
module {
val classifier = Classifier()
single<NumberClassifier> { classifier }
single<LetterClassifier> { classifier }
}
Run Code Online (Sandbox Code Playgroud)
但我不认为这是正确的方法。有人可以指导我吗?
我正在尝试单独测试 a Fragment。为此,我正在尝试FragmentScenario.
Android 文档在这里提供了一个非常好的示例。但是我的测试总是失败,因为我的片段将活动投射到onAttach.
FragmentScenarioluanches 一个容器Activity(显然)没有实现我的片段所需的接口。
我的问题是如何解决这个问题?如何强制容器活动实现我需要的接口?或者有没有更好的方法来做到这一点?也许移除铸件onAttach并用不同的方法替换?
例如我有以下课程:
abstract class BaseClass()
class SpecificClass : BaseClass()
Run Code Online (Sandbox Code Playgroud)
现在,我想SpecificClass通过依赖注入提供,但我也想在同一个图中koin提供基类。BaseClass
需要明确的是,我想做一些类似的事情:
class Someclass {
...
private specificClass: SpecificClass by inject()
...
}
class Someclass {
...
private baseClass: BaseClass by inject()
// where this BaseClass is just the the same instace of the SpecificClass in the dependency graph
...
}
Run Code Online (Sandbox Code Playgroud)
我该如何让我的模块做到这一点?如何将实现实例注入到基类引用中?
我有一个片段:
class SomeFragment {
private val args by navArgs<SomeFragmentArgs>()
}
Run Code Online (Sandbox Code Playgroud)
该片段用于两个导航图中:
第一个_nav.xml
....
<fragment
android:id="@+id/initialFragment"
android:name="com.example.InitialFragment"
android:label="Initial Fragment">
<action
android:id="@+id/action_to_some_fragment"
app:destination="@id/someFragment" />
</fragment>
<fragment
android:id="@+id/someFragment"
android:name="com.example.SomeFragment"
android:label="Some Label">
<argument
android:name="someType"
app:argType="com.example.someType"/>
</fragment>
....
Run Code Online (Sandbox Code Playgroud)
第二个_nav.xml
....
<fragment
android:id="@+id/initialFragment2"
android:name="com.example.InitialFragment2"
android:label="Initial Fragment">
<action
android:id="@+id/action_to_some_fragment"
app:destination="@id/someFragment" />
</fragment>
<fragment
android:id="@+id/someFragment"
android:name="com.example.SomeFragment"
android:label="Some Label">
<argument
android:name="someType"
app:argType="com.example.someType"/>
</fragment>
....
Run Code Online (Sandbox Code Playgroud)
但是当我构建 R8 版本的项目时,会抛出:
R8:程序类型已存在:com.example.SomeFragmentArgs$Companion
谁可以帮我这个事?
我有一个在 Android 中使用 Firebase 身份验证的项目。它运行良好,我想使用 Kotlin Multiplatform 的代码共享将同一个项目移植到 iOS 应用程序。
我最初认为我可以简单地创建一个
expect class FirebaseAuth
Run Code Online (Sandbox Code Playgroud)
和
//AndroidMain
actual class FirebaseAuth
//iOSMain
actual class FirebaseAuth
Run Code Online (Sandbox Code Playgroud)
但我真的不知道如何在 iOSMain 中使用 iOS 版本的 FirebaseAuth?有人可以在这里指导我吗?
kotlin firebase firebase-authentication kotlin-multiplatform
所以在目前的andriod开发中,如果我们需要引用主题中设置的颜色,我们可以简单地做:(在布局xml中)
....
<TextView
...
android:textColor="?attr/colorPrimary"
.../>
....
Run Code Online (Sandbox Code Playgroud)
如果我在主题中设置了蓝色。我将在上面的文本视图中获得该颜色。
我想知道如何在Jetpack Compose. 在Compose,我们做,
MaterialTheme(...) {
Column {
Text(
...
textStyle = TextStyle(color = ????) // How to I reference to the theme?
)
}
}
Run Code Online (Sandbox Code Playgroud) android ×6
kotlin ×5
koin ×3
android-architecture-components ×1
android-architecture-navigation ×1
firebase ×1