我正在用Android Studio在Jetpack Composable平台上编写一个Android应用程序.我需要在平板电脑中安装的SD卡上读写文件.我可以定义卡片的路径如下:

private val externalStorageVolumes = context.let { ContextCompat.getExternalFilesDirs(it.applicationContext, null) }

private val sdCardStorage = externalStorageVolumes[1]

问题是:我想从视图的ViewModel访问卡片,但正如您所见,我需要传递一个上下文的引用.显然,不应该从ViewModel引用任何上下文,因为这可能导致内存泄漏.

是否有任何方法可以从不需要上下文的ViewModel读写SD卡?谢谢!

推荐答案

显然,不应该引用ViewModel中的任何上下文,因为这可能导致内存泄漏

这就是AndroidViewModel的原因.它调解对Application的访问,这是一个安全的从ViewModel使用的单例Context.

更好的做法是让您的数据存储逻辑由一个单独的存储库类管理,作为a layered architecture的一部分.您可以让存储库通过依赖倒置(Dagger/Hilt、KOIN等)访问Application单例.

Android相关问答推荐

如何使用视图模型触发可变状态?

无法在Android Gradle中同步Chaquopy版本

如何在停止和销毁时更改函数中Firebase实时数据库的子项的值我试过了,但这不起作用.请使用Kotlin

保护所有程序包文件和类

尽管我们不再使用GCM SDK,但应用程序已被标记为使用GCM SDK

OverridePendingTransition已弃用,我该怎么办?

Android-LVL库始终返回NOT_SUBLISTED

如何在使用带有底部导航组件的片段管理器时更改片段工具栏的标签

如何在Android中将以前的数据保存在复选框中?

是否可以附加事件处理程序,如onClick,拖动到Canvas Composable中绘制的内容,或使用drawBehind修饰符?

Jetpack Compose 中带有权重的行和 AnimatedVisibility 会 destruct UI

用作输入参数的 Lambda 函数导致重组

如何将一个 Composable 作为其参数传递给另一个 Composable 并在 Jetpack Compose 中显示/运行它

无法通过 retrofit 解析对 kotlin 数据类的 xml 响应

在 Kotlin 中循环遍历字符串并用新行替换句号

java.lang.IllegalArgumentException:与请求匹配的导航目的地 NavDeepLinkRequest

当我更改 ViewModel var 时,Kotlin + Compose 中的 Composable 不会更新

Google Play 控制台您的应用是否使用广告 ID?

使用协程访问数据库

Android:如何获取具有纬度和经度的位置的图像