小编Arc*_*nes的帖子

如何更改 Jetpack Compose 中的 AppBar 菜单?

我想知道如何更改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)

android android-jetpack-compose

9
推荐指数
1
解决办法
4138
查看次数

SingleLiveEvent实际上是Android架构组件库的一部分吗?

我一直在使用这里SingleLiveData可以找到的课程.我的问题是:

  1. SingleLiveData实际上是Android架构组件的一部分?

  2. 使用它是个好主意吗?

android android-livedata android-architecture-components mutablelivedata

8
推荐指数
2
解决办法
3985
查看次数

如何在 Kotlin 中使用 Koin 注入 ViewModel?

我们如何使用 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)

android kotlin android-viewmodel koin

8
推荐指数
1
解决办法
4442
查看次数

Coroutine Join 有什么作用?

例如,我有以下代码:

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)

kotlin kotlinx.coroutines

7
推荐指数
2
解决办法
2184
查看次数

在 Koin 中提供一个实例作为它的接口

假设我有两个接口,例如:

interface LetterClassifier
interface NumberClassifier
Run Code Online (Sandbox Code Playgroud)

然后这些接口将应用于这个类:

class Classifier() : LetterClassifier, NumberClassifier
Run Code Online (Sandbox Code Playgroud)

现在,我想提供这些实例只是作为LetterClassifierNumberClassifier不作为ClassifierKoin

我认为这样做的方法是:

module {
    val classifier = Classifier()

    single<NumberClassifier> { classifier }
    single<LetterClassifier> { classifier }
}
Run Code Online (Sandbox Code Playgroud)

但我不认为这是正确的方法。有人可以指导我吗?

kotlin koin

7
推荐指数
2
解决办法
3000
查看次数

如何使用 Fragment Scenario 测试 Fragment?

我正在尝试单独测试 a Fragment。为此,我正在尝试FragmentScenario.

Android 文档在这里提供了一个非常好的示例。但是我的测试总是失败,因为我的片段将活动投射到onAttach.

FragmentScenarioluanches 一个容器Activity(显然)没有实现我的片段所需的接口。

我的问题是如何解决这个问题?如何强制容器活动实现我需要的接口?或者有没有更好的方法来做到这一点?也许移除铸件onAttach并用不同的方法替换?

android android-fragments android-testing

6
推荐指数
1
解决办法
3810
查看次数

如何在Koin中提供基类?

例如我有以下课程:

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)

我该如何让我的模块做到这一点?如何将实现实例注入到基类引用中?

kotlin koin

6
推荐指数
1
解决办法
2940
查看次数

导航组件重复 NavArgs 的问题

我有一个片段:

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 android-architecture-navigation android-safe-args

6
推荐指数
1
解决办法
1696
查看次数

有没有办法在 Kotlin Multiplatform 中使用 Firebase(身份验证)?

我有一个在 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

6
推荐指数
2
解决办法
1714
查看次数

如何在 Jetpack Compose 中引用主题属性?

所以在目前的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 android-theme android-jetpack-compose

6
推荐指数
2
解决办法
1950
查看次数