<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Android on Chanzmao ʕ•ᴥ•ʔ Bear Blog</title>
		<link>https://chanzmao.benigumo.com/blog/android/</link>
		<description>Recent content in Android on Chanzmao ʕ•ᴥ•ʔ Bear Blog</description>
		<generator>Hugo</generator>
		<language>en-US</language>
		
		
		
			<copyright>Copyright © 2026, chanzmao</copyright>
		
		
			<lastBuildDate>Fri, 05 Jun 2026 08:11:30 +0900</lastBuildDate>
		
			<atom:link href="https://chanzmao.benigumo.com/blog/android/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>A Cleaner Way to Pass Navigation Arguments in Navigation 3</title>
				<link>https://chanzmao.benigumo.com/a-cleaner-way-to-pass-navigation-arguments-in-navigation-3/</link>
				<pubDate>Fri, 05 Jun 2026 08:11:30 +0900</pubDate>
				<guid>https://chanzmao.benigumo.com/a-cleaner-way-to-pass-navigation-arguments-in-navigation-3/</guid>
				<description>&lt;p&gt;Recently I came across an interesting article about using &lt;strong&gt;Hilt Assisted Injection with Jetpack Navigation 3&lt;/strong&gt; instead of relying on &lt;code&gt;SavedStateHandle&lt;/code&gt; for passing navigation arguments to a &lt;code&gt;ViewModel&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The idea is simple: rather than having a &lt;code&gt;ViewModel&lt;/code&gt; read navigation arguments from &lt;code&gt;SavedStateHandle&lt;/code&gt;, pass the route object directly through Assisted Injection.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-traditional-approach&#34;&gt;The Traditional Approach&lt;/h2&gt;&#xA;&lt;p&gt;For a long time, many Android apps have used &lt;code&gt;SavedStateHandle&lt;/code&gt; to retrieve navigation arguments:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;DetailViewModel&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    savedStateHandle&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt; SavedStateHandle&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt; ViewModel&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;val&lt;/span&gt; route &lt;span style=&#34;color:#1f2328&#34;&gt;=&lt;/span&gt; savedStateHandle&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;toRoute&lt;span style=&#34;color:#1f2328&#34;&gt;&amp;lt;&lt;/span&gt;DetailRoute&lt;span style=&#34;color:#1f2328&#34;&gt;&amp;gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works well, but it also means the &lt;code&gt;ViewModel&lt;/code&gt; knows about navigation-specific APIs.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
