Accompanist的使用:

一、基础概述

1. 是什么

Google 官方维护的 Compose 扩展工具合集 ,模块化拆分,按需引入依赖,每个模块独立,不强制引入全部。解决 Compose 原生痛点:

  • 无原生运行时权限 API
  • 无原生下拉刷新
  • 无原生流式布局
  • 导航无页面切换动画、底部 Sheet 路由不完善
  • 系统状态栏 / 导航栏适配、XML 主题兼容、Drawable 兼容
  • 各种原生缺失工具方法

2. 版本适配(2026 最新,必看)

最新稳定版:0.37.3

  • 适配 Compose 1.7.x / 1.8.x(当前 AS Hedgehog/ Iguana 默认版本)
  • 版本严格绑定 Compose 版本,版本不匹配会编译报错
  • 官方文档:google.github.io/accompanist...Google

3. 模块化依赖(Kotlin DSL,build.gradle.kts 直接复制)

全部模块按需引入,不要一次性全引,只引入你用到的。

kotlin

kotlin 复制代码
// 统一版本
val accompanistVersion = "0.37.3"

// 1. 运行时权限(最常用)
implementation("com.google.accompanist:accompanist-permissions:$accompanistVersion")


// 2. 下拉刷新 SwipeRefresh
implementation("com.google.accompanist:accompanist-swiperefresh:$accompanistVersion")

// 3. 流式布局 FlowLayout(自动换行标签流)
implementation("com.google.accompanist:accompanist-flowlayout:$accompanistVersion")

// 4. 系统栏适配(状态栏、导航栏、沉浸式)
implementation("com.google.accompanist:accompanist-insets:$accompanistVersion")
implementation("com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion")

二、各模块详细使用(完整可运行代码,日常开发全覆盖)

1. Permissions 运行时权限(Compose 最强权限库,完全替代 Activity Result API)

Compose 原生无任何权限 API ,全靠 Accompanist 实现,Compose 页面权限申请唯一官方方案

核心 API

  • rememberPermissionState():单个权限状态
  • rememberMultiplePermissionsState():多个权限状态
  • 自带生命周期安全、状态自动恢复、无需 Launcher、无需 Activity 转发

单个权限(相机权限示例)

kotlin

scss 复制代码
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.rememberPermissionState
import android.Manifest

@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun CameraPermissionDemo() {
    // 1. 注册权限状态(Composable 内声明)
    val cameraPermission = rememberPermissionState(Manifest.permission.CAMERA)

    Column(modifier = Modifier.fillMaxSize()) {
        Button(onClick = {
            // 2. 发起申请
            cameraPermission.launchRequest()
        }) {
            Text("申请相机权限")
        }

        // 3. 权限状态判断
        when {
            cameraPermission.status.isGranted -> {
                Text("✅ 相机权限已授予")
            }
            cameraPermission.status.shouldShowRationale -> {
                // 拒绝过、未永久拒绝:解释权限用途
                Text("需要相机权限用于拍照")
                Button(onClick = { cameraPermission.launchRequest() }) {
                    Text("重新申请")
                }
            }
            cameraPermission.status.isPermanentlyDenied -> {
                // 永久拒绝(勾选不再询问):引导跳转系统设置
                Text("❌ 权限已永久拒绝,请去设置开启")
                Button(onClick = { cameraPermission.openAppSettings() }) {
                    Text("前往设置")
                }
            }
        }
    }
}

多个权限同时申请(相机 + 存储)

kotlin

less 复制代码
@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun MultiPermissionDemo() {
    val multiplePermissions = rememberMultiplePermissionsState(
        permissions = listOf(
            Manifest.permission.CAMERA,
            Manifest.permission.READ_EXTERNAL_STORAGE
        )
    )

    Button(onClick = { multiplePermissions.launchRequest() }) {
        Text("申请相机+存储权限")
    }

    // 遍历所有权限结果
    multiplePermissions.permissions.forEach { (permission, state) ->
        Text("${permission}: ${state.isGranted}")
    }

    // 全部权限通过判断
    if (multiplePermissions.allPermissionsGranted) {
        Text("全部权限已授权")
    }
}

优势总结

  • 纯 Compose 写法,不需要 Activity、不需要 Activity Result Launcher
  • 状态可观察、Compose 状态驱动、自动生命周期管理
  • 内置永久拒绝、引导设置、权限理由提示全套逻辑
  • 全 Android 版本兼容,无需版本判断

2. SwipeRefresh 下拉刷新(Compose 下拉刷新)

对应原生 SwipeRefreshLayout,Compose 原生无官方下拉刷新,Accompanist 实现标准下拉刷新。

kotlin

kotlin 复制代码
import com.google.accompanist.swiperefresh.SwipeRefresh
import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
import androidx.compose.runtime.collectAsStateWithLifecycle

@Composable
fun SwipeRefreshDemo(viewModel: MainViewModel) {
    // 监听加载状态
    val isRefreshing by viewModel.isLoading.collectAsStateWithLifecycle()

    SwipeRefresh(
        state = rememberSwipeRefreshState(isRefreshing),
        onRefresh = { viewModel.refreshData() }, // 下拉刷新回调
    ) {
        // 你的列表内容(LazyColumn)
        LazyColumn(modifier = Modifier.fillMaxSize()) {
            items(20) {
                Text("列表条目 $it", Modifier.padding(16.dp))
            }
        }
    }
}

注:该模块未废弃,日常开发依旧广泛使用。

3. FlowLayout 流式布局(标签自动换行,高频刚需)

Compose 原生只有 Row/Column无流式布局(标签、标签流自动换行),这是项目最高频需求。

kotlin

kotlin 复制代码
import com.google.accompanist.flowlayout.FlowRow

@Composable
fun FlowLayoutDemo() {
    FlowRow(
        modifier = Modifier.fillMaxWidth(),
        mainAxisSpacing = 10.dp, // 水平间距
        crossAxisSpacing = 10.dp, // 垂直行间距
    ) {
        // 任意子组件,自动换行
        listOf("Android", "Compose", "Kotlin", "Jetpack", "Accompanist", "MVVM", "Hilt").forEach { tag ->
            Chip(text = tag)
        }
    }
}

// 简易标签组件
@Composable
fun Chip(text: String) {
    Surface(
        color = Color(0xFFE3F2FD),
        shape = RoundedCornerShape(20.dp)
    ) {
        Text(text, Modifier.padding(horizontal = 12.dp, vertical = 4.dp), color = Color(0xFF2196F3))
    }
}

4. Insets + SystemUiController 系统栏适配(沉浸式、状态栏变色)

Compose 原生系统栏适配极其难用,Accompanist 一键适配状态栏、导航栏、刘海屏、底部安全区、沉浸式

依赖

kotlin

bash 复制代码
implementation("com.google.accompanist:accompanist-insets:$accompanistVersion")
implementation("com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion")

完整沉浸式 + 状态栏变色代码

kotlin

kotlin 复制代码
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import com.google.accompanist.insets.ProvideWindowInsets
import com.google.accompanist.insets.navigationBarsPadding
import com.google.accompanist.insets.statusBarsPadding

@Composable
fun SystemUiDemo() {
    // 包裹全局Compose,提供WindowInsets
    ProvideWindowInsets {
        val systemUiController = rememberSystemUiController()

        SideEffect {
            // 设置状态栏:透明 + 深色字体(安卓浅色状态栏)
            systemUiController.setStatusBarColor(
                color = Color.Transparent,
                darkIcons = true
            )
            // 设置底部导航栏透明
            systemUiController.setNavigationBarColor(Color.Transparent)
        }

        Column(
            modifier = Modifier
                .fillMaxSize()
                .statusBarsPadding() // 顶部避开状态栏
                .navigationBarsPadding() // 底部避开导航栏安全区
        ) {
            Text("沉浸式页面内容", Modifier.padding(20.dp))
        }
    }
}

核心能力

  • 一键状态栏透明、修改颜色、切换黑白字体
  • 底部导航栏适配、安全区 Padding 自动添加
  • 适配刘海屏、挖孔屏、全面屏所有机型
  • 全局统一控制,无需修改 Activity 主题
相关推荐
阿巴斯甜2 小时前
Activity Result API 的使用:
android jetpack
阿巴斯甜3 小时前
DataStore的使用:
android jetpack
我命由我123451 天前
Android 开发问题:无法从存储库 “D:\keys\MyNotifications.jks“ 中读取密钥 MyNotifications.
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
BoomHe1 天前
Android (AAOS) 13 编译中间产物(Wifi Jar)
android·android studio·android jetpack
撩得Android一次心动2 天前
Android DataBinding 全面解析【源码篇2】
android·源码·android jetpack·databinding
我命由我123452 天前
Android 开发,getSystemService 警告信息:Must be one of: Context. POWER_SERVICE ...
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
alexhilton5 天前
Compose中初始加载逻辑究竟应该放在哪里?
android·kotlin·android jetpack
我命由我123455 天前
Android 开发问题:SharedPreferences 的 getString 方法返回值类型 Type mismatch 问题
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
我命由我123456 天前
Android 开发中,关于 Gradle 的 distributionUrl 的一些问题
android·java·java-ee·android studio·android jetpack·android-studio·android runtime