小编Som*_*boy的帖子

Jetpack Compose – LazyColumn 不重组

我的 LazyColumn 没有重组,但值正在更新。

如果我向下滚动列表并向上滚动,我会看到 UI 的正确值

主要活动

class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyTheme {
                MyApp()
            }
        }
    }
}

// Start building your app here!
@Composable
fun MyApp(vm: PuppyListViewModel =  viewModel()) {
    val puppers by vm.pups.collectAsState(emptyList())
    Surface(color = MaterialTheme.colors.background) {
        Column {
            Toolbar()
            LazyColumn {
                items(puppers) { pup ->  PuppyUI(pup, vm::seeDetails, vm::togglePuppyAdoption) }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

视图模型

class PuppyListViewModel : ViewModel() {

    val pups = PuppyRepo.getPuppies().onEach {
        println("FlowEmitted: $it")
    }

    fun …
Run Code Online (Sandbox Code Playgroud)

android kotlin kotlin-coroutines android-jetpack-compose kotlin-flow

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

如何改变整个主题中AppBarLayout的样式?

我想做一些非常简单的事情:更改AppBarLayout整个主题的组件背景。

这是我的主题,我不知道要覆盖哪个属性:

<style name="BaseTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <!-- Some color attributes that doesn't actually matter... -->

</style>
Run Code Online (Sandbox Code Playgroud)

这是AppBarLayout我想应用于上述主题的新主题:

<style name="DefaultAppBarLayout" parent="Widget.Design.AppBarLayout">
    <item name="android:background">@android:color/transparent</item>
</style>
Run Code Online (Sandbox Code Playgroud)

我应该从另一个父级继承样式吗BaseTheme?或者<item name="attribute_name"></item>我应该将我的新风格应用到哪些方面?

编辑1

目前的行为

<com.google.android.material.appbar.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <androidx.appcompat.widget.Toolbar
                android:id="@+id/more_actionbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:title="@string/moremenu_fragment_title"/>
    </com.google.android.material.appbar.AppBarLayout>
Run Code Online (Sandbox Code Playgroud)

这是我想写的代码;无需每次都指定“背景颜色=白色”

期望的行为

适用于它的代码;但我不想android:background="@color/colorTrueWhite"AppBarLayout我的 XML 中的每个内容编写

<com.google.android.material.appbar.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorTrueWhite">

        <androidx.appcompat.widget.Toolbar
                android:id="@+id/more_actionbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:title="@string/moremenu_fragment_title"/>
    </com.google.android.material.appbar.AppBarLayout>
Run Code Online (Sandbox Code Playgroud)

android android-layout android-styles android-appbarlayout

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

在 Android 的导航架构组件中将复杂对象作为参数传递

我一直在寻找 Android 架构组件,最近又在寻找导航组件。

我试图将对象作为参数传递,以便下一个片段可以检索该数据,但要做到这一点,我需要执行以下两件事之一:

  1. 通过 Bundle 传递它,这将使我实现该对象的 Parcelable 接口。
  2. 使用我尝试过的“Safeargs”插件,它看起来像是在幕后使用了 Bundles,并且无论如何都需要实现 Parcelable 接口。

关于这些选项的问题是,我读到 Parcelable 使用反射,并且它在时间方面可能会变得相当昂贵


我还尝试构建一个“SharedMasterDetailsViewModel”,但没有运气,因为可观察的回调没有在我新创建的片段上执行。(我认为 LiveData 在创建片段之前执行回调)

这是一些关于我如何尝试解决此问题的代码

共享会话视图模型

class SessionSharedViewModel : ViewModel() {


    var sharedSession: LiveData<Session> = MutableLiveData()
        private set

    fun setSession(data: Session) {
        val casted = this.sharedSession as MutableLiveData<Session>
        casted.postValue(data)
    }
}
Run Code Online (Sandbox Code Playgroud)

主片段

override fun onItemClicked(item: Session) {
    sessionSharedViewModel.setSession(item) // Item is a complex object of mine
    this@HomeFragment.findNavController().navigate(R.id.sessionDetailsFragment)
}
Run Code Online (Sandbox Code Playgroud)

详情片段

class SessionDetailsFragment : Fragment() {

    companion object {
        fun newInstance() = SessionDetailsFragment()
    }

    private lateinit var …
Run Code Online (Sandbox Code Playgroud)

navigation android kotlin android-livedata android-architecture-components

5
推荐指数
1
解决办法
5177
查看次数

Deno 在哪里保存 `localStorage` SQLite 文件?

我刚刚阅读了Deno 文档中的 Web API,似乎localStorage是作为持久 SQLite 实现的,并且sessionStorage是作为内存 SQLite 实现的。

每当不传递--location参数时,在我的文件系统中的哪里可以找到 SQLite DB?

filesystems sqlite local-storage deno

5
推荐指数
1
解决办法
662
查看次数

如何将 Kotlin 文件编译为 JavaScript?

您好,我正在 Node 上开始使用 KotlinJS,我已经放置了一个非常简单的 kotlin 文件,我想使用原始kotlinc-js编译器来编译它。不使用gradle

package main

fun heavy() {
    (1..10_000_000).forEach { it*it }
}

fun main() {
    heavy()
    println("Bye JS")
}

Run Code Online (Sandbox Code Playgroud)

这是make我尝试过但没有成功的命令:

build-js:
    kotlinc-js main.kt -output main.kt.js
Run Code Online (Sandbox Code Playgroud)

它编译得很好,但是当我尝试运行时node main.kt.js

throw new Error("加载模块'main.kt'时出错。未找到其依赖项'kotlin'。请检查'kotlin'是否在'main.kt'之前加载。"); ^

错误:加载模块“main.kt”时出错。未找到其依赖项“kotlin”。请检查“kotlin”是否在“main.kt”之前加载。在对象。(/home/nanospicer/KotlinProjects/KotlinScripting/main.kt.js:2:9) 在 Module._compile (节点:internal/modules/cjs/loader:1101:14) 在 Object.Module._extensions..js (节点:内部/模块/cjs/loader:1153:10)在Module.load(节点:内部/模块/cjs/loader:981:32)在Function.Module._load(节点:内部/模块/cjs/loader:822) :12) 在 Function.executeUserEntryPoint [作为 runMain] (节点:internal/modules/run_main:79:12) 在节点:internal/main/run_main_module:17:47

好的,所以我认为它缺少 kotlin 运行时。我将尝试与 JVM 编译器相同的参数:-include-runtime这会导致错误:

错误:无效参数:-include-runtime 信息:使用 -help 获取更多信息

然后我尝试:

build-js:
    kotlinc-js main.kt -kotlin-home "/mnt/c/Program Files/JetBrains/IntelliJ IDEA Community Edition 2021.2.1/plugins/Kotlin/kotlinc/" -libraries "/mnt/c/Program …
Run Code Online (Sandbox Code Playgroud)

kotlinc kotlin-js

3
推荐指数
1
解决办法
1949
查看次数

使用 TLS 与 Mosquitto 进行 Telegraf 连接

在我的系统(带有树莓派)中,我有一些传感器将数据发布到 Mosquitto,我使用 Telegraf 将数据传输到 influxDB 数据库,我使用 Grafana 来显示数据。

在没有 TLS 连接的测试期间(在 mosquittos 中)一切正常,但当我激活 TLS 时,我开始遇到 Telegraf 问题。

传感器使用 client.key、c​​lient.crt 和 ca.crt 将数据发送到代理。在代理中我可以看到来自传感器的数据。所以我认为问题不在于此。

在 telegraf 中(我想它作为客户端工作)我尝试配置 TLS 连接。查看 telegraf.service status ,它处于活动状态并且正在运行。查看日志,我没有看到连接中的错误,但我看不到来自代理的任何数据。

在 Telegraf.conf 中,我设置了证书,如下所示。我使用了用于连接到系统的传感器或其他客户端的文件,而不是使用 pem 文件:扩展名不同,我不知道问题是否在这里。

这里是Telegraf的配置(mqtt_consumer)

# # Read metrics from MQTT topic(s)
 [[inputs.mqtt_consumer]]
#   ## Broker URLs for the MQTT server or cluster.  To connect to multiple
#   ## clusters or standalone servers, use a seperate plugin instance.
#   ##   example: servers = ["tcp://localhost:1883"]
#   ##            servers = ["ssl://localhost:1883"] …
Run Code Online (Sandbox Code Playgroud)

raspberry-pi mosquitto telegraf

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

无法在 Kotlin Multiplatform 中使用字体

很简单;刚刚通过向导创建了一个 Compose Multiplatform 项目。

继续创建主题;但我想使用相同的字体,所以我poppins.ttfcommonMain/resources/font/.

然后我在模块中声明了以下内容commonMain

expect val projectFontFamily: FontFamily
Run Code Online (Sandbox Code Playgroud)

在我使用的模块上commonDesktop

actual val projectFontFamily: FontFamily = FontFamily(
  Font("font/poppins.ttf")
)
Run Code Online (Sandbox Code Playgroud)

太棒了,成功了。从今起commonAndroid

actual val projectFontFamily: FontFamily = FontFamily(
  Font(R.font.poppins)
)
Run Code Online (Sandbox Code Playgroud)

由于某种原因,该类R未正确生成,我无法使用R.font.poppins.

如果我将“资源”重命名为“res”并将字体推入其中,res/font/那么它就可以工作。(但我只是复制了字体文件)。

我该如何解决这个问题?

kotlin android-resources kotlin-multiplatform android-jetpack-compose compose-multiplatform

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