<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>Author at Infinum</title>
		<atom:link href="https://infinum.com/blog/author/giorgio-provenzale/feed/" rel="self" type="application/rss+xml" />
		<link></link>
		<description>Building digital products</description>
		<lastBuildDate>Fri, 03 Apr 2026 12:58:20 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>19264334https://infinum.com/uploads/2025/02/Blog-hero-kotlin-ultiplatform-img-min.webp</url>
				</image>
				<title>Kotlin Multiplatform – Bridging Compose &#038; iOS UI Frameworks</title>
				<link>https://infinum.com/blog/kotlin-multiplatform-swiftui/</link>
				<pubDate>Wed, 26 Feb 2025 19:12:50 +0000</pubDate>
				<dc:creator>Giorgio Provenzale</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19264334</guid>
				<description>
					<![CDATA[<p>Exploring practical approaches to integrating Kotlin Compose with iOS frameworks like UIKit and SwiftUI.</p>
<p>The post <a href="https://infinum.com/blog/kotlin-multiplatform-swiftui/">Kotlin Multiplatform – Bridging Compose &amp; iOS UI Frameworks</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-223"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-93">
	<p	class='typography typography--size-36-text js-typography block-paragraph__paragraph'
	data-id='es-94'
	>
	<strong>Kotlin Multiplatform lets you share core business logic while still taking full advantage of native UI components. We explore practical approaches to integrating Kotlin Compose with iOS frameworks like UIKit and SwiftUI.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-97'
	>
	Mobile developers often face the challenge of balancing consistent business logic with the unique demands of each platform’s user interface. Kotlin Multiplatform (KMP) is a great choice for tackling this, allowing developers to write shared business logic while retaining platform-specific flexibility. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-99">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-100'
	>
	When it comes to integrating UI frameworks like Compose with native iOS components (e.g., SwiftUI or UIKit), KMP offers multiple approaches tailored to various use cases. This article discusses the core <code>expect/actual</code> pattern – the foundation of KMP&#8217;s platform-specific customizations – and presents two additional strategies: using <code>UIViewControllerRepresentable</code> to integrate SwiftUI and directly accessing iOS native APIs through <code>platform.UIKit</code>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-102">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-103'
	>
	<strong>The foundation: the <code>expect/actual</code> pattern in KMP</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-105">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-106'
	>
	The <code>expect/actual</code> pattern is the cornerstone of Kotlin Multiplatform development. It enables developers to define shared abstractions (<code>expect</code>) and provide platform-specific implementations (<code>actual</code>). This approach is particularly useful when you want to share as much logic as possible while accommodating platform-specific details, including UI components.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-110"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-108">
	<h3	class='typography typography--size-30-text js-typography block-heading__heading'
	data-id='es-109'
	>
	Example:</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-113"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-111">
	<h4	class='typography typography--size-24-text js-typography block-heading__heading'
	data-id='es-112'
	>
	<strong>Shared code: <code>expect</code> declaration</strong></h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-115"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">expect </span><span class="token">fun showPlatformDialog</span><span class="token">(message</span><span class="token">: </span><span class="token" style="color: #6f42c1;">String</span><span class="token">)
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-118"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-116">
	<h4	class='typography typography--size-24-text js-typography block-heading__heading'
	data-id='es-117'
	>
	<strong><strong>iOS implementation</strong></strong></h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-120"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">actual </span><span class="token">fun showPlatformDialog</span><span class="token">(message</span><span class="token">: </span><span class="token" style="color: #6f42c1;">String</span><span class="token">) {
</span></span><span class="line"><span class="token">    </span><span class="token">val </span><span class="token">alert </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">UIAlertController</span><span class="token">(
</span></span><span class="line"><span class="token">        title </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">iOS Dialog</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,
</span></span><span class="line"><span class="token">        message </span><span class="token" style="color: #d73a49;">=</span><span class="token"> message,
</span></span><span class="line"><span class="token">        preferredStyle </span><span class="token" style="color: #d73a49;">=</span><span class="token"> UIAlertControllerStyleAlert
</span></span><span class="line"><span class="token">    )
</span></span><span class="line"><span class="token">    alert</span><span class="token">.addAction</span><span class="token">(
</span></span><span class="line"><span class="token">        UIAlertAction</span><span class="token">.actionWithTitle</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">OK</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, UIAlertActionStyleDefault, </span><span class="token" style="color: #005cc5;">null</span><span class="token">)
</span></span><span class="line"><span class="token">    )
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">val </span><span class="token">rootViewController </span><span class="token" style="color: #d73a49;">=</span><span class="token"> UIApplication.sharedApplication.keyWindow?.rootViewController
</span></span><span class="line"><span class="token">    rootViewController</span><span class="token">?.presentViewController</span><span class="token">(alert, animated </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">, completion </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">null</span><span class="token">)
</span></span><span class="line"><span class="token">}
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-123"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-121">
	<h4	class='typography typography--size-24-text js-typography block-heading__heading'
	data-id='es-122'
	>
	<strong><strong>Android implementation</strong></strong></h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-125"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">actual </span><span class="token">fun showPlatformDialog</span><span class="token">(message</span><span class="token">: </span><span class="token" style="color: #6f42c1;">String</span><span class="token">) {
</span></span><span class="line"><span class="token">    AlertDialog</span><span class="token">.Builder</span><span class="token">(context)
</span></span><span class="line"><span class="token">        </span><span class="token">.setMessage</span><span class="token">(message)
</span></span><span class="line"><span class="token">        </span><span class="token">.setPositiveButton</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">OK</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, </span><span class="token" style="color: #005cc5;">null</span><span class="token">)
</span></span><span class="line"><span class="token">        </span><span class="token">.show</span><span class="token">()
</span></span><span class="line"><span class="token">}
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-128"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-126">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-127'
	>
	This pattern ensures:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-131"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-129">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-130'
	>
	<li><strong>Platform independence:</strong> Core logic remains in the shared module.</li><li><strong>Flexibility:</strong> Platform-specific UI implementations can vary greatly.</li><li><strong>Extensibility:</strong> New platforms can be added with minimal disruption.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-134"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-132">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-133'
	>
	While powerful, this pattern primarily handles business logic or modular UI components. More specialized use cases, such as embedding SwiftUI views or accessing native APIs directly, will require additional techniques.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-137"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-135">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-136'
	>
	<strong>1. Direct access to iOS APIs via <code>platform.UIKit</code></strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-140"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-138">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-139'
	>
	For developers requiring granular control over native iOS functionalities, directly accessing APIs via <code>platform.UIKit</code> is a powerful alternative. This method uses UIKit directly, allowing you to manipulate UIKit components and system APIs directly in Kotlin.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-143"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-141">
	<h3	class='typography typography--size-30-text js-typography block-heading__heading'
	data-id='es-142'
	>
	Example:</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-146"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-144">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-145'
	>
	Again, we’ll start with the first dialog example.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-149"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-147">
	<h4	class='typography typography--size-24-text js-typography block-heading__heading'
	data-id='es-148'
	>
	<strong><strong>Shared code: <code>expect</code> declaration</strong></strong></h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-151"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">expect </span><span class="token">fun showPlatformDialog</span><span class="token">(message</span><span class="token">: </span><span class="token" style="color: #6f42c1;">String</span><span class="token">)
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-154"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-152">
	<h4	class='typography typography--size-24-text js-typography block-heading__heading'
	data-id='es-153'
	>
	<strong><strong><strong>iOS implementation: creating and displaying a native alert dialog</strong></strong></strong></h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-156"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">import</span><span class="token"> </span><span class="token" style="color: #6f42c1;">platform.UIKit.</span><span class="token" style="color: #005cc5;">*</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">actual </span><span class="token">fun showPlatformDialog</span><span class="token">() {
</span></span><span class="line"><span class="token">    </span><span class="token">val </span><span class="token">alert </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">UIAlertController</span><span class="token">(
</span></span><span class="line"><span class="token">        title </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Native Dialog</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,
</span></span><span class="line"><span class="token">        message </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">This is a native dialog</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,
</span></span><span class="line"><span class="token">        preferredStyle </span><span class="token" style="color: #d73a49;">=</span><span class="token"> UIAlertControllerStyleAlert
</span></span><span class="line"><span class="token">    )
</span></span><span class="line"><span class="token">    alert</span><span class="token">.addAction</span><span class="token">(
</span></span><span class="line"><span class="token">        UIAlertAction</span><span class="token">.actionWithTitle</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">OK</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,
</span></span><span class="line"><span class="token">UIAlertActionStyleDefault, </span><span class="token" style="color: #005cc5;">null</span><span class="token">)
</span></span><span class="line"><span class="token">    )
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">val </span><span class="token">rootViewController </span><span class="token" style="color: #d73a49;">=</span><span class="token">
</span></span><span class="line"><span class="token">UIApplication.sharedApplication.keyWindow?.rootViewController
</span></span><span class="line"><span class="token">    rootViewController</span><span class="token">?.presentViewController</span><span class="token">(alert, animated </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">, completion </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">null</span><span class="token">)
</span></span><span class="line"><span class="token">}
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-159"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-157">
	<h4	class='typography typography--size-24-text js-typography block-heading__heading'
	data-id='es-158'
	>
	<strong><strong><strong>Integrating in a Composable:</strong></strong></strong></h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-161"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Composable</span><span class="token">
</span></span><span class="line"><span class="token">fun MyButtonWithNativeDialog</span><span class="token">() {
</span></span><span class="line"><span class="token">    </span><span class="token">Button</span><span class="token">(onClick </span><span class="token" style="color: #d73a49;">=</span><span class="token"> {
</span></span><span class="line"><span class="token">        </span><span class="token">showPlatformDialog</span><span class="token">()
</span></span><span class="line"><span class="token">    }) {
</span></span><span class="line"><span class="token">        </span><span class="token">Text</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Show Dialog</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">}
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-164"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-162">
	<h3	class='typography typography--size-30-text js-typography block-heading__heading'
	data-id='es-163'
	>
	Pros:</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-167"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-165">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-166'
	>
	<li>Provides unrestricted access to native iOS capabilities.</li><li>Ideal for leveraging platform-specific APIs not available in SwiftUI or Compose.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-170"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-168">
	<h3	class='typography typography--size-30-text js-typography block-heading__heading'
	data-id='es-169'
	>
	Cons:</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-173"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-171">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-172'
	>
	<li>Provides unrestricted access to native iOS capabilities.</li><li>Writing and maintaining platform-specific code can increase complexity.<br />
UI consistency between platforms requires additional effort.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-176"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-174">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-175'
	>
	<strong>2. Integration with <code>UIViewControllerRepresentable</code> for SwiftUI on iOS</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-179"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-177">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-178'
	>
	When dealing with existing SwiftUI components, the <code>UIViewControllerRepresentable</code> approach is invaluable. It wraps a SwiftUI view in a <code>UIViewController</code> that Kotlin Compose can embed. This is ideal for scenarios where SwiftUI views need to coexist with Compose.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-182"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-180">
	<h3	class='typography typography--size-30-text js-typography block-heading__heading'
	data-id='es-181'
	>
	Example:</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-185"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-183">
	<h4	class='typography typography--size-24-text js-typography block-heading__heading'
	data-id='es-184'
	>
	<strong><strong><strong>SwiftUI Code</strong></strong></strong></h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-187"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">struct MySwiftUIView</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">View </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">var body:</span><span class="token"> </span><span class="token" style="color: #d73a49;">some</span><span class="token"> View </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">VStack</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">Text(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Hello from SwiftUI!</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">Button(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Click Me</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">print</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Button clicked</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-190"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-188">
	<h4	class='typography typography--size-24-text js-typography block-heading__heading'
	data-id='es-189'
	>
	<strong><strong><strong>Creating a <code>UIViewControllerRepresentable</code></strong></strong></strong></h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-192"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">import</span><span class="token"> </span><span class="token" style="color: #6f42c1;">SwiftUI</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">import</span><span class="token"> </span><span class="token" style="color: #6f42c1;">UIKit</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">struct MySwiftUIViewController</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">UIViewControllerRepresentable </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">func makeUIViewController</span><span class="token">(</span><span class="token">context</span><span class="token">: </span><span class="token">Context</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token">UIHostingController</span><span class="token">&lt;</span><span class="token">MySwiftUIView</span><span class="token">&gt;</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token">UIHostingController(</span><span class="token">rootView:</span><span class="token"> </span><span class="token">MySwiftUIView(</span><span class="token">)</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">func updateUIViewController</span><span class="token">(</span><span class="token">_ uiViewController</span><span class="token">: </span><span class="token">UIHostingController</span><span class="token">&lt;</span><span class="token">MySwiftUIView</span><span class="token">&gt;</span><span class="token">, </span><span class="token">context</span><span class="token">: </span><span class="token">Context</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">&lt;em&gt;/</span><span class="token" style="color: #d73a49;">/ U</span><span class="token" style="color: #6a737d;">pdate logic, if needed&lt;/em&gt;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-195"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-193">
	<h4	class='typography typography--size-24-text js-typography block-heading__heading'
	data-id='es-194'
	>
	<strong><strong><strong>Embedding the SwiftUI View Controller in Kotlin Compose</strong></strong></strong></h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-197"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Composable</span><span class="token">
</span></span><span class="line"><span class="token">fun MyComposableView</span><span class="token">() {
</span></span><span class="line"><span class="token">    </span><span class="token">UIKitView</span><span class="token">(
</span></span><span class="line"><span class="token">        factory </span><span class="token" style="color: #d73a49;">=</span><span class="token"> { </span><span class="token">MySwiftUIViewController</span><span class="token">() },
</span></span><span class="line"><span class="token">        modifier </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Modifier</span><span class="token">.fillMaxSize</span><span class="token">()
</span></span><span class="line"><span class="token">    )
</span></span><span class="line"><span class="token">}
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-200"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-198">
	<h3	class='typography typography--size-30-text js-typography block-heading__heading'
	data-id='es-199'
	>
	Pros:</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-203"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-201">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-202'
	>
	<li>Provides unrestricted access to native iOS capabilities.</li><li>Reuses SwiftUI components effortlessly within Kotlin Compose.<br />
Provides full access to SwiftUI&#8217;s advanced features.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-206"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-204">
	<h3	class='typography typography--size-30-text js-typography block-heading__heading'
	data-id='es-205'
	>
	Cons:</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-209"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-207">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-208'
	>
	<li>Overhead in managing state and synchronization between Compose and SwiftUI.</li><li>Bridging between two UI frameworks may affect performance for complex UIs.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-212"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-210">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-211'
	>
	<strong>Navigating Kotlin Compose and iOS frameworks</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-215"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-213">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-214'
	>
	The interoperability between Kotlin Compose and iOS frameworks offers a wide range of possibilities, each with its strengths:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-218"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-216">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-217'
	>
	<li><strong>The</strong> <code><strong>expect/actual</strong></code><strong> pattern</strong> serves as the cornerstone, enabling clean abstractions and cross-platform consistency.</li><li><strong>Direct access to iOS APIs</strong> offers unmatched control for custom functionality, making it suitable for scenarios requiring precise native behavior.</li><li><strong>SwiftUI integration</strong> provides a seamless way to reuse or embed native declarative components, ideal for projects prioritizing iOS-native aesthetics.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-221"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-219">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-220'
	>
	Choosing the right approach depends on your project’s goals and constraints. Thanks to Kotlin Multiplatform adaptability, developers are not tied to a single solution but can leverage the best of both Compose and native frameworks to build robust, flexible, and maintainable applications.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/kotlin-multiplatform-swiftui/">Kotlin Multiplatform – Bridging Compose &amp; iOS UI Frameworks</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>39437https://infinum.com/uploads/2023/06/Automated-dependency-hero.webp</url>
				</image>
				<title>Automate Gradle Dependency Updates on Your Android Project</title>
				<link>https://infinum.com/blog/automated-gradle-dependency-updates/</link>
				<pubDate>Tue, 20 Jun 2023 10:13:21 +0000</pubDate>
				<dc:creator>Giorgio Provenzale</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=39437</guid>
				<description>
					<![CDATA[<p>Leverage Version Catalog and GitHub Action to effortlessly manage Gradle dependency updates.</p>
<p>The post <a href="https://infinum.com/blog/automated-gradle-dependency-updates/">Automate Gradle Dependency Updates on Your Android Project</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-383"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-224">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-227"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-225">
	<p	class='typography typography--size-36-text js-typography block-paragraph__paragraph'
	data-id='es-226'
	>
	Managing Gradle dependencies on an Android project doesn’t have to be a hassle when you know how to leverage the Gradle Version Catalog and automate maintenance with a GitHub Action. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-230"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-228">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-229'
	>
	Modern Android projects usually include a lot of Gradle dependencies. Keeping them up-to-date at all times can sometimes be a difficult and time-consuming task.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-233"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-231">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-232'
	>
	A great solution for getting the upper hand in this situation is the Gradle Version Catalog – it serves as a central declaration of dependencies, and it’s useful for managing the dependencies on any Android project. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-236"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-234">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-235'
	>
	This article will show you how to write a version catalog and include it in your Android project. It also gives an overview of the <a href="https://github.com/littlerobots/version-catalog-update-plugin">Version Catalog Update Plugin</a>, which allows you to update the catalog automatically by checking all the dependencies included. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-239"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-237">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-238'
	>
	Finally, we will help you automate this process using a GitHub Action and start a periodic check to keep all the dependencies up to date.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-242"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-240">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-241'
	>
	How Gradle Version Catalog works</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-245"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-243">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-244'
	>
	The Gradle Version Catalog is a feature introduced in Gradle 7.0 that allows you to define and manage different versions of dependencies used in your Gradle builds. It provides a centralized way to declare and control the versions of external dependencies used in your project. With the Gradle Version Catalog, you can define a catalog file that lists the versions of your dependencies, plugins, and other artifacts.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-248"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-246">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-247'
	>
	Version catalogs can be declared in the <code>settings.gradle.kts</code> file, but the best way to take advantage of them is to use an external file named <code>libs.versions.toml</code> inside the <code>gradle</code> folder in the root of the Android project.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-251"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-249">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-250'
	>
	Here’s an example of a version catalog file:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-253"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[versions]
</span></span><span class="line"><span class="token">android</span><span class="token" style="color: #d73a49;">-</span><span class="token">gradle</span><span class="token" style="color: #d73a49;">-</span><span class="token">plugin </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">8.0.0</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">gson </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">2.10.1</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">kotlin </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">1.8.20</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">lottie </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">6.0.0</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">material </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">1.8.0</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">room </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">2.5.1</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">timber </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">5.0.1</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">[libraries]
</span></span><span class="line"><span class="token">gson </span><span class="token" style="color: #d73a49;">=</span><span class="token"> { module </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">com.google.code.gson:gson</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, version.ref </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">gson</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> }
</span></span><span class="line"><span class="token">lottie </span><span class="token" style="color: #d73a49;">=</span><span class="token"> { module </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">com.airbnb.android:lottie-compose</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, version.ref </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">lottie</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> }
</span></span><span class="line"><span class="token">material </span><span class="token" style="color: #d73a49;">=</span><span class="token"> { module </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">com.google.android.material:material</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, version.ref </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">material</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> }
</span></span><span class="line"><span class="token">room</span><span class="token" style="color: #d73a49;">-</span><span class="token">ktx </span><span class="token" style="color: #d73a49;">=</span><span class="token"> { module </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">androidx.room:room-ktx</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, version.ref </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">room</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> }
</span></span><span class="line"><span class="token">room</span><span class="token" style="color: #d73a49;">-</span><span class="token">runtime </span><span class="token" style="color: #d73a49;">=</span><span class="token"> { module </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">androidx.room:room-runtime</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, version.ref </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">room</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> }
</span></span><span class="line"><span class="token">timber </span><span class="token" style="color: #d73a49;">=</span><span class="token"> { module </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">com.jakewharton.timber:timber</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, version.ref </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">timber</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> }
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">[bundles]
</span></span><span class="line"><span class="token">room </span><span class="token" style="color: #d73a49;">=</span><span class="token"> [
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">room-ktx</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">room-runtime</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,
</span></span><span class="line"><span class="token">]
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">[plugins]
</span></span><span class="line"><span class="token">android</span><span class="token" style="color: #d73a49;">-</span><span class="token">application </span><span class="token" style="color: #d73a49;">=</span><span class="token"> { id </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">com.android.application</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, version.ref </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">android-gradle-plugin</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> }
</span></span><span class="line"><span class="token">android</span><span class="token" style="color: #d73a49;">-</span><span class="token">library </span><span class="token" style="color: #d73a49;">=</span><span class="token"> { id </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">com.android.library</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, version.ref </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">android-gradle-plugin</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> }
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-256"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-254">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-255'
	>
	The catalog is divided into four parts: </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-260"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-257">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text js-typography bullet__heading'
	data-id='es-258'
	>
	<strong>Versions</strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-259'
	>
	Used for declaring the versions used in other sections.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-264"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-261">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text js-typography bullet__heading'
	data-id='es-262'
	>
	<strong><strong>Libraries</strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-263'
	>
	Several dependencies are declared using the previously declared versions.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-268"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-265">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text js-typography bullet__heading'
	data-id='es-266'
	>
	<strong><strong><strong>Bundles</strong></strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-267'
	>
	You can use it to combine more libraries in a single dependency.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-272"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-269">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text js-typography bullet__heading'
	data-id='es-270'
	>
	<strong><strong><strong><strong>Plugins</strong></strong></strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-271'
	>
	Focused on the plugins we can import into our Android projects.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-275"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-273">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-274'
	>
	Once the version catalog file is ready, it is possible to use Gradle dependencies in the <code>build.gradle</code> file.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-278"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-276">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-277'
	>
	To import a single dependency, we can use:&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-280"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">implementation</span><span class="token">(libs.lottie)
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-283"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-281">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-282'
	>
	The bundles are useful for importing several logically related Gradle dependencies at once. In this example, the dependencies related to Room:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-285"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">implementation</span><span class="token">(libs.bundles.room)
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-288"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-286">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-287'
	>
	The plugins can be used in the Gradle file as follows:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-290"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">plugins </span><span class="token">{
</span></span><span class="line"><span class="token">    </span><span class="token">alias</span><span class="token">(libs.plugins.android.application) apply </span><span class="token" style="color: #005cc5;">false</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">alias</span><span class="token">(libs.plugins.android.library) apply </span><span class="token" style="color: #005cc5;">false</span><span class="token">
</span></span><span class="line"><span class="token">}
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-293"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-291">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-292'
	>
	The file also accepts different version notations to highlight which version is preferred.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-295"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[versions]
</span></span><span class="line"><span class="token">my</span><span class="token" style="color: #d73a49;">-</span><span class="token">lib </span><span class="token" style="color: #d73a49;">=</span><span class="token"> { strictly </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">[1.0, 2.0[</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, prefer </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">1.2</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> }
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-298"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-296">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-297'
	>
	There are various annotation options we can also use in the libraries section, but this is out of the scope of this article, and all the useful information can be found in the <a href="https://docs.gradle.org/current/userguide/platforms.html">official documentation</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-301"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-299">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-300'
	>
	Keep your Gradle dependencies up to date with the Version Catalog Update Plugin</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-304"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-302">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-303'
	>
	To update the dependencies of an Android project, you will need two different Gradle plugins:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-307"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-305">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-306'
	>
	<li><a href="https://github.com/littlerobots/version-catalog-update-plugin">Version Catalog Update Plugin</a></li><li><a href="https://github.com/ben-manes/gradle-versions-plugin">Gradle Versions Plugin</a></li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-310"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-308">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-309'
	>
	The Version Catalog Update Plugin helps us keep all the versions in a Gradle version catalog TOML file up to date. This plugin uses the Gradle Versions Plugin to determine the version update.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-313"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-311">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-312'
	>
	First of all, we need to install the plugins:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-315"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">plugins </span><span class="token">{
</span></span><span class="line"><span class="token">  id </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">com.github.ben-manes.versions</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> version </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">0.41.0</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">  id </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">nl.littlerobots.version-catalog-update</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> version </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">&lt;latest version&gt;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">}
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-318"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-316">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-317'
	>
	Once the plugins are installed, to update the catalog file, you can execute the command <code>./gradlew versionCatalogUpdate</code> at any time. This command handles the following tasks:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-321"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-319">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-320'
	>
	<li>It updates any new versions available in the catalog while preserving existing version groups, if any.</li><li>It sorts the keys used in versions, libraries, bundles, and plugins by name (optional).</li><li>It updates bundles to include only valid keys and sorts the keys within a bundle.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-324"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-322">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-323'
	>
	The catalog will not receive any new entries, but any unused entries will be eliminated.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-327"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-325">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-326'
	>
	If you want to format the current <code>libs.versions.toml</code> file without making any changes to library versions, you can execute the command <code>./gradlew versionCatalogFormat</code>. By doing this, the version catalog will be properly formatted, and new version references will be generated, similar to how the <code>versionCatalogUpdate</code> task functions. This is particularly useful when you’ve added an entry to the version catalog but are not yet prepared to update any gradle dependencies.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-330"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-328">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-329'
	>
	These two plugins come with a lot of configurations and options, which are well-described in GitHub repositories.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-333"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-331">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-332'
	>
	An important option that deserves mentioning is the logic that allows you to accept only stable versions. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-336"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-334">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-335'
	>
	You can create a function in the Gradle file in the following way:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-338"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">fun isNonStable</span><span class="token">(version</span><span class="token">: </span><span class="token" style="color: #6f42c1;">String</span><span class="token">)</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Boolean</span><span class="token"> </span><span class="token">{
</span></span><span class="line"><span class="token">    </span><span class="token">val </span><span class="token">stableKeyword </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">listOf</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">RELEASE</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">FINAL</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">, </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">GA</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">.any </span><span class="token">{ version</span><span class="token">.uppercase</span><span class="token">()</span><span class="token">.contains</span><span class="token">(it) }
</span></span><span class="line"><span class="token">    </span><span class="token">val </span><span class="token">regex </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">^[0-9,.v-]+(-r)?$</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">.toRegex</span><span class="token">()
</span></span><span class="line"><span class="token">    </span><span class="token">val </span><span class="token">isStable </span><span class="token" style="color: #d73a49;">=</span><span class="token"> stableKeyword </span><span class="token" style="color: #d73a49;">||</span><span class="token"> regex</span><span class="token">.matches</span><span class="token">(version)
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">return</span><span class="token"> isStable</span><span class="token">.not</span><span class="token">()
</span></span><span class="line"><span class="token">}
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-341"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-339">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-340'
	>
	Of course, it is a bit generic, but it can work in almost all cases to identify whether a dependency version is stable or not.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-344"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-342">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-343'
	>
	Once this function is present, it can be used as a filter on the task <code>versionCatalogUpdate</code>:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-346"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">tasks</span><span class="token">.named</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">dependencyUpdates</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">.configure </span><span class="token">{
</span></span><span class="line"><span class="token">  </span><span class="token">rejectVersionIf </span><span class="token">{
</span></span><span class="line"><span class="token">    </span><span class="token">isNonStable</span><span class="token">(it.candidate.version)
</span></span><span class="line"><span class="token">  }
</span></span><span class="line"><span class="token">}
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-349"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-347">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-348'
	>
	Automating Gradle dependency updates with GitHub Action</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-352"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-350">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-351'
	>
	The process described in the previous two sections can easily be automated using a GitHub Action.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-355"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-353">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-354'
	>
	Let’s see an example of a GitHub Action that automates this process:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-357"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-yaml github-light" data-language="yaml" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #22863a;">n</span><span class="token" style="color: #22863a;">ame</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">U</span><span class="token" style="color: #032f62;">pdate Dependencies</span><span class="token">
</span></span><span class="line"><span class="token"> </span><span class="token" style="color: #005cc5;">on</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">   </span><span class="token" style="color: #22863a;">w</span><span class="token" style="color: #22863a;">orkflow_dispatch</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">   </span><span class="token" style="color: #22863a;">s</span><span class="token" style="color: #22863a;">chedule</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">     </span><span class="token">-</span><span class="token"> </span><span class="token" style="color: #22863a;">c</span><span class="token" style="color: #22863a;">ron</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;">00 6 1 * *</span><span class="token" style="color: #032f62;">&#039;</span><span class="token">
</span></span><span class="line"><span class="token"> </span><span class="token" style="color: #22863a;">j</span><span class="token" style="color: #22863a;">obs</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">   </span><span class="token" style="color: #22863a;">u</span><span class="token" style="color: #22863a;">pdate-dependencies</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">     </span><span class="token" style="color: #22863a;">r</span><span class="token" style="color: #22863a;">uns-on</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">u</span><span class="token" style="color: #032f62;">buntu-latest</span><span class="token">
</span></span><span class="line"><span class="token">     </span><span class="token" style="color: #22863a;">s</span><span class="token" style="color: #22863a;">teps</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">       </span><span class="token">-</span><span class="token"> </span><span class="token" style="color: #22863a;">u</span><span class="token" style="color: #22863a;">ses</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">a</span><span class="token" style="color: #032f62;">ctions/checkout@v3</span><span class="token">
</span></span><span class="line"><span class="token">       </span><span class="token">-</span><span class="token"> </span><span class="token" style="color: #22863a;">u</span><span class="token" style="color: #22863a;">ses</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">a</span><span class="token" style="color: #032f62;">ctions/setup-java@v1</span><span class="token">
</span></span><span class="line"><span class="token">         </span><span class="token" style="color: #22863a;">w</span><span class="token" style="color: #22863a;">ith</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">           </span><span class="token" style="color: #22863a;">j</span><span class="token" style="color: #22863a;">ava-version</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">11</span><span class="token">
</span></span><span class="line"><span class="token">       </span><span class="token">-</span><span class="token"> </span><span class="token" style="color: #22863a;">n</span><span class="token" style="color: #22863a;">ame</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">G</span><span class="token" style="color: #032f62;">rant execute permission for gradlew</span><span class="token">
</span></span><span class="line"><span class="token">         </span><span class="token" style="color: #22863a;">r</span><span class="token" style="color: #22863a;">un</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">c</span><span class="token" style="color: #032f62;">hmod +x gradlew</span><span class="token">
</span></span><span class="line"><span class="token">       </span><span class="token">-</span><span class="token"> </span><span class="token" style="color: #22863a;">n</span><span class="token" style="color: #22863a;">ame</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">P</span><span class="token" style="color: #032f62;">erform dependencies resolution and update</span><span class="token">
</span></span><span class="line"><span class="token">         </span><span class="token" style="color: #22863a;">r</span><span class="token" style="color: #22863a;">un</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">.</span><span class="token" style="color: #032f62;">/gradlew versionCatalogUpdate</span><span class="token">
</span></span><span class="line"><span class="token">       </span><span class="token">-</span><span class="token"> </span><span class="token" style="color: #22863a;">n</span><span class="token" style="color: #22863a;">ame</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">C</span><span class="token" style="color: #032f62;">reate Pull Request</span><span class="token">
</span></span><span class="line"><span class="token">         </span><span class="token" style="color: #22863a;">u</span><span class="token" style="color: #22863a;">ses</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">p</span><span class="token" style="color: #032f62;">eter-evans/create-pull-request@v4</span><span class="token">
</span></span><span class="line"><span class="token">         </span><span class="token" style="color: #22863a;">w</span><span class="token" style="color: #22863a;">ith</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">           </span><span class="token" style="color: #22863a;">t</span><span class="token" style="color: #22863a;">oken</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">$</span><span class="token" style="color: #032f62;">{{ secrets.GITHUB_TOKEN }}</span><span class="token">
</span></span><span class="line"><span class="token">           </span><span class="token" style="color: #22863a;">c</span><span class="token" style="color: #22863a;">ommit-message</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">u</span><span class="token" style="color: #032f62;">pdate dependencies</span><span class="token">
</span></span><span class="line"><span class="token">           </span><span class="token" style="color: #22863a;">c</span><span class="token" style="color: #22863a;">ommitter</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">G</span><span class="token" style="color: #032f62;">itHub &lt;a href=&quot;mailto:noreply@github.com&quot;&gt;noreply@github.com&lt;/a&gt;</span><span class="token">
</span></span><span class="line"><span class="token">           </span><span class="token" style="color: #22863a;">a</span><span class="token" style="color: #22863a;">uthor</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">G</span><span class="token" style="color: #032f62;">itHub &lt;a href=&quot;mailto:noreply@github.com&quot;&gt;noreply@github.com&lt;/a&gt;</span><span class="token">
</span></span><span class="line"><span class="token">           </span><span class="token" style="color: #22863a;">t</span><span class="token" style="color: #22863a;">itle</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">U</span><span class="token" style="color: #032f62;">pdate dependencies</span><span class="token">
</span></span><span class="line"><span class="token">           </span><span class="token" style="color: #22863a;">b</span><span class="token" style="color: #22863a;">ody</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">|</span><span class="token" style="color: #b31d28;font-style: italic;">
</span></span><span class="line"><span class="token" style="color: #032f62;">             </span><span class="token" style="color: #032f62;">Dependencies update.
</span></span><span class="line"><span class="token" style="color: #032f62;">             Check the Version Catalog to see which dependencies need an update.
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #22863a;">b</span><span class="token" style="color: #22863a;">ranch</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">u</span><span class="token" style="color: #032f62;">pdate-dependencies</span><span class="token">
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #22863a;">d</span><span class="token" style="color: #22863a;">elete-branch</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #22863a;">l</span><span class="token" style="color: #22863a;">abels</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">|</span><span class="token" style="color: #b31d28;font-style: italic;">
</span></span><span class="line"><span class="token" style="color: #032f62;">          </span><span class="token" style="color: #032f62;">dependencies update
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-360"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-358">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-359'
	>
	First of all, the Action needs a name, and then you can set a schedule. In this case, it starts on the first day of every month at 6:00 AM.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-363"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-361">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-362'
	>
	The rest of the Action is basically composed by the project’s checkout. After that, the <code>versionCatalogUpdate</code> is invoked in a new <code>update-dependencies</code> branch, and finally, a pull request is created.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-366"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-364">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-365'
	>
	To create and customize the PR through a GitHub Action, we use the action <code>peter-evans/create-pull-request@v4</code>. All its configurations and options can be found in the <a href="https://github.com/peter-evans/create-pull-request">official repository</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-369"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-367">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-368'
	>
	Leverage Version Catalog and GitHub Action for effortless Gradle dependency management</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-372"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-370">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-371'
	>
	Managing Gradle dependencies in modern Android projects can be a challenging task, but utilizing a version catalog can greatly simplify the process. The Gradle Version Catalog provides a single source of truth so you can declare and control the versions of external dependencies used in your project. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-375"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-373">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-374'
	>
	Additionally, with the help of the Version Catalog Update Plugin and the Gradle Versions Plugin, it’s easy to keep our Gradle Versions Catalog up to date with any newly available versions. These plugins automate the process of updating the catalog file by checking for new versions and sorting the entries. With the ability to format the catalog file without changing versions, it provides flexibility when adding new entries.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-378"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-376">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-377'
	>
	Finally, we can utilize GitHub Action to save time and effort by automating the update process. This way, we can create a pull request with all the changes automatically.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-381"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-379">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-380'
	>
	By leveraging the power of the Gradle Version Catalog, along with the Version Catalog Update Plugin and a GitHub Action, you can efficiently manage and keep your Android project&#8217;s dependencies up to date. This approach saves time and effort, ensuring that your project benefits from the latest features and bug fixes in the external libraries you depend on.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/automated-gradle-dependency-updates/">Automate Gradle Dependency Updates on Your Android Project</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>