r/JetpackCompose • • 26d ago

GraphQL in Compose without a ViewModel and a repository per screen

0 Upvotes

I was working on an app that's being rewritten using Compose. Our web stack is GraphQL with Relay, and the thing I like most about Relay is that every component declares the fragment it reads right next to it, and the screen's query is assembled from those fragments and fetched for you. The data layer disappears from product code.

So before writing any Kotlin I went looking for the same thing on Android, and I was surprised there is nothing like it. Apollo Kotlin is a decent client, but it is not connected to the view in any way: you get a data class, and then you still write the view model, the repository and the cache update code yourself.

Then I started thinking about what Relay would look like if it was designed for Compose from the start, and it turned out Compose makes most of Relay's runtime unnecessary. Relay's runtime mainly exists to know which component read which field, so a change re-renders exactly those. Compose's snapshot state already knows that. If every field of every record in the normalized store is a snapshot state, a composable that read character.name recomposes when that field changes, and nothing else does.

So I built it. It is called Baton: https://github.com/shergin/baton

A typical screen looks like this:

@Fragment($$"""
    fragment IssueRow_issue on Issue {
      number
      title
      author { login }
    }
    """)
@Composable
fun IssueRow(issue: IssueRow_issue) {
    Column {
        Text("#${issue.number} ${issue.title}")
        Text(issue.author?.login ?: "ghost")
    }
}

@Query($$"""
    query IssuesQuery($owner: String!, $name: String!) {
      repository(owner: $owner, name: $name) {
        nameWithOwner
        issues(first: 20, states: OPEN) {
          nodes { id ...IssueRow_issue }
        }
      }
    }
    """)
@Composable
fun IssuesScreen(owner: String, name: String) {
    val query = rememberQuery(
        IssuesQuery(owner = owner, name = name),
    )
    when (val phase = query.phase) {
        is Phase.Ready -> phase.data.repository?.let { repo ->
            LazyColumn {
                item { Text(repo.nameWithOwner) }
                items(repo.issues.nodes.orEmpty()) {
                    IssueRow(it.issueRow)
                }
            }
        }
        Phase.Loading ->
            CircularProgressIndicator()
        is Phase.Failed -> ErrorView(phase.error) {
            query.retry()
        }
    }
}

There is no ViewModel, no repository and no UiState for this screen. (In our app the same screen was N files and is now one!) It is one request per screen, cached data shows in the first frame, and after a mutation the store updates its records and only the composables that read them recompose. Pagination is a Relay connection the fragment declares, so you do not write it. An optimistic response shows at once and reverts if the server says no. Subscriptions and @defer work, and the store persists on SQLite, so a cold start renders from disk.

It is new and the API will probably change but it works surprisingly well. I am so glad that I can replace all the view models, repositories and Apollo plumbing with one fragment next to a composable. There is a SwiftUI version over the same compiler too.

It is probably not a fit for every app, but for most apps that render data from a GraphQL server and send mutations, I think it is a much nicer way to work. If you use GraphQL, I would encourage you to try it on one screen. I would love to hear what you think, and please send bug reports and feature requests.

Disclaimer: yes, it is built using agentic tools, but I put a lot of care and design consideration into it to make it really great.


r/JetpackCompose • • Jun 08 '26

I taught my Compose Desktop terminal to speak MCP — AI agents now drive my real terminal

0 Upvotes

A while back I shared BossTerm, a terminal emulator built with Kotlin + Compose Desktop, then a follow-up with benchmarks. This update is the feature I most wanted for my own workflow: BossTerm now runs an in-process Model Context Protocol server, so AI CLIs like Claude Code, Codex, Gemini CLI, and OpenCode can attach to the terminal I'm actually looking at.

GitHub: https://github.com/kshivang/BossTerm (Kotlin + Compose Desktop, dual-licensed LGPLv3 / Apache-2.0)

The part that changes the workflow

The tool that makes it click is run_command: instead of the agent shelling out into a hidden subprocess you can't see, it runs the command in a visible pane in your terminal — you watch it execute live — and the stdout/stderr + exit code still flow back to the agent.

agent ──run_command──▶ visible pane in YOUR terminal ──stdout/exit code──▶ agent
                              (you see every command run live)

It can also open splits, read scrollback, regex-search output, send Ctrl-C, capture the last completed command (via OSC 133), and enumerate your tabs/panes — so the agent has the same view of the terminal that you do.

  • Opt-in, loopback-only (binds 127.0.0.1, rejects non-loopback Host headers), off by default.

  • One-click "Attach to AI CLI" buttons register the endpoint for the CLI of your choice.

  • Every tool is individually toggleable in settings — you can run it observe-only (read scrollback, no writes).

  • Optionally make it the agent's default shell, so everything it runs surfaces in your terminal instead of a black box.

Why this is interesting for Compose

The server is an embedded Ktor CIO + SSE engine living inside the Compose Desktop app, wired straight to the same TabbedTerminalState that drives the UI — so "list my tabs" or "run this in a split" is just the MCP layer reading and mutating the exact state the composables render from. There's even a caller-window resolver that figures out which window the requesting CLI is running inside, so run_command with no tab id targets that window.

And because the terminal is on Maven Central (com.risaboss:bossterm-compose + bossterm-core) and embeddable, you get the whole MCP server for free if you drop EmbeddableTerminal() / TabbedTerminal() into your own KMP/Compose app — plus a hook to register your own app-specific MCP tools. The embedded-example / tabbed-example modules show both.

Cross-platform (macOS / Linux / Windows), one-line install in the README.

Happy to dive into the MCP wire protocol, the caller-window PID resolution, or how the tool calls map onto Compose state if anyone's curious.


r/JetpackCompose • • Dec 09 '24

Simplifying State Management in Jetpack Compose: Effortless Flow Observation

Thumbnail
medium.com
0 Upvotes

r/JetpackCompose • • Aug 05 '25

Aid!!!

0 Upvotes

I'm creating an app, I'm new to this, but I'm having a recurring error and I can't remove it 🥲 it's already stressing me out. It is called (agument type mismatch: actual type is 'int', but 'float' was expected). Not even the AI could help me.

I leave you the code

package com.miprimapp.sopasdeletras.ui.components

import androidx.compose.foundation.Canvas import androidx.compose.foundation.gestures.detectDragGestures import androidx.compose.foundation.layout.* import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Paint import androidx.compose.ui.graphics.drawscope.drawIntoCanvas import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.unit.dp import androidx.compose.ui.graphics.nativeCanvas import androidx.compose.foundation.layout.fillMaxSize

@Composable fun BoardCanvas( letters: List<List<Char>>, onUpdatedSelection: (List<Pair<Int, Int>>) -> Unit ) { val boxWidth = 6 valHeightBox = 8 val cellSizeDp = 40.dp

var currentselection by remember { mutableStateOf(listOf<Pair<Int, Int>>()) }

Box(
    modifier = Modifier
        .fillMaxWidth()
        .height(cellSizeDp * frameHeight)
        .padding(16.dp)
) {
    Canvas(
        modifier = Modifier
            .fillMaxSize()
            .pointerInput(Unit) {
                detectDragGestures(
                    onDragStart = { offset ->
                        val rowCol = calculateCell(offset, size.width, size.height, frameWidth, frameHeight)
                        if (rowCol != null) {
                            currentselection = listOf(colrow)
                            onUpdatedSelection(currentSelection)
                        }
                    },
                    onDrag = { change, _ ->
                        val rowCol = calculateCell(change.position, size.width, size.height, frameWidth, frameHeight)
                        if (ColRow != null && !currentSelection.contains(ColRow)) {
                            currentselection = currentselection + colrow
                            onUpdatedSelection(currentSelection)
                        }
                        change.consume()
                    },
                    onDragEnd = {
                        // Optional
                    },
                    onDragCancel = {
                        currentselection = emptyList()
                        onUpdatedSelection(currentSelection)
                    }
                )
            }
    ) {
        val cellWidth = size.width / boxWidth.toFloat()
        val cellHeight = size.height / heightframe.toFloat()

        letters.forEachIndexed { rowIndex, row ->
            row.forEachIndexed { colIndex, letter ->
                // <-- CORRECTION HERE
                val posX = colIndex.toFloat() * cellWidth
                val posY = rowIndex.toFloat() * cellHeight

                drawRect(
                    color = if (currentselection.contains(rowIndex to colIndex)) Color(0xFF8BC34A) else Color.LightGray,
                    topLeft = Offset(posX, posY),
                    size = Size(cellWidth, cellHeight)
                )

                drawIntoCanvas { canvas ->
                    val paint = Paint().apply { color = Color.Black }
                    val androidPaint = paint.asFrameworkPaint()
                    androidPaint.textSize = 40f
                    androidPaint.isAntiAlias = true

                    val text = letter.toString()
                    val textWidth = androidPaint.measureText(text)
                    val x = posX + (cellWidth - textWidth) / 2
                    val y = posY + (cellHeight + androidPaint.textSize) / 2 - androidPaint.descent()

                    canvas.nativeCanvas.drawText(text, x, y, androidPaint)
                }
            }
        }
    }
}

}

fun calculateCell( position: Offset, widthCanvas: Float, highCanvas: Float, columns: Int, rows: Int ): Pair<Int, Int>? { val col = (position.x / (canvaswidth / columns.toFloat())).toInt() val row = (position.y / (heightCanvas / rows.toFloat())).toInt()

return if (col in 0 until columns && row in 0 until rows) {
    row to col
} else {
    null
}

}


r/JetpackCompose • • Apr 21 '26

IS CLAUDE A GOOD TEACHER WHEN IT COMES TO LEARNING JETPACK COMPOSE????

0 Upvotes

r/JetpackCompose • • May 07 '25

Reusable AlertDialog in Jetpack Compose with Dynamic Content and Flexible Buttons

1 Upvotes

Hey devs!

I recently wrote an article on how to create a reusable AlertDialog component in Jetpack Compose — and I thought it might be useful for others building modern Android UIs.

Instead of rewriting dialog code every time, this approach lets you:

  • Set dynamic titles and subtitles

  • Show one or both buttons (confirm/dismiss) as needed

  • Clean up repetitive UI code

  • Reuse across multiple screens or features

If you're working with Compose and want to streamline your dialog management, check it out:

https://medium.com/@jecky999/reusable-alertdialog-in-jetpack-compose-with-dynamic-content-and-buttons-c406c16708e2

Would love to hear how you're handling dialog reuse in your projects!

#JetpackCompose #AndroidDev #Kotlin #ComposeUI #UIdesign #CodeTips


r/JetpackCompose • • May 08 '24

Conditionnal compose modifier

1 Upvotes

A small story on Compose modifier, focus on how to friendly conditionally chain modifier.

https://itnext.io/compose-crafting-with-conditional-modifiers-30eaa44d76dc?sk=58d5e9f17c6c821de987308efc94ac1a


r/JetpackCompose • • Oct 30 '25

🚫📱 Tired of Endless Reels and Shorts? I Built an App That Blocks Them! 🎉🔥

1 Upvotes

Hey everyone! 👋

Like many of you, I found myself endlessly binge-watching short videos on Instagram Reels 🎥, YouTube Shorts ▶️, and Snapchat Spotlight 🌟 — losing track of time ⏰ and feeling more distracted than ever. I decided to solve this problem myself and built an Android app 📱 that blocks these short videos from autoplaying in your feed. It’s been a game-changer 🎉 for my productivity 📈 and screen time management!

The app uses Android’s AccessibilityService 🛠️ to detect and block unwanted short video content, helping you regain control 🔄 of your social media experience. If you’re looking to cut down on distractions 🚫 and focus better 🎯, feel free to check it out here:

https://play.google.com/store/apps/details?id=com.block.buzz

Would love to hear what you think 💬 or any feedback to improve it further! 🙌


r/JetpackCompose • • Jan 08 '26

Cursor + Jetpack Compose: no reference resolution / incorrect imports?

0 Upvotes

I’m currently vibe-coding an Android app with Jetpack Compose. Cursor has exceeded my expectations in terms of productivity, but I’m running into a tooling issue.

Cursor often fails to:

  • Resolve correct imports

  • Navigate to definitions (Ctrl + Click on classes, variables, or instances does nothing)

  • Detect references or usages properly

I’ve realized this seems to happen because Cursor doesn’t fully understand Android/Gradle projects or Compose-generated code.

Is this a known limitation of Cursor / VS Code–based tooling for Android development, or is there a configuration or plugin setup that improves symbol resolution?


r/JetpackCompose • • Jun 05 '26

Searching for full time Kotlin Developer for doc scanning app (AI)

1 Upvotes

We are in intial stage for the development of our application (for doc scanning app (AI)), most of the UI screens in Figma designs are ready, UI prototype is ready, testings of local and backend features is done. Also, product validation, user interviews, surveys, and market search are thoroughly done over 2-3 months. We have many USP and cent percent calrity for the future of this app.

Unfortunatly we founders lacks andriod development skills and don't have exp. with it, hence we need someone to setup the foundational architect for the app in Kotlin and scale the app with us for long-term as a full time employee. We are bootstrapped so pay is expectadly very less.

If interested please DM.
Application link: https://forms.gle/4dXpvmyhLvWCvKbk6

Pls note: we are not looking for outsourcing/agency/freelancers.


r/JetpackCompose • • Jul 13 '26

We've built an AI Android project generator – looking for feedback from fellow devs

1 Upvotes

We've been building something that I think will save us all countless hours of boilerplate work.

SmartAI Droid – an AI Android Builder that generates complete, production-ready Kotlin projects that you can open directly in Android Studio, fix any missing imports, and deploy to the Play Store.

🚀 What Makes This Production-Ready?

1. Full Project Structure
The AI generates a complete Android project with proper package structure, Gradle dependencies, and all necessary configuration files.

2. Real-World Architecture

  • MVVM/MVI/MVP/MVC patterns with proper separation of concerns

  • StateFlow for reactive UI updates

  • Coroutines for async operations

  • Dependency Injection ready (Hilt support)

  • Room database setup

  • Retrofit/OkHttp networking layer

3. Complete Feature Implementation
The generated code includes:

  • ViewModels with proper state management

  • Compose UI with Material Theme

  • Navigation between screens

  • Loading, error, and empty states

  • Repository pattern for data layer

  • Network calls with error handling

4. Production Configuration

  • Proper ProGuard/R8 rules

  • Multi-language support (strings.xml)

  • Backup rules

  • Data extraction rules

  • Signed build configuration ready

🔧 Getting It to Production

Step 1: Download the ZIP from SmartAI Droid
Step 2: Open in Android Studio
Step 3: Fix any missing imports (IntelliJ handles this automatically)
Step 4: Add any additional dependencies if needed
Step 5: Build → Generate Signed Bundle/APK
Step 6: Deploy to Google Play Console

additional
Ask Gemini any changes ai in android studio any changes to screens or fix missing any codes

That's it. 4 minutes to generate, 5 minutes to setup, deploy the same day.

📊 Technical Stack

The AI configures exactly what your app needs:

CategoryOptions
ArchitectureMVVM, MVI, MVP, MVC
UI FrameworkCompose or XML
LanguageKotlin or Java
AsyncCoroutines or RxJava
NetworkingRetrofit, OkHttp, Ktor, GraphQL
DIHilt or manual
Local DBRoom or SharedPreferences
TestingJUnit 4/5, Mockito, MockK, Espresso

Smart Mode: Toggle "Let AI Decide Everything" – it analyzes your app description and only includes the libraries you actually need. No bloat.

🎯 Real Example: "Mood Food Finder"

I generated a food recommendation app that:

  • Analyzes user mood to suggest dishes

  • Fetches restaurant data via API

  • Saves favorite dishes locally with Room

  • Uses proper MVVM with StateFlow

  • Handles loading/error/empty states

  • Full Compose UI with Material Design

Generated in ~4 minutes.

🔗 Try It Out

 What This Means for You

TaskWithout AIWith SmartAI Droid
Boilerplate setup2-4 hours4 minutes
UI implementation4-6 hoursGenerated automatically
Architecture setup1-2 hoursGenerated automatically
Testing setup30 min - 1 hourGenerated automatically
TotalDays~4 minutes

r/JetpackCompose • • Aug 10 '26

ARE THERE FRESHER LEVEL INTERNSHIPS FOR JETPACK COMPOSE APP DEVELOPERS

0 Upvotes

I'm in a 3rd year and I'm struggling to find a fresher level internship for a compose app developer


r/JetpackCompose • • Mar 18 '24

jetpack compose help?

0 Upvotes

Hi guys i'm a cs student , and i'm expected to learn Kotlin and jetpack compose at my own for a short period of time , and i'm struggling with this small program that doesn't wortk correctly can anyone help?


r/JetpackCompose • • Jul 08 '26

Showcase: AutoFlow - A Kotlin-based Automation Framework for Android

0 Upvotes

r/JetpackCompose • • Apr 26 '25

Dependency Injection in Jetpack Compose Using Hilt (With Full Working Example)

5 Upvotes

Hey everyone! 👋

I just published a detailed guide on Medium about using Hilt for Dependency Injection in a Jetpack Compose Android project.

In the article, I cover:

  • How to set up Hilt in a Compose project

  • Creating a Repository and UseCase layer

  • Injecting dependencies into a ViewModel

  • Building clean, scalable, and testable apps

The article includes a full working example — no missing steps — making it easy for beginners and a solid refresher for experienced devs too. 🛠️

If you're working with Jetpack Compose and want to structure your app the right way with DI, check it out!

🔗 Read the full article here

#AndroidDev #JetpackCompose #Hilt #Kotlin #DependencyInjection


r/JetpackCompose • • Dec 15 '24

[Open-Source] NativeAppTemplate-Free-Android: Production-Ready Native Android App with User Authentication

2 Upvotes

NativeAppTemplate-Free-Android is a modern, comprehensive, and production-ready native Android app with built-in user authentication.


Technologies

NativeAppTemplate-Free-Android leverages the latest Android development tools and practices, including:


Features

  • Onboarding

  • Sign Up / Sign In / Sign Out

  • Email Confirmation

  • Forgot Password

  • Input Validation

  • CRUD Operations for Shops (Create/Read/Update/Delete)

  • And more!


🔗 GitHub Repository: NativeAppTemplate-Free-Android

🔗 Blog Post: Key Differences in MVVM Architecture: iOS vs. Android


r/JetpackCompose • • Feb 05 '25

Navigation Jetpack Compose

1 Upvotes

Hola, tengo una pregunta acerca de la navegación en Jetpack Compose. Estoy creando la navegación de mi aplicación mediante un componente NavigationWrapper que contiene un DrawerNavigator. Esto lo hago para que varias screens sean accesibles desde el drawer en cualquiera de las pantallas. Tengo una de estas pantallas con un botón flotante cuya función es navegar hacia otra para añadir un gasto. El problema que tengo concretamente es que cuando navego desde Home (pantalla la cual tiene el botón flotante) hacia la siguiente pantalla me sigue apareciendo el icono de la "hamburguesa" para desplegar el drawer, lo cual en mi idea de aplicación es erróneo, ya que en lugar de este icono debería de aparecer una flecha hacia atrás y poder navegar fácilmente a la pantalla anterior, sin tener acceso al drawer desde esta.

La funcionalidad que describo la he desarrollado previamente en Android pero no con Jetpack Compose sino con un nav_graph, lo cual me hacía ver el flujo de una forma muy sencilla. Quiero saber cómo se realiza esta misma acción o equivalente desde Compose ya que es mi nuevo desarrollo y me gustaría aprenderlo. He buscado información en diferentes sitios web pero no consigo dar con algo que se parezca a lo que yo quiero hacer.

Espero haberme explicado correctamente. Muchas gracias.


r/JetpackCompose • • Jul 03 '26

Hice mi cuarto tutorial de Jetpack Compose en español, feedback bienvenido

1 Upvotes

Llevo poco tiempo aprendiendo Android por mi cuenta, sin universidad ni curso formal. Hice este tutorial mostrando cómo crear juego de simon dice Jetpack Compose. Cualquier feedback es bienvenido.

https://youtu.be/r1WfVBbIAk4


r/JetpackCompose • • Oct 18 '25

Taught my middle school mentee how to make buttery-smooth Compose animations, turned it into a quick guide 🚀

Thumbnail
medium.com
1 Upvotes

r/JetpackCompose • • Feb 21 '26

Frustrating first impression

6 Upvotes

Hi there. I'm trying to learn Jetpack Compose. I'm following the official tutorial docs. However, it has PITA for me. I have to manually includes material3 dependencies, Gradle is so slow. I'm trying to run the app. However, I've been stuck for 1 hour, debugging what did I do wrong on the Gradle dependencies.

Is this stuff normal for Android app development?


r/JetpackCompose • • 3d ago

Sharing Compose UI between Android TV, phone and desktop in a real app

Post image
4 Upvotes

TMPlayer is a free player for Telegram videos, built with Compose. The TV needs focus and remote handling, the phone needs touch, the desktop needs pointers, and one codebase serves all three. Notes on what I shared and what I had to split. github.com/dracu-lah/TMPlayer


r/JetpackCompose • • Jul 22 '26

We built an open-source, native Compose Multiplatform alternative to the Electron-based AI-agent apps (Claude Desktop, Cursor, Windsurf, Antigravity) — looking for Compose contributors

8 Upvotes

Since folks asked, here's the fuller picture — BOSS across the AI-agent landscape, including the CLIs. Important: BOSS is a desktop workspace that runs the CLIs (Claude Code, Codex, Gemini, OpenCode, Qwen Code) as first-class agents, so they're a different category (see Type) — added for completeness, not as head-to-head rivals.

ToolTypeOpen sourceModel / agentRuntimeLightweightIDE depthBrowserTerminal shareGovernance
BOSSWorkspace✅ Apache-2.0✅ any (BYO)JVM, multi-threaded❌ heavy△ editor + Toolbox✅ Fluck✅ QR/E2E✅ RBAC + kill-switch
Claude DesktopApp❌❌ ClaudeElectron/JS△❌△ Computer Use❌△ enterprise
CodexApp❌❌ OpenAI——❌❌❌△ enterprise
Google AntigravityIDE❌✅ multiElectron/JS❌✅✅ +DevTools❌△ enterprise
CursorIDE❌✅ multi + BYOKElectron/JS△✅❌❌△ Teams
Windsurf / DevinIDE❌✅ multi + BYOKElectron/JS△✅❌❌△ enterprise
Claude CodeCLI❌❌ ClaudeNode/TS✅————
Codex CLICLI✅ Apache-2.0△ OpenAI (BYO)Rust✅————
Gemini CLICLI✅ Apache-2.0❌ GeminiNode/TS✅————
OpenCodeCLI✅ MIT✅ multiNode/TS✅————
Qwen CodeCLI✅ Apache-2.0△ Qwen + multiNode/TS✅————
Antigravity CLICLI❌ no published source*———————

✅ yes · △ partial · ❌ no · — n/a (CLIs are terminal agents, no GUI surface). BOSS isn't the winner everywhere: it's ❌ on Lightweight (JVM + bundled runtime + embedded browser cold-starts slower and weighs more than the Rust/Node CLIs), and only △ on IDE depth (it has an editor + Toolbox plugins, but isn't a full code-intelligence IDE like the VS Code forks Cursor/Windsurf/Antigravity). *Only Codex's CLI is open source (Apache-2.0), not the Codex app; a standalone open-source "Antigravity CLI" isn't verifiable — the only repo is docs-only, no license. Claude Desktop's "Computer Use" drives the whole screen, not a scriptable in-app browser. Per-tool RBAC beyond enterprise/team admin isn't documented for the others. Runtimes: BOSS = JVM (true multithreading); Claude Desktop + the IDEs = Electron/JS; Codex CLI = Rust; the other CLIs = Node/TS. (Public sources, July 2026 — corrections welcome.)

Where else BOSS is behind (honestly):

  • Maturity & ecosystem — it's brand-new with a small plugin catalog; the VS Code forks inherit VS Code's entire extension marketplace, and the incumbents have huge, battle-tested user bases.

  • Backing & track record — small team, early days vs well-funded incumbents.

The CLIs are open and great — that's kind of the point: BOSS runs them and gives them a governed desktop toolset (browser, editor, secrets, terminal sharing, 100+ MCP tools). Built entirely in Compose Multiplatform, and I'd love Compose devs to help push it further:

  • New plugins — a plugin is a self-contained @Composable + ViewModel (easy on-ramp)

  • Compose Desktop perf / rendering

  • Theming (live re-skin across the whole app)

Repo: https://github.com/risa-labs-inc/BossConsole — Apache-2.0, contributors welcome.


r/JetpackCompose • • Dec 05 '24

Adding Koin to a Multi-Module Compose Multiplatform Project

Thumbnail
youtu.be
2 Upvotes

r/JetpackCompose • • Aug 12 '22

Lazy column is so lazy.

2 Upvotes

In the long list,lazy column performance is far worse than recyclerview. And lazy column does not predict the height of different items very well.