{"id":641,"date":"2025-09-14T01:39:09","date_gmt":"2025-09-14T01:39:09","guid":{"rendered":"https:\/\/boochlin.com\/?p=641"},"modified":"2025-11-12T12:25:54","modified_gmt":"2025-11-12T12:25:54","slug":"creationextras-inventoryapplication-%e9%80%99%e6%9c%89%e9%bb%9e%e8%b7%b3","status":"publish","type":"post","link":"https:\/\/boochlin.com\/?p=641","title":{"rendered":"CreationExtras.inventoryApplication() \u9019\u6709\u9ede\u8df3"},"content":{"rendered":"<h2 class=\"wp-block-heading\">CreationExtras \u5230\u5e95\u662f\u4ec0\u9ebc\uff1f<\/h2>\n<p>CreationExtras \u662f\u4e00\u500b\u5728 <strong>ViewModel \u5275\u5efa\u6642\u81ea\u52d5\u9644\u5e36\u7684\u300c\u984d\u5916\u8cc7\u8a0a\u5305\u88f9\u300d<\/strong>\u3002<\/p>\n<p>\u4ee5\u524d\uff0c\u60f3\u7d66 ViewModel \u50b3\u53c3\u6578\uff08\u5982 SavedStateHandle\uff09\uff0c\u4f60\u5f97\u70ba\u6bcf\u500b ViewModel \u5beb\u4e00\u500b\u5c08\u5c6c\u7684 Factory\uff0c\u9019\u65e2\u9ebb\u7169\u53c8\u5197\u9918\u3002<\/p>\n<p>CreationExtras \u7684\u51fa\u73fe\uff0c\u5c31\u662f\u70ba\u4e86\u89e3\u6c7a\u9019\u500b\u554f\u984c\uff0c\u5b83\u63d0\u4f9b\u4e86\u4e00\u500b<strong>\u6a19\u6e96\u5316\u7684\u7d71\u4e00\u7ba1\u9053<\/strong>\u4f86\u50b3\u905e\u6578\u64da\u3002<\/p>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<h3 class=\"wp-block-heading\">CreationExtras \u88e1\u9762\u6709\u4ec0\u9ebc\uff1f<\/h3>\n<p>\u5b83\u672c\u8cea\u4e0a\u662f\u4e00\u500b <strong>Map (\u9375\u503c\u5c0d)<\/strong>\u3002\u88e1\u9762\u6703\u5305\u542b\uff1a<\/p>\n<ul>\n<li><strong>\u7cfb\u7d71\u63d0\u4f9b\u7684\u6a19\u6e96\u8cc7\u8a0a\uff1a<\/strong>\n<ul>\n<li><strong>Application\u00a0<\/strong><\/li>\n<li><strong>SavedStateRegistryOwner \u76f8\u95dc\u8cc7\u8a0a\uff1a<\/strong> \u8b93 ViewModel \u53ef\u4ee5<strong>\u81ea\u52d5\u5275\u5efa SavedStateHandle<\/strong>\uff0c\u4fdd\u5b58\u548c\u6062\u5fa9 UI \u72c0\u614b\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u4f60\u81ea\u5b9a\u7fa9\u7684\u984d\u5916\u8cc7\u8a0a\uff1a<\/strong> \u4f60\u4e5f\u53ef\u4ee5\u5f80\u88e1\u9762\u653e\u4efb\u4f55\u4f60\u9700\u8981\u7684\u6578\u64da\u3002<\/li>\n<\/ul>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<h3 class=\"wp-block-heading\">CreationExtras \u5982\u4f55\u904b\u4f5c\uff1f<\/h3>\n<p>\u4f60\u901a\u5e38\u4e0d\u7528\u76f4\u63a5\u64cd\u4f5c\u5b83\uff0c\u6846\u67b6\u6703\u5728\u5e55\u5f8c\u8655\u7406\uff1a<\/p>\n<ol start=\"1\">\n<li>\u7576\u4f60\u4f7f\u7528 viewModel() \u51fd\u6578\u6642\uff0cAndroid \u7cfb\u7d71\u6703\u81ea\u52d5\u6536\u96c6\u7576\u524d\u7684\u4e0a\u4e0b\u6587\u8cc7\u8a0a\uff08\u5982 Application\u3001SavedStateRegistryOwner\uff09\uff0c\u5c07\u5b83\u5011\u6253\u5305\u6210 CreationExtras\u3002<\/li>\n<li><strong>Factory \u63a5\u6536\u4e26\u4f7f\u7528\uff1a<\/strong> \u4f60\u7528 viewModelFactory DSL \u5275\u5efa\u7684 Factory \u6703\u63a5\u6536\u9019\u500b CreationExtras\u3002\u5728 initializer \u88e1\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u7528 this.createSavedStateHandle() \u6216 inventoryApplication() \u9019\u6a23\u7684\u65b9\u6cd5\uff0c\u5b83\u5011\u5e95\u5c64\u5c31\u662f\u5f9e CreationExtras \u88e1\u63d0\u53d6\u6578\u64da\u4f86\u5efa\u69cb ViewModel\u3002<\/li>\n<\/ol>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<p><code><em>\/**<br \/>\n<\/em><em> * Extension function to queries for <\/em><em>[Application]<\/em><em> object and returns an instance of<br \/>\n<\/em><em> * <\/em><em>[InventoryApplication]<\/em><em>.<br \/>\n<\/em><em> *\/<br \/>\n<\/em>fun CreationExtras.inventoryApplication(): InventoryApplication =<br \/>\n(this[AndroidViewModelFactory.APPLICATION_KEY] as InventoryApplication)<\/code><\/p>\n<p>\u9019\u6bb5\u7a0b\u5f0f\u78bc\u662f\u4e00\u7a2e <strong>Kotlin \u7684\u64f4\u5145\u51fd\u5f0f (Extension Function)<\/strong>\u5c31\u662f\u70ba\u4e86\u89e3\u6c7a\u5e95\u4e0b\u7684\u72c0\u6cc1<\/p>\n<pre class=\"wp-block-code\"><code>class AppViewModelFactory : ViewModelProvider.Factory {\n\u00a0 \u00a0 override fun &lt;T : ViewModel&gt; create(modelClass: Class&lt;T&gt;, extras: CreationExtras): T {\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 if (modelClass.isAssignableFrom(GameViewModel::class.java)) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ \u5728\u9019\u88e1\u624b\u52d5\u5beb\u4e00\u6b21\u53d6\u503c\u548c\u8f49\u578b\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 val application = extras[AndroidViewModelFactory.APPLICATION_KEY] as InventoryApplication\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 val itemRepository = application.container.itemsRepository\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @Suppress(\"UNCHECKED_CAST\")\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return GameViewModel(itemRepository) as T\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\n\u00a0 \u00a0 \u00a0 \u00a0 if (modelClass.isAssignableFrom(SettingsViewModel::class.java)) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ \u5728\u9019\u88e1\u53c8\u5f97\u628a\u4e00\u6a21\u4e00\u6a23\u7684\u7a0b\u5f0f\u78bc\u518d\u5beb\u4e00\u6b21\uff01\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 val application = extras[AndroidViewModelFactory.APPLICATION_KEY] as InventoryApplication\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 val settingsRepository = application.container.settingsRepository\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @Suppress(\"UNCHECKED_CAST\")\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return SettingsViewModel(settingsRepository) as T\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\n\u00a0 \u00a0 \u00a0 \u00a0 throw IllegalArgumentException(\"Unknown ViewModel class\")\n\u00a0 \u00a0 }\n}<\/code><\/pre>\n<ol start=\"1\">\n<li><strong>\u6838\u5fc3\u554f\u984c<\/strong>\uff1aViewModel \u662f\u7531 Android \u6846\u67b6\u7ba1\u7406\u7684\uff0c\u6211\u5011\u4e0d\u80fd\u76f4\u63a5 new \u5b83\u3002\u4f46\u5b83\u5728\u5efa\u7acb\u6642\uff0c\u5e38\u5e38\u9700\u8981 Application Context \u6216 Repository \u9019\u985e\u4f9d\u8cf4\u3002\u5982\u4f55\u5b89\u5168\u53c8\u512a\u96c5\u5730\u628a\u9019\u4e9b\u4f9d\u8cf4\u50b3\u905e\u9032\u53bb\uff1f<\/li>\n<li><strong>\u73fe\u4ee3\u89e3\u6cd5\uff1aCreationExtras<\/strong> Android Jetpack \u7684\u73fe\u4ee3\u89e3\u6cd5\u662f CreationExtras\u3002\u4f60\u53ef\u4ee5\u628a\u5b83\u60f3\u50cf\u6210\u4e00\u500b\u7531\u6846\u67b6\u50b3\u905e\u904e\u4f86\u7684<strong>\u6a19\u6e96\u5316\u300c\u5de5\u5177\u7bb1\u300d<\/strong>\u3002\u7576\u6846\u67b6\u8981\u5efa\u7acb ViewModel \u6642\uff0c\u6703\u628a Application \u9019\u985e\u6709\u7528\u7684\u5de5\u5177\u653e\u9032\u7bb1\u5b50\u88e1\uff0c\u4ea4\u7d66\u4f60\u7684\u5de5\u5ee0\u3002<\/li>\n<li><strong>\u6377\u5f91<\/strong> \u76f4\u63a5\u5f9e\u300c\u5de5\u5177\u7bb1\u300d\u88e1\u62ff\u5de5\u5177\u7684\u7a0b\u5f0f\u78bc\u6bd4\u8f03\u56c9\u55e6\uff0c\u50cf\u9019\u6a23\uff1a<\/li>\n<\/ol>\n<pre class=\"wp-block-code\"><code>val application = extras[AndroidViewModelFactory.APPLICATION_KEY] as InventoryApplication<\/code><\/pre>\n<ol start=\"1\">\n<li>\u64f4\u5145\u51fd\u5f0f\uff0c\u5c31\u662f\u628a\u9019\u6bb5\u91cd\u8907\u3001\u919c\u964b\u7684\u7a0b\u5f0f\u78bc\uff0c\u5c01\u88dd\u6210\u4e00\u500b\u512a\u96c5\u7684\u6377\u5f91\uff1a fun CreationExtras.inventoryApplication(): &#8230;<\/li>\n<li><strong>\u76ee\u7684<\/strong>\uff1a\u70ba CreationExtras\uff08\u5de5\u5177\u7bb1\uff09\u589e\u52a0\u4e00\u500b\u540d\u70ba inventoryApplication() \u7684\u65b0\u529f\u80fd\u3002<\/li>\n<li><strong>\u4f5c\u7528<\/strong>\uff1a\u5e6b\u4f60\u5b8c\u6210\u300c\u7528\u5b98\u65b9\u9470\u5319\u6253\u958b\u5de5\u5177\u7bb1\uff0c\u62ff\u51fa Application \u5de5\u5177\uff0c\u4e26\u8f49\u63db\u6210\u4f60\u81ea\u8a02\u7684 InventoryApplication \u985e\u578b\u300d\u9019\u4e00\u6574\u5957\u64cd\u4f5c<\/li>\n<\/ol>\n<p><a href=\"https:\/\/jefflin1982.medium.com\/android-andoridviewmodel%E9%80%8F%E9%81%8Efactory%E5%BB%BA%E7%AB%8B%E5%A6%82%E4%BD%95%E8%A8%AD%E5%AE%9A-769e9544db24\">Android \u2014 AndoridViewModel\u900f\u904eFactory\u5efa\u7acb\u5e36\u6709\u53c3\u6578\u7684ViewModel\u5982\u4f55\u8a2d\u5b9a<\/a><\/p>\n<blockquote class=\"wp-block-quote\"><p>\u5176\u5be6viewModel \u7684constructor\u672c\u8eab\u61c9\u8a72\u662f\u8981\u88ab\u8a2d\u5b9a\u70baprivate constructor\u624d\u5c0d\uff0c<\/p><\/blockquote>\n<p><a href=\"https:\/\/blog.csdn.net\/vitaviva\/article\/details\/123321254\">https:\/\/blog.csdn.net\/vitaviva\/article\/details\/123321254<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>CreationExtras \u5230\u5e95\u662f\u4ec0\u9ebc\uff1f CreationExtras \u662f\u4e00\u500b\u5728 ViewModel \u5275\u5efa\u6642\u81ea\u52d5\u9644\u5e36\u7684\u300c\u984d\u5916\u8cc7\u8a0a\u5305\u88f9\u300d\u3002 \u4ee5\u524d\uff0c\u60f3\u7d66 ViewModel \u50b3\u53c3\u6578\uff08\u5982 SavedSta&#8230;<\/p>\n","protected":false},"author":1,"featured_media":847,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[81],"tags":[],"_links":{"self":[{"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/posts\/641"}],"collection":[{"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/boochlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=641"}],"version-history":[{"count":11,"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/posts\/641\/revisions"}],"predecessor-version":[{"id":848,"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/posts\/641\/revisions\/848"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/media\/847"}],"wp:attachment":[{"href":"https:\/\/boochlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/boochlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/boochlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}