<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/jetc-dev-newsletter-issue-324-bbtnb20c0" -->

---
title: jetc.dev Newsletter Issue #324 | daily.dev
description: Issue #324 of the jetc.dev newsletter covers Jetpack Compose topics including when to avoid Canvas() in favor of drawBehind/drawWithContent/drawWithCache,...
canonical: https://daily.dev/posts/jetc-dev-newsletter-issue-324-bbtnb20c0
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: jetc.dev Newsletter Issue #324 | daily.dev
og:description: Issue #324 of the jetc.dev newsletter covers Jetpack Compose topics including when to avoid Canvas() in favor of drawBehind/drawWithContent/drawWithCache,...
og:url: https://daily.dev/posts/jetc-dev-newsletter-issue-324-bbtnb20c0
og:image: https://api.daily.dev/og/posts/BBtnB20C0.png
og:image:alt: jetc.dev Newsletter Issue #324
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# jetc.dev Newsletter Issue #324

**[Jetpack Compose Newsletter](https://daily.dev/sources/jetcdev)** · 4 min read · 0 upvotes · 0 comments

## Summary

Issue #324 of the jetc.dev newsletter covers Jetpack Compose topics including when to avoid Canvas() in favor of drawBehind/drawWithContent/drawWithCache, using PinnableContainer to keep composables alive beyond the viewport, and end-to-end testing for Compose Multiplatform via the Parikshan framework. Also highlighted: an accessibility scanner overlay (ComposeA11yScanner), a dockable panel layout library (DockLayout), a charting library (multiplot), a WhatsApp-style photo editor, and Compose Unstyled 2.9.0. Additional links cover UI state best practices, LazyColumn/LazyRow, performance, the new Grid() API, and web routing with Voyager in Compose Multiplatform.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://jetc.dev/issues/324.html>

## Questions this post answers

### What does PinnableContainer do in Jetpack Compose?

PinnableContainer lets you mark composables so they are not disposed simply because they leave the viewport. This is useful for heavier composables such as ExoPlayer instances or native ad wrappers, which are expensive to recreate when scrolled back into view.

_Developers optimizing scroll performance in Compose track library patterns like this on daily.dev._

### When should I avoid using Canvas() in Jetpack Compose and use drawBehind instead?

Canvas() is well suited for drawing new graphic elements, but creating a separate Canvas() just to decorate an existing composable is often the wrong approach. Modifiers like drawBehind(), drawWithContent(), and drawWithCache() give you a DrawScope that achieves the same visual result with a less expensive implementation.

_Compose developers weighing drawing APIs for performance follow discussions like this on daily.dev._

### Is there an end-to-end testing framework for Compose Multiplatform that works across all platform targets?

Parikshan is an end-to-end testing framework built for Compose Multiplatform that supports all major platform targets. It uses platform-specific solutions like Android's UiAutomator or Playwright where practical and embeds its own controller server for other platforms, all behind a common interface so Kotlin-based tests can run across platforms.

_Teams choosing a cross-platform testing setup for Compose Multiplatform can follow tooling updates on daily.dev._

---

Tags: [#testing](https://daily.dev/tags/testing), [#android](https://daily.dev/tags/android), [#kotlin](https://daily.dev/tags/kotlin), [#jetpack-compose](https://daily.dev/tags/jetpack-compose), [#compose-multiplatform](https://daily.dev/tags/compose-multiplatform)

[View this post on daily.dev](https://daily.dev/posts/jetc-dev-newsletter-issue-324-bbtnb20c0)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"jetc.dev Newsletter Issue #324","url":"https://daily.dev/posts/jetc-dev-newsletter-issue-324-bbtnb20c0","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/jetc-dev-newsletter-issue-324-bbtnb20c0"},"datePublished":"2026-07-28T13:01:27.909Z","dateModified":"2026-09-14T08:22:06.983Z","description":"Issue #324 of the jetc.dev newsletter covers Jetpack Compose topics including when to avoid Canvas() in favor of drawBehind/drawWithContent/drawWithCache,...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/35efa2658d79318a813a07ca20e8ddac?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/35efa2658d79318a813a07ca20e8ddac?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Jetpack Compose Newsletter","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Jetpack Compose Newsletter","logo":"https://media.daily.dev/image/upload/s--4CGwCUMy--/f_auto/v1728807065/logos/jetcdev","url":"https://daily.dev/sources/jetcdev"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/jetc-dev-newsletter-issue-324-bbtnb20c0","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"testing,android,kotlin,jetpack-compose,compose-multiplatform","timeRequired":"PT4M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Jetpack Compose Newsletter","item":"https://daily.dev/sources/jetcdev"},{"@type":"ListItem","position":3,"name":"jetc.dev Newsletter Issue #324"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/jetc-dev-newsletter-issue-324-bbtnb20c0#faq","mainEntity":[{"@type":"Question","name":"What does PinnableContainer do in Jetpack Compose?","acceptedAnswer":{"@type":"Answer","text":"PinnableContainer lets you mark composables so they are not disposed simply because they leave the viewport. This is useful for heavier composables such as ExoPlayer instances or native ad wrappers, which are expensive to recreate when scrolled back into view. Developers optimizing scroll performance in Compose track library patterns like this on daily.dev."}},{"@type":"Question","name":"When should I avoid using Canvas() in Jetpack Compose and use drawBehind instead?","acceptedAnswer":{"@type":"Answer","text":"Canvas() is well suited for drawing new graphic elements, but creating a separate Canvas() just to decorate an existing composable is often the wrong approach. Modifiers like drawBehind(), drawWithContent(), and drawWithCache() give you a DrawScope that achieves the same visual result with a less expensive implementation. Compose developers weighing drawing APIs for performance follow discussions like this on daily.dev."}},{"@type":"Question","name":"Is there an end-to-end testing framework for Compose Multiplatform that works across all platform targets?","acceptedAnswer":{"@type":"Answer","text":"Parikshan is an end-to-end testing framework built for Compose Multiplatform that supports all major platform targets. It uses platform-specific solutions like Android's UiAutomator or Playwright where practical and embeds its own controller server for other platforms, all behind a common interface so Kotlin-based tests can run across platforms. Teams choosing a cross-platform testing setup for Compose Multiplatform can follow tooling updates on daily.dev."}}]}
```

