{"id":444327,"date":"2025-01-08T21:00:55","date_gmt":"2025-01-08T21:00:55","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=444327"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=444327","title":{"rendered":"<span>Decompose: \u043f\u043e\u043a\u043e\u0440\u044f\u0435\u043c Generic-\u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043f\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0430\u043c<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>TL;DR<\/h2>\n<p><a href=\"https:\/\/github.com\/EricShelbogashev\/decompose-tab-navigation\" rel=\"noopener noreferrer nofollow\"><strong>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c<\/strong><\/a><\/p>\n<h4>\u0427\u0442\u043e \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c?<\/h4>\n<p>\u041a\u0430\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/www.jetbrains.com\/compose-multiplatform\/\" rel=\"noopener noreferrer nofollow\">compose<\/a>, kotlin multiplatform, <a href=\"https:\/\/github.com\/arkivanov\/Decompose\" rel=\"noopener noreferrer nofollow\">decompose<\/a>, model-view-intent, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u043f\u043e \u0442\u0430\u0431\u0430\u043c.<\/p>\n<h4>\u041a\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438?<\/h4>\n<ol>\n<li>\n<p>\u0412\u044b\u0431\u043e\u0440 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 (\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f\u0442 \u0432 \u0441\u043f\u044f\u0449\u0438\u0439 \u0440\u0435\u0436\u0438\u043c). <\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 (\u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439 \u0432\u044b\u0442\u0435\u0441\u043d\u0435\u043d\u0438\u044f).<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 (\u0441 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432).<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 (\u044d\u0442\u043e \u0442\u043e, \u0438\u0437 \u0447\u0435\u0433\u043e \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b; \u043d\u0430 \u0433\u0438\u0444\u043a\u0435 \u043d\u0438\u0436\u0435 \u044d\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 <code>readme.md<\/code>, <code>build.gradle.kts<\/code>) \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0430\u0442\u0430-\u043a\u043b\u0430\u0441\u0441\u044b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p>\ud83d\udd25 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\ud83d\udd25 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\ud83d\udd25 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438 \u0442\u0430\u0431\u043e\u0432 \u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430.<\/p>\n<\/li>\n<\/ol>\n<h4>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442?<\/h4>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0434\u0436\u043e\u0431\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0438 \u043c\u0435\u043d\u044f\u0435\u0442 <code>body<\/code> \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 <code>title.repeat(counter)<\/code> . \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u044e \u043b\u043e\u0433\u0438\u043a\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e68\/a31\/11e\/e68a3111e31687aeb4a713e966704247.gif\" alt=\"\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0432 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435. \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 CREATED. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438, \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u0441\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0437\u0430\u043c\u0438\u0440\u0430\u0435\u0442, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.P.S. 1 \u043c\u0431 gif. \u041f\u043e\u043c\u0438\u043b\u0443\u0439\u0442\u0435, \u043b\u044e\u0434\u0438 \u0434\u043e\u0431\u0440\u044b\u0435 \ud83d\ude4f\" title=\"\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0432 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435. \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 CREATED. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438, \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u0441\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0437\u0430\u043c\u0438\u0440\u0430\u0435\u0442, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.P.S. 1 \u043c\u0431 gif. \u041f\u043e\u043c\u0438\u043b\u0443\u0439\u0442\u0435, \u043b\u044e\u0434\u0438 \u0434\u043e\u0431\u0440\u044b\u0435 \ud83d\ude4f\" width=\"850\" height=\"646\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e68\/a31\/11e\/e68a3111e31687aeb4a713e966704247.gif\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0432 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435. \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 CREATED. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438, \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u0441\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0437\u0430\u043c\u0438\u0440\u0430\u0435\u0442, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>P.S. 1 \u043c\u0431 gif. \u041f\u043e\u043c\u0438\u043b\u0443\u0439\u0442\u0435, \u043b\u044e\u0434\u0438 \u0434\u043e\u0431\u0440\u044b\u0435 \ud83d\ude4f<\/figcaption><\/div>\n<\/figure>\n<h4>\u041a\u0430\u043a\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c?<\/h4>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437\u0430, \u0442\u043e\u043b\u044c\u043a\u043e core<\/p>\n<pre><code>com.arkivanov.essenty:lifecycle:2.4.0 com.arkivanov.decompose:decompose:3.2.2 com.arkivanov.decompose:extensions-compose:3.2.2 org.jetbrains.kotlin.plugin.serialization:2.1.0 org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3<\/code><\/pre>\n<h4>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c\u0441\u044f, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c:<br \/>1. \u0412\u043a\u043b\u0430\u0434\u043a\u0430 &#8212; \u044d\u0442\u043e \u0442\u0430 \u0441\u0430\u043c\u0430\u044f \u0448\u0442\u0443\u043a\u0430 \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 &#171;\u0437\u0430\u043a\u0440\u044b\u0442\u044c&#187;, ui-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438.<br \/>2. \u041f\u0430\u043d\u0435\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043e\u043a &#8212; \u044d\u0442\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0440, \u0433\u0434\u0435 \u044d\u0442\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u043b\u0435\u0436\u0430\u0442. \u0422\u0430 \u0441\u0430\u043c\u0430\u044f \u0448\u0442\u0443\u043a\u0430 \u0441\u0432\u0435\u0440\u0445\u0443, \u043a\u0430\u043a \u0432 Google Chrome.<br \/>3. \u0421\u043b\u043e\u0442 &#8212; \u044d\u0442\u043e decompose-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0433\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. <br \/>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435, \u0441\u043b\u043e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0438 \u0442\u0435\u043a\u0441\u0442, \u043f\u0440\u0438\u0447\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0418 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u043e\u0442\u043e\u0432 \u0442\u0430\u043c \u0434\u0432\u0430, \u043e\u0434\u0438\u043d \u0441\u0432\u044f\u0437\u0430\u043d \u0441 <code>readme.txt<\/code>, \u0434\u0440\u0443\u0433\u043e\u0439 \u0441 <code>build.gradle.kts<\/code> .<br \/>4. \u041a\u043e\u043d\u0442\u0435\u043d\u0442 \u0441\u043b\u043e\u0442\u0430 &#8212; \u044d\u0442\u043e ui-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043b\u043e\u0442\u0430. <br \/>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 &#8212; \u044d\u0442\u043e <code>Card { Text(counter), Text(body) }<\/code> .<br \/>5. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 &#8212; \u044d\u0442\u043e decompose-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043f\u0430\u043d\u0435\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0438 \u0441\u043b\u043e\u0442\u044b.<br \/>6. \u041a\u043e\u043d\u0442\u0435\u043d\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 &#8212; \u044d\u0442\u043e ui-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f ui \u043f\u0430\u043d\u0435\u043b\u0438 \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0438 \u0443\u043c\u0435\u0435\u0442 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0442 (\u0430 \u043c\u043e\u0436\u0435\u0442, \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0442\u043e\u0432, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 \u043a\u0430\u0440\u0443\u0441\u0435\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439).<\/p>\n<h4>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u043a\u043e\u0434\u0435?<\/h4>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c decompose-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u0435 \u0441\u043b\u043e\u0442\u044b, \u0438 \u0443\u043c\u0435\u044e\u0449\u0438\u0439 \u043f\u043e \u043d\u0438\u043c \u043d\u0430\u0432\u0438\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f (\u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439, \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043b\u043e\u0442\u043e\u0432)<\/p>\n<pre><code class=\"kotlin\">interface ContainerComponent&lt;out SlotComponent : Any&gt; {     val children: Value&lt;Children&lt;*, TabComponent&gt;&gt;      fun onSelect(index: Int) \/\/ \u0412 UI \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0443.     fun onMove(fromIndex: Int, toIndex: Int) \/\/ \u0412 UI \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0443.     fun onTabCloseClicked(index: Int) \/\/ \u0412 UI \u043d\u0430\u0436\u0430\u043b\u0438 \"\u0437\u0430\u043a\u0440\u044b\u0442\u044c\".      class Children&lt;out C : Any, out T : Any&gt;(         \/\/ \u0418\u043d\u0441\u0442\u0430\u043d\u0441\u044b \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0432\u043a\u043b\u0430\u0434\u043e\u043a - \u0438\u0445 decompose \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b.         val items: List&lt;Child.Created&lt;C, T&gt;&gt;,         \/\/ \u0410 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.          val selected: Int?,     ) }<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u0441\u043b\u043e\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f<\/p>\n<pre><code class=\"kotlin\">import kotlinx.serialization.Serializable  @Serializable data class Config(val filename: String)<\/code><\/pre>\n<p>\u0418 \u0442\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u043b\u044f\u043c\u0431\u0434\u0443 <code>slotFactory<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u043b\u043e\u0442:<\/p>\n<pre><code class=\"kotlin\">fun main() {   val lifecycle = LifecycleRegistry()   val stateKeeper = StateKeeperDispatcher(       savedState = File(SAVED_STATE_FILE_NAME).readSerializableContainer()   )      DefaultContainerComponent(       componentContext = DefaultComponentContext(           lifecycle = lifecycle,           stateKeeper = stateKeeper       ),       configurations = listOf(Config(\"readme.txt\"), Config(\"build.gradle.kts\")),       serializer = Config.serializer(),       slotFactory = { componentContext, config -&gt;           DefaultSlotComponent(componentContext, config.filename)       }   ) }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e decompose \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 <code>ComponentContext<\/code> \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0432\u043e\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435. \u042d\u0442\u043e\u0442 \u0437\u0432\u0435\u0440\u044c \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u043c\u0435\u043b:<\/p>\n<ul>\n<li>\n<p>\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b (\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c <code>LifecycleOwner<\/code> \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/github.com\/arkivanov\/Essenty\" rel=\"noopener noreferrer nofollow\">Essenty<\/a>)<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u043e\u043d \u0442\u044f\u0436\u0435\u043b\u044b\u0439) &#8212; \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f <code>StateKeeperOwner<\/code> \u0438\u0437 \u0442\u043e\u0439 \u0436\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435&#8230;<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0438 \u0431\u0435\u0433\u043b\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442 \u043c\u043e\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043c\u044b\u0441\u043b\u0435\u0439. \u041f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043e\u0442 kotlin-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043c \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e.<\/p>\n<h3>\u0414\u0430\u0432\u043d\u044b\u043c-\u0434\u0430\u0432\u043d\u043e, \u0432 \u0434\u0430\u043b\u0451\u043a\u043e\u0439-\u0434\u0430\u043b\u0451\u043a\u043e\u0439&#8230;<\/h3>\n<blockquote>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a <code>ComponentContext<\/code> \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0435\u043c\u0430\u0440\u043a\u0438. \u041f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438, <code>ComponentContext<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 decompose-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b &#171;\u0436\u0438\u0432\u044b\u043c\u0438&#187;, \u0438 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0441 \u043e\u0442 \u0433\u0440\u044f\u0437\u043d\u0435\u0439\u0448\u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439 callback-hell, \u0435\u0441\u043b\u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0432 \u043d\u0438\u0445 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c. <br \/>\u0410 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u043d \u043d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e: \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440 <code>LifecycleRegistry()<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u043f\u043e\u0447\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u0440\u0435\u0435\u0441\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0434\u0435\u0440\u0435\u0432\u043e. \u0412 \u0446\u0435\u043b\u043e\u043c, \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<\/p>\n<\/blockquote>\n<p>\u0421 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432\u044b\u0448\u0435 (\u0441\u043c. <em>&#171;\u041a\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438?&#187;<\/em>). \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0441 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0435\u0439:<\/p>\n<pre><code class=\"kotlin\">interface ContainerComponent&lt;out SlotComponent : Any&gt; {     val children: Value&lt;Children&lt;*, SlotComponent&gt;&gt;      fun onSelect(index: Int)     fun onMove(fromIndex: Int, toIndex: Int)     fun onTabCloseClicked(index: Int)      class Children&lt;out C : Any, out T : Any&gt;(         val items: List&lt;Child.Created&lt;C, T&gt;&gt;,         val selected: Int?,     ) }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ol>\n<li>\n<p><code>Value<\/code> &#8212; \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 <code>StateFlow<\/code>  &#8212; &#171;\u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439&#187;. \u041c\u044b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u0438 \u043c\u043e\u0436\u0435\u043c \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0422\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043b\u043e\u0442\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f (\u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043b\u043e\u0442\u043e\u0432, \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0430\u043c \u043d\u0430\u0431\u043e\u0440 \u0441\u043b\u043e\u0442\u043e\u0432), \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 \u044d\u0442\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u0438\u0435, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Value:<\/p>\n<pre><code class=\"kotlin\">package com.arkivanov.decompose.value  abstract class Value&lt;out T : Any&gt; {     \/\/ \u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 T.     abstract val value: T      \/* \u041f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f T.        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u043e\u0442\u043c\u0435\u043d\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 *\/     abstract fun subscribe(observer: (T) -&gt; Unit): Cancellation }<\/code><\/pre>\n<\/p>\n<\/li>\n<li>\n<p><code>Children<\/code> &#8212; \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c decompose-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0441\u043b\u043e\u0442\u043e\u0432 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c. \u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u044e\u0434\u0430 \u043b\u044e\u0431\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0440\u0435\u0436\u0438\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f: \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0438\u043b\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435<\/p>\n<\/li>\n<li>\n<p><code>SlotComponent<\/code> &#8212; \u044d\u0442\u043e \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u043b\u043e\u0442\u043e\u0432. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0441\u043b\u043e\u0442\u044b &#8212; \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a, \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 &#8212; \u0438 \u0442\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0442\u0438\u043f\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u0447\u0442\u043e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a. <br \/>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <code>DefaultSlotComponent<\/code> \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0437 <em>&#171;\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u043a\u043e\u0434\u0435?&#187;<\/em>.<\/p>\n<\/li>\n<li>\n<p><code>C<\/code> &#8212; \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0441\u043b\u043e\u0442\u0430 <code>Children<\/code>. \u041e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>imageURL<\/code> \u0438\u043b\u0438 <code>filePath<\/code> , \u0430, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, <code>dialogId<\/code> &#8212; \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0438\u0437 \u0447\u0435\u0433\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0430\u0448 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442. \u0421\u0442\u043e\u0438\u0442 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c <code>sealed<\/code>&#8212; \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e:<\/p>\n<pre><code class=\"kotlin\">@Serializable sealed interface SealedConfig {     @Serializable     data class Image(val uri: String): SealedConfig     @Serializable     data class File(val path: Path): SealedConfig }  fun main() {     val configurations = listOf(         SealedConfig.Image(\"http:\/\/www.example.com\"),         SealedConfig.File(Path.of(\"\/home\/users\/example\/.zprofile\")),     )          val containerComponent = runOnUiThread {         DefaultContainerComponent(             componentContext = DefaultComponentContext(LifecycleRegistry()),             configurations = configurations, \/\/ &lt;--- \u0442\u0443\u0442 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438             serializer = SealedConfig.serializer(),             slotFactory = { componentContext, config -&gt;                 when(config) { \/\/ &lt;---- \u0442\u0443\u0442 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c                     is SealedConfig.File -&gt; DefaultFileComponent(componentContext, config.path)                     is SealedConfig.Image -&gt; DefaultImageComponent(componentContext, config.uri)                 }             }         )     }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u043a\u0430\u043a \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f <code>runOnUiThread<\/code> &#8212; \u044d\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c, \u043f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u0430\u044f <a href=\"https:\/\/github.com\/arkivanov\/decompose-multiplatform-template\/blob\/894c062ef324a4395f367156f38507c4a2a29954\/app-desktop\/src\/jvmMain\/kotlin\/com\/example\/myapplication\/desktop\/Utils.kt\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>.<\/p>\n<\/li>\n<li>\n<p><code>Child.Created<\/code> &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u0430\u0441\u0441, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 <code>slotFactory<\/code> \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0441 \u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439.<\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u0441\u043e\u0437\u043d\u0430\u0432, \u0441 \u0447\u0435\u043c \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e (\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0441\u043b\u043e\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438), \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u043f\u043b\u043e\u0442\u0438\u043c \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432 \u0436\u0438\u0437\u043d\u044c.<\/p>\n<p>\u0412\u044b\u0448\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 <code>slotFactory<\/code> &#8212; \u0444\u0430\u0431\u0440\u0438\u043a\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0430\u044f \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (\u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c callback-\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 <code>onTabClose<\/code> ), \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u0432\u0441\u0435 \u0435\u0449\u0435 \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043d\u0430\u0440\u0443\u0436\u0443, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 ContainerComponent:<\/p>\n<pre><code class=\"kotlin\">class DefaultContainerComponent&lt;Configuration : Any, SlotComponent : Any&gt;(     componentContext: ComponentContext,     private val configurations: List&lt;Configuration&gt;,     serializer: KSerializer&lt;Configuration&gt;,     private val slotFactory: (componentContext: ComponentContext, config: Configuration) -&gt; SlotComponent ) : ComponentContext by componentContext, ContainerComponent&lt;SlotComponent&gt; {     override val children: Value&lt;Children&lt;*, SlotComponent&gt;&gt;         get() = TODO(\"Not yet implemented\")      override fun onSelect(index: Int) {         TODO(\"Not yet implemented\")     }      override fun onMove(fromIndex: Int, toIndex: Int) {         TODO(\"Not yet implemented\")     }      override fun onTabCloseClicked(index: Int) {         TODO(\"Not yet implemented\")     } }<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c. \u0412 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u0434\u0430\u0435\u043c <code>componentContext<\/code> \u0438 \u0442\u0443\u0442 \u0436\u0435 \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u043c \u0435\u043c\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u0415\u0441\u043b\u0438 \u044d\u0442\u0430 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432\u0430\u043c \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439, \u0432\u043e\u0442 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">interface Ping {     fun ping() }  class Pinger : Ping {     override fun ping() {         println(\"ping\")     } }  class Controller(pinger: Pinger) : Ping by pinger  fun main() {     Controller(Pinger()).ping() }<\/code><\/pre>\n<p>kotlin \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b-\u0445\u0430\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u043f\u043e\u043c\u0435\u043d\u044c\u0448\u0435, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u044b.<br \/>\u041a\u043e\u0434 \u0432\u044b\u0448\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435 \u043d\u0430 \u044d\u0442\u043e:<\/p>\n<pre><code class=\"kotlin\">class Controller(private val pinger: Pinger) : Ping {     override fun ping() {         pinger.ping()     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <code>serializer<\/code> &#8212; \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0432\u043a\u043b\u0430\u0434\u043e\u043a. \u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0443\u0436\u0435 \u0432\u0441\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 <code>slotFactory<\/code>.<\/p>\n<blockquote>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u043b\u043e\u0432\u0443\u0448\u043a\u0443 \u043e\u0442 <abbr class=\"habraabbr\" title=\"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u043e\u0442 Jetbrains Idea, \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432 TODO-\u043a\u043e\u0434\" data-title=\"&lt;p&gt;\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u043e\u0442 Jetbrains Idea, \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432 TODO-\u043a\u043e\u0434&lt;\/p&gt;\" data-abbr=\"Implement Members\">Implement Members<\/abbr>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u044e\u0431\u0435\u0437\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 <code>get()<\/code> \u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>children<\/code>. \u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u043e? \u0410 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e decompose \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043f\u043e \u043a\u043b\u044e\u0447\u0443, \u0438 \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0433\u0435\u0442\u0442\u0435\u0440, \u0442\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u0432 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c UI), \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0434\u0435\u0442\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>slotFactory<\/code> , \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u0438\u0445 \u0434\u0435\u0442\u0435\u0439 \u0432 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b, \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044e \u043f\u043e \u043a\u043b\u044e\u0447\u0430\u043c &#8212; \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 runtime \u043d\u0430\u043c \u0441\u043a\u0430\u0436\u0435\u0442 \u0444\u0430\u0442\u0430\u043b\u044c\u043d\u044b\u0439 Exception. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u044b\u0432\u0430\u0435\u043c \u0432 <code>override val children: Value&lt;Children&lt;*, SlotComponent&gt;&gt; = TODO(\"Not yet implemented\")<\/code> \u0438 \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u0435\u043c\u0441\u044f.<\/p>\n<\/blockquote>\n<h4>\u0423\u0447\u0438\u043c\u0441\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445 \u0441\u043b\u043e\u0442\u043e\u0432<\/h4>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0435\u0442\u0435\u0439 (\u0441\u043b\u043e\u0442\u044b), \u043d\u0430\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e &#8212; \u0432\u0435\u0434\u044c \u043a\u0442\u043e-\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u0438\u0445 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 <code>NavigationState<\/code>:<\/p>\n<pre><code class=\"kotlin\">class DefaultContainerComponent&lt;Configuration : Any, SlotComponent : Any&gt;(     componentContext: ComponentContext,     private val configurations: List&lt;Configuration&gt;,     serializer: KSerializer&lt;Configuration&gt;,     private val slotFactory: (componentContext: ComponentContext, config: Configuration) -&gt; SlotComponent ) : ComponentContext by componentContext, ContainerComponent&lt;SlotComponent&gt; {     private val navigation = SimpleNavigation&lt;(NavigationState&lt;Configuration&gt;) -&gt; NavigationState&lt;Configuration&gt;&gt;()      @Serializable     private data class NavigationState&lt;Configuration : Any&gt;(         val configurations: List&lt;Configuration&gt;,         val index: Int?,     ) : NavState&lt;Configuration&gt; {          override val children: List&lt;SimpleChildNavState&lt;Configuration&gt;&gt; by lazy {             configurations.mapIndexed { index, config -&gt;                 val status = if (index == this.index) ChildNavState.Status.RESUMED else ChildNavState.Status.CREATED                 SimpleChildNavState( \/\/ &lt;--- \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 StateFlow \u0438 Value.                     configuration = config,                     status = status,                 )             }         }     }  \/\/ \u044d\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e     override val children: Value&lt;Children&lt;*, SlotComponent&gt;&gt; = TODO(\"Not yet implemented\")     override fun onSelect(index: Int) { TODO(\"Not yet implemented\") }     override fun onMove(fromIndex: Int, toIndex: Int) { TODO(\"Not yet implemented\") }     override fun onTabCloseClicked(index: Int) { TODO(\"Not yet implemented\") } }<\/code><\/pre>\n<p>\u041e\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:<\/p>\n<pre><code class=\"kotlin\">package com.arkivanov.decompose.router.children  \/\/ \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u043b\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. interface NavState&lt;out Configuration : Any&gt; {     \/\/ \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.      \/\/ \u041a\u0430\u0436\u0434\u043e\u0435 [ChildNavState.configuration] \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u043e equals.     val children: List&lt;ChildNavState&lt;Configuration&gt;&gt; }<\/code><\/pre>\n<p>\u0418, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435, \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0434\u0435\u0442\u044f\u0445 \u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445.<\/p>\n<details class=\"spoiler\">\n<summary>\u0410 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 ChildNavState?<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">package com.arkivanov.decompose.router.children  \/* \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 *\/ interface ChildNavState&lt;out Configuration : Any&gt; {     \/* \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.        \u0414\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0432 [NavState] *\/     val configuration: Configuration     \/* \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430         \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 [configuration] *\/     val status: Status      \/* \u0412\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 *\/     enum class Status {         \/* \u0414\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d, \u043d\u043e \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f,            \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043f\u043e\u0437\u0436\u0435 *\/         DESTROYED,         \/* \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d)            \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 (\u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0434\u0440\u0443\u0433\u0443\u044e \u0432\u043a\u043b\u0430\u0434\u043a\u0443) *\/         CREATED,         \/* \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0430\u043a\u0442\u0438\u0432\u0435\u043d (\u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0435\u043c\u0443) *\/         STARTED,         \/* \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0430\u043a\u0442\u0438\u0432\u0435\u043d (\u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0435\u043c\u0443),            \u043d\u043e \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d                               *\/         RESUMED,     } } <\/code><\/pre>\n<p>\u0414\u0430, \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0434\u0435\u0442\u044f\u0445 \u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445 =)<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0430\u043a\u0436\u0435, \u0447\u0442\u043e \u0432 <code>17<\/code> \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 2 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0432\u043a\u043b\u0430\u0434\u043e\u043a:<\/p>\n<pre><code class=\"kotlin\">val status = if (index == this.index) {                  ChildNavState.Status.RESUMED              } else {                  ChildNavState.Status.CREATED                }<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0430, \u043d\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0435\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0444\u043e\u043a\u0443\u0441: \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0448\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0430, <code>RESUMED<\/code>, \u043a\u043e\u0433\u0434\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0430 \u0434\u0440\u0443\u0433\u0430\u044f, \u0442\u043e \u043d\u0430\u0448\u0430 <code>CREATED<\/code> . \u0418, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0440\u0433\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 callback &#8212; \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0437\u043d\u0430\u0442\u044c \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.<\/p>\n<h4>\u0423\u0447\u0438\u043c\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u043a\u043b\u0430\u0434\u043e\u043a<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c, \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0434\u0440\u0443\u0433\u0438\u0435 \u044d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0435\u043b\u0438. <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u044b (\u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u0439\u0447\u0430\u0441):<\/p>\n<pre><code class=\"kotlin\">class DefaultContainerComponent&lt;Configuration : Any, SlotComponent : Any&gt;(     componentContext: ComponentContext,     private val configurations: List&lt;Configuration&gt;,     serializer: KSerializer&lt;Configuration&gt;,     private val slotFactory: (componentContext: ComponentContext, config: Configuration) -&gt; SlotComponent ) : ComponentContext by componentContext, ContainerComponent&lt;SlotComponent&gt; {      private val navigation = SimpleNavigation&lt;(NavigationState&lt;Configuration&gt;) -&gt; NavigationState&lt;Configuration&gt;&gt;()      override fun onSelect(index: Int) {         navigation.navigate { state -&gt;             state.copy(index = index)         }     }          @Serializable     private data class NavigationState&lt;Configuration : Any&gt;(         val configurations: List&lt;Configuration&gt;,         val index: Int?,     ) : NavState&lt;Configuration&gt; {...}          \/\/ override val children: Value&lt;Children&lt;*, SlotComponent&gt;&gt; = TODO(\"Not yet implemented\")          \/\/ override fun onMove(fromIndex: Int, toIndex: Int) {     \/\/     if (fromIndex !in configurations.indices || toIndex !in configurations.indices) return     \/\/     navigation.navigate { state -&gt;     \/\/         val updatedConfigurations = state.configurations.toMutableList()     \/\/         val movedItem = updatedConfigurations.removeAt(fromIndex)     \/\/         updatedConfigurations.add(toIndex, movedItem)     \/\/         state.copy(configurations = updatedConfigurations, index = toIndex)     \/\/     }     \/\/ }         \/\/ override fun onTabCloseClicked(index: Int) {     \/\/     if (index !in configurations.indices) return     \/\/     navigation.navigate { state -&gt;     \/\/         val updatedConfigurations = state.configurations.toMutableList()     \/\/         updatedConfigurations.removeAt(index)     \/\/         val newIndex = if (updatedConfigurations.isEmpty()) {     \/\/             null     \/\/         } else {     \/\/             index.coerceAtLeast(0).coerceAtMost(updatedConfigurations.size - 1)     \/\/         }     \/\/         state.copy(configurations = updatedConfigurations, index = newIndex)     \/\/     }     \/\/ } }<\/code><\/pre>\n<p>\u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0442\u0430\u043d\u0446\u0435\u0432 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u043d\u043e \u0447\u0442\u043e \u0432\u0430\u0436\u043d\u043e &#8212; \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442:<\/p>\n<pre><code class=\"kotlin\">navigation.navigate { state -&gt;     state.copy(index = index) }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 <code>SimpleNavigation<\/code> , \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 <code>Value<\/code> (\u043e \u043d\u0435\u043c \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u0435\u0435), \u0430 \u043c\u0435\u0442\u043e\u0434 <code>navigate<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u043e\u0432 \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u0442\u043e <strong>\u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043d\u0430\u043c \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c<\/strong> <code>navigation.navigate(event)<\/code> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u043d\u0430\u0448\u0435 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 <code>onSelect<\/code> \u043c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441, \u0430 \u0432 <code>onMove<\/code> \u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>\u041e\u043a\u0435\u0439, \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c decompose \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043b\u043e\u0442\u043e\u0432 \u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b (\u0434\u0430, \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>onPause<\/code>, <code>onCreate<\/code> \u0438 \u0442\u0434, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 <code>ComponentContext<\/code> \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>Essenty<\/code>).<\/p>\n<h4>\u0423\u0447\u0438\u043c decompose \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439<\/h4>\n<p>\u0418 \u0442\u0443\u0442 \u043d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435 \u043d\u0435\u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0448 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 ComponentContext:<\/p>\n<pre><code class=\"kotlin\">package com.arkivanov.decompose  interface ComponentContext : GenericComponentContext&lt;ComponentContext&gt;<\/code><\/pre>\n<p>\u0410 \u0443 <code>GenericComponentContext<\/code> \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043c\u0435\u044e\u0442 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0442\u044c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0442\u043e \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u043d\u0430\u0448\u0443 <code>SimpleNavigation<\/code> . Decompose \u0443\u043c\u0435\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c <code>SimpleNavigation<\/code> \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434 \u043f\u0435\u0440\u0432\u043e\u0433\u043e:<\/p>\n<pre><code class=\"kotlin\">class DefaultContainerComponent&lt;Configuration : Any, SlotComponent : Any&gt;(     componentContext: ComponentContext,     private val configurations: List&lt;Configuration&gt;,     serializer: KSerializer&lt;Configuration&gt;,     private val slotFactory: (componentContext: ComponentContext, config: Configuration) -&gt; SlotComponent ) : ComponentContext by componentContext, ContainerComponent&lt;SlotComponent&gt; {     private val navigation = SimpleNavigation&lt;(NavigationState&lt;Configuration&gt;) -&gt; NavigationState&lt;Configuration&gt;&gt;()      override val children: Value&lt;Children&lt;Configuration, SlotComponent&gt;&gt; = children(         source = navigation,         stateSerializer = NavigationState.serializer(serializer),         key = \"tabs\",         initialState = {             NavigationState(configurations = configurations, index = 0)         },         navTransformer = { state, transformer -&gt; transformer(state) },         stateMapper = { state, children -&gt;             Children(                 items = children.map { it as Child.Created },                 selected = state.index,             )         },         backTransformer = { state -&gt;             state.takeIf { it.index != null }                 ?.takeIf { it.index!! &gt; 0 }                 ?.let { eligibleState -&gt;                     { eligibleState.copy(index = eligibleState.index!! - 1) }                 }         },         childFactory = { configuration, componentContext -&gt;             slotFactory(componentContext, configuration)         },     )      override fun onSelect(index: Int) {...}     override fun onMove(fromIndex: Int, toIndex: Int) {...}     override fun onTabCloseClicked(index: Int) {...}     @Serializable     private data class NavigationState&lt;Configuration : Any&gt;(...) {...} }<\/code><\/pre>\n<p>\u0422\u0443\u0442 <\/p>\n<ol>\n<li>\n<p> <code>source<\/code> &#8212; \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a \u043d\u043e\u0432\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ol>\n<ol start=\"2\">\n<li>\n<p> <code>stateSerializer<\/code> &#8212; \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u043d\u0430\u044f \u043c\u0435\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u043d\u0435\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0438 <code>serializer<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430.<\/p>\n<\/li>\n<\/ol>\n<ol start=\"3\">\n<li>\n<p><code>key<\/code> &#8212; \u044d\u0442\u043e \u043a\u043b\u044e\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0448\u0438\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0432\u043a\u043b\u0430\u0434\u043e\u043a (\u0433\u0440\u0443\u043f\u043f\u0430 \u0434\u0435\u0442\u0435\u0439), \u0442\u043e \u043c\u044b \u044d\u0442\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 &#171;tabs&#187;. \u0415\u0441\u043b\u0438 \u0435\u0449\u0435 \u0440\u0430\u0437 \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>children(...)<\/code> , \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 <code>Another supplier is already registered with the key: tabs<\/code> . \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u0435\u043b\u0430\u0442\u044c <code>get() =<\/code> , \u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e <code>=<\/code> (\u043e\u0431 \u044d\u0442\u043e\u043c \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u0435\u0435). <\/p>\n<\/li>\n<\/ol>\n<ol start=\"4\">\n<li>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0437\u0430\u0434\u0430\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432 <code>initialState<\/code> . \u0422\u0443\u0442 \u044f \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u0430\u043c\u0430\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0430.<\/p>\n<\/li>\n<\/ol>\n<ol start=\"5\">\n<li>\n<p>\u0415\u0449\u0435 \u0435\u0441\u0442\u044c <code>navTransformer<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0437 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 <code>navigate<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043b\u044f\u043c\u0431\u0434\u0443, \u043a\u0430\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u0432\u044b\u0448\u0435 (\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0439\u0442\u0435 <em>&#171;\u0423\u0447\u0438\u043c\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u043a\u043b\u0430\u0434\u043e\u043a&#187;<\/em>, \u0435\u0441\u043b\u0438 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043e \u0447\u0435\u043c \u0440\u0435\u0447\u044c), \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a <code>T<\/code>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432 <code>navigate()<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u0442\u0430-\u043a\u043b\u0430\u0441\u0441\u044b \u0441 \u043d\u043e\u0432\u044b\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c, \u0430 \u0432 <code>navTransformer<\/code>  \u0440\u0435\u0448\u0430\u0442\u044c, \u043a\u0430\u043a \u0438\u0437 \u0441\u0442\u0430\u0440\u043e\u0433\u043e <code>state<\/code>  \u0438 \u0438\u0437 \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>transformer<\/code> \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 <code>state<\/code> . \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a:<\/p>\n<pre><code class=\"kotlin\">navTransformer = { state: Int, transformer: String -&gt;      if (transformer == \"\u0443\u0432\u0435\u043b\u0438\u0447\u044c\") {         state + 1     } else {         state      } },<\/code><\/pre>\n<p>\u0434\u043b\u044f \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435 <code>navigation.navigate(\"\u0443\u0432\u0435\u043b\u0438\u0447\u044c\")<\/code> .<\/p>\n<\/li>\n<li>\n<p><code>stateMapper<\/code>  &#8212; \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0441\u0438\u0442 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u043a\u0430\u043a \u0438\u0437 <code>NavigationState<\/code><\/p>\n<pre><code class=\"kotlin\">@Serializable private data class NavigationState&lt;Configuration : Any&gt;(     val configurations: List&lt;Configuration&gt;,     val index: Int?, ) : NavState&lt;Configuration&gt; {...}<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>Children<\/code><\/p>\n<pre><code class=\"kotlin\">interface ContainerComponent&lt;out SlotComponent : Any&gt; {     \/\/ val children: Value&lt;Children&lt;*, SlotComponent&gt;&gt;     \/\/ fun onSelect(index: Int)     \/\/ fun onMove(fromIndex: Int, toIndex: Int)     \/\/ fun onTabCloseClicked(index: Int)      class Children&lt;out C : Any, out T : Any&gt;(         val items: List&lt;Child.Created&lt;C, T&gt;&gt;,         val selected: Int?,     ) }<\/code><\/pre>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u044d\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u043d\u0438\u043c \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435\u043c \u0438 \u0443\u0436\u0430\u0441\u043e\u043c, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0435 \u0438\u0437\u0432\u043d\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043e\u0442 \u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u044f). \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>NavigationState == Children<\/code> , \u043d\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u043e\u0441\u0442\u043e\u043c \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e\u0439 \u043c\u0435\u0442\u0430-\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u044f\u043c\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043d\u0430\u0448\u0443 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e: \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430, \u0448\u0438\u0440\u0438\u043d\u0430 \u043e\u043a\u043d\u0430, \u0444\u0430\u0437\u0430 \u043b\u0443\u043d\u044b \u0438 \u0442\u043f). \u042d\u0442\u0443 \u0438\u043d\u0444\u0443 \u0441\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0435 \u0441\u0442\u043e\u0438\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f &#8212; \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0430 \u0433\u0434\u0435 \u0435\u0439 \u0435\u0449\u0435 \u0431\u044b\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0432 \u0434\u0430\u0442\u0430-\u043a\u043b\u0430\u0441\u0441\u0435 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438? \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0434\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 Mutable-\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 (\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435) \u0438 Immutable-\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 (\u0432\u043d\u0435\u0448\u043d\u0435\u0435).<\/p>\n<\/li>\n<li>\n<p><code>backTransformer<\/code> &#8212; \u043a\u0430\u043a \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 &#171;\u043d\u0430\u0437\u0430\u0434&#187;. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0441\u043b\u0435\u0432\u0430 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 (\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e).<\/p>\n<\/li>\n<li>\n<p><code>childFactory<\/code> &#8212; \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u044d\u0442\u0443 \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u0432\u044b\u043d\u0435\u0441\u043b\u0438 \u043d\u0430\u0440\u0443\u0436\u0443 \u0438 \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043a\u0430\u043a <code>slotFactory<\/code> . \u041d\u0430\u0448\u0438 \u0441\u043b\u043e\u0442\u044b (\u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0432\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0430\u0445) \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u0431\u0435\u0434\u0438\u043b\u0438 &#8212; \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043b\u0438\u0448\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c ui.<\/p>\n<h4>\u0414\u0435\u043b\u0430\u0435\u043c UI <\/h4>\n<p>\u0412 decompose \u0442\u0430\u043a \u043f\u0440\u0438\u043d\u044f\u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u0430 UI \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0433\u0440\u0443\u043f\u043f\u0430 \u0444\u0430\u0439\u043b\u043e\u0432:<\/p>\n<pre><code class=\"kotlin\">interface SomeComponent { val state: Value&lt;\u041a\u0430\u043a\u043e\u0439\u0422\u043e\u0414\u0430\u0442\u0430\u041a\u043b\u0430\u0441\u0441&gt; }  class DefaultSomeComponent(...): SomeComponent, ... {...}  @Composable fun SomeContent(component: SomeComponent, modifier: Modifier) {     val state by component.state.subscribeAsState()     Text(state.\u043a\u0430\u043a\u043e\u0435\u0422\u043e\u041f\u043e\u043b\u0435)     \/\/ \u0438\u043b\u0438     val state = component.state.subscribeAsState()     Text(state.value.\u043a\u0430\u043a\u043e\u0435\u0422\u043e\u041f\u043e\u043b\u0435) }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435: \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u043a\u043b\u0430\u0441\u0441, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u043e\u043c.<\/p>\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435?<\/p>\n<p>5. \ud83d\udd25 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.<br \/>6. \ud83d\udd25 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.<br \/>7. \ud83d\udd25 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438 \u0442\u0430\u0431\u043e\u0432 \u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0438\u0445, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043b\u044f\u043c\u0431\u0434\u044b \u0438 \u043f\u043e \u043d\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c <code>@Composable<\/code> \u043a\u043e\u043d\u0442\u0435\u043d\u0442. \u041b\u044f\u043c\u0431\u0434\u044b, \u043a\u0441\u0442\u0430\u0442\u0438, \u0442\u043e\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c <code>@Composable<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043d\u0438\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u0443. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u0441\u043b\u043e\u0442\u0430 (\u044d\u0442\u043e \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438,  \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0430\u043c \u0441\u043b\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0432 <code>slotFactory<\/code>), \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 (\u0442\u0443 \u0441\u0430\u043c\u0443\u044e, \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 &#171;\u0437\u0430\u043a\u0440\u044b\u0442\u044c&#187; \u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c).<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c\u0443 ui-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 &#171;\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0432\u043a\u043b\u0430\u0434\u043e\u043a&#187;  \u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u0441\u043b\u043e\u0442\u0430 (\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 <code>slotFactory<\/code>), \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c <code>layout<\/code> . \u0422\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0442. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0432\u0432\u0435\u0440\u0445\u0443, \u0438\u043b\u0438 \u0432\u043d\u0438\u0437\u0443, \u0438\u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u0442\u043e\u043c \u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0430\u043c\u0438 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0449\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442.<\/p>\n<\/li>\n<\/ol>\n<blockquote>\n<p>\u0412\u0430\u0436\u043d\u043e \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0434\u0438\u0437\u0430\u0439\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d. \u0414\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 <code>@Composable<\/code>  \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0438 <code>@Composable<\/code> \u0441\u043b\u043e\u0442\u0430. \u041d\u043e \u0443 \u0432\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0432\u0438\u0434\u0435\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438, \u043f\u0443\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043d\u0430 \u043f\u0430\u0443\u0437\u0435 (\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439). \u0422\u0430\u043a\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0443\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0443 \u0432\u043a\u043b\u0430\u0434\u043e\u043a: \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u0440\u0443\u0433\u043b\u043e\u0435 \u043a\u0430\u043a \u0432 GTA V \u0438\u043b\u0438 \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043f\u043e\u0434\u043e\u0448\u043b\u0430 \u043f\u043e\u0434 \u0432\u0430\u0448\u0443 \u0437\u0430\u0434\u0430\u0447\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0442\u043e\u043c, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442  <code>ContainerComponent<\/code>  \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u043d\u0435 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0446\u0435\u043b\u043e\u043c.<\/p>\n<\/blockquote>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 (\u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440: \u043d\u0435 \u0431\u043e\u044f\u0442\u044c\u0441\u044f, \u0432\u043d\u0438\u0437\u0443 \u0431\u0443\u0434\u0435\u0442 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0439 \u0432\u0438\u0434):<\/p>\n<pre><code class=\"kotlin\">@Composable internal fun &lt;SlotComponent : Any&gt; ContainerContent(     navigationComponent: ContainerComponent&lt;SlotComponent&gt;,     tabContent: @Composable (       index: Int,        slotComponent: SlotComponent,       modifier: Modifier,       isSelected: Boolean,       isDragging: Boolean,       onClose: () -&gt; Unit) -&gt; Unit,     tabsArrangement: Arrangement.Horizontal = Arrangement.spacedBy(4.dp),     containerContent: @Composable (innerTabs: @Composable (modifier: Modifier) -&gt; Unit, slotComponent: SlotComponent?) -&gt; Unit ) {     val children by navigationComponent.children.subscribeAsState()      containerContent(         { tabRowModifier -&gt;             TabDraggableRow(                 items = children.items.map { it.instance },                 onMove = navigationComponent::onMove,                 modifier = tabRowModifier,                 tabHorizontalSpacing = tabsArrangement,                 itemContent = { index, itemComponent, isDragging, modifier -&gt;                     tabContent(                         index,                         itemComponent,                         modifier,                         children.selected == index,                         isDragging,                         { navigationComponent.onTabCloseClicked(index) }                     )                 }             )         },         children.selected?.let { children.items[it] }?.instance     ) } <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0439, \u0430 \u0442\u043e\u0442 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0440 <code>TabDraggableRow<\/code> \u0441 \u0433\u0438\u0444\u043a\u0438 \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0435 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043c \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435:<\/p>\n<pre><code class=\"kotlin\">@Composable internal fun &lt;SlotComponent : Any&gt; ContainerContent(     navigationComponent: ContainerComponent&lt;SlotComponent&gt;,     tabContent: @Composable (slotComponent: SlotComponent, onClose: () -&gt; Unit) -&gt; Unit,     containerContent: @Composable (innerTabs: @Composable (modifier: Modifier) -&gt; Unit, slotComponent: SlotComponent?) -&gt; Unit ) {     val children: ContainerComponent.Children&lt;*, SlotComponent&gt; by navigationComponent.children.subscribeAsState()     val slots: List&lt;SlotComponent&gt; = children.items.map { it.instance }     val activeSlotComponent: SlotComponent? = children.selected?.let { children.items[it] }?.instance      containerContent(         \/* innerTabs= *\/ { modifier -&gt;             LazyRow(modifier) {                 itemsIndexed(slots) { index: Int, item: SlotComponent -&gt;                     tabContent(item, { navigationComponent.onTabCloseClicked(index) })                 }             }         },         \/* slotComponent= *\/ activeSlotComponent     ) }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0442\u0438\u043f\u044b, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438:<\/p>\n<ol>\n<li>\n<p><code>children<\/code> &#8212; \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u0443\u043d\u043a\u0442\u0430\u0445. \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0442\u0430\u043c <code>operator fun State.getValue(...)<\/code> , \u043c\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043f\u043e\u043b\u044e <code>value<\/code>  \u043c\u043e\u0436\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 <code>by<\/code> .<\/p>\n<\/li>\n<li>\n<p> <code>slots<\/code>  &#8212; \u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 (\u0441\u043b\u043e\u0442\u043e\u0432).<\/p>\n<\/li>\n<li>\n<p>\u0418 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043c\u0430\u0445\u0438\u043d\u0430\u0446\u0438\u0435\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0434\u0435\u043a\u0441 <code>selected<\/code> (\u043e\u043d nullable, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438).<\/p>\n<\/li>\n<\/ol>\n<p>\u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u043b\u044f\u0431\u0434\u0443 <code>containerContent<\/code> .<\/p>\n<h4>\u0424\u0438\u043d\u0430\u043b\u043e\u0447\u043a\u0430<\/h4>\n<p>\u0418 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442?<\/p>\n<pre><code class=\"kotlin\">ContainerContent(     navigationComponent = containerComponent,     tabContent = { slotComponent, onClose -&gt;         \/\/ \u0417\u0434\u0435\u0441\u044c \u0440\u0438\u0441\u0443\u0435\u043c \u0442\u0430\u0431\u044b     },     containerContent = { innerTabs, slotComponent -&gt;         \/\/ \u0417\u0434\u0435\u0441\u044c \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438     } )<\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<pre><code class=\"kotlin\">fun main() {     val containerComponent = runOnUiThread {         DefaultContainerComponent(             componentContext = DefaultComponentContext(...),             configurations = listOf(Config(\"readme.txt\"), Config(\"build.gradle.kts\")),             serializer = Config.serializer(),             slotFactory = { componentContext, config -&gt;                 DefaultSlotComponent(componentContext, config.filename)             }         )     }      application {         Window(...) {             ContainerContent(                 navigationComponent = containerComponent,                 tabContent = { slotComponent, onClose -&gt;                     \/\/ \u0417\u0434\u0435\u0441\u044c \u0440\u0438\u0441\u0443\u0435\u043c \u0442\u0430\u0431\u044b                     Card {                         Row {                             Text(slotComponent.model.subscribeAsState().value.title)                             Button(onClose) {                                 Text(\"x\")                             }                         }                     }                 },                 containerContent = { innerTabs, slotComponent -&gt;                     \/\/ \u0417\u0434\u0435\u0441\u044c \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438                     Column(rootStyle) {                         innerTabs(Modifier.fillMaxWidth())                         Spacer(spacerStyle)                         LazyColumn(Modifier.fillMaxSize()) {                             item {                                 SlotContent(                                     component = slotComponent,                                     modifier = Modifier.fillMaxSize()                                 )                             }                         }                     }                 }             )         }     } } <\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432 <code>Window<\/code> \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 <\/p>\n<pre><code class=\"kotlin\">LifecycleController(     lifecycleRegistry = lifecycle,     windowState = windowState,     windowInfo = LocalWindowInfo.current, )<\/code><\/pre>\n<p>\u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043c\u0435\u0441\u0442\u0430\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0438\u043b\u0438 \u0436\u0435\u0441\u0442\u044b (\u043d\u0430 \u0433\u0438\u0444\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0436\u0435\u0441\u0442\u044b, \u043e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u043d\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 &#8212; \u0442\u0443\u0442 \u0443\u0436\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0432\u043f\u0438\u0448\u0443\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0439 \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0441\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430\u043c\u0438).<\/p>\n<h4>\u0420\u0435\u043c\u0430\u0440\u043a\u0430 \u043f\u043e UI<\/h4>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0430\u043c, \u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0443 \u0441\u043b\u043e\u0442\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d <code>SlotContent<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>title<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e\u0442 <code>title<\/code> \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u044b\u043c, \u0438\u0437\u043c\u0435\u043d\u044f\u044f \u0435\u0433\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430:<\/p>\n<pre><code class=\"kotlin\">interface SlotComponent {     val model: Value&lt;Model&gt;      data class Model(         val counter: Int,         val title: String,         val body: String     ) }<\/code><\/pre>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u043b\u043e\u0442\u0430 \u043c\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b:<\/p>\n<pre><code class=\"kotlin\">init {     lifecycle.subscribe(         onStart = handler::resume,         onStop = handler::pause,     )      stateKeeper.register(key = KEY_STATE, strategy = State.serializer()) { handler.state.value } }<\/code><\/pre>\n<p>\u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430<\/p>\n<pre><code class=\"kotlin\">class DefaultSlotComponent(     componentContext: ComponentContext,     private val tabTitle: String ) : ComponentContext by componentContext, SlotComponent {     \/\/ retainedInstance \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f onDestroy \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Handler.     private val handler = retainedInstance {         Handler(             initialState = stateKeeper.consume(key = KEY_STATE, strategy = State.serializer())                 ?: State(title = \"(created) $tabTitle\"),             tabTitle = tabTitle         )     }     ... }<\/code><\/pre>\n<p>\u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445:<\/p>\n<pre><code class=\"kotlin\">private class Handler(initialState: State, private val tabTitle: String) : InstanceKeeper.Instance {     val state: MutableValue&lt;State&gt; = MutableValue(initialState)     private var job: Job? = null      fun resume() {         state.update { it.copy(title = \"(active) $tabTitle\") }         ...\u0447\u0442\u043e-\u0442\u043e \u0441 job...     }      fun pause() {         state.update { it.copy(title = \"(paused) $tabTitle\") }         ...\u0447\u0442\u043e-\u0442\u043e \u0441 job...     }      override fun onDestroy() {         pause()     } }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0442\u0430\u043b\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0438\u0437\u0432\u043d\u0435, \u043d\u0443\u0436\u043d\u043e \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>model<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 <code>SlotComponent#model<\/code> . \u0410 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0438\u0437\u0432\u043d\u0435 \u043f\u0440\u043e\u0449\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e:<\/p>\n<pre><code class=\"kotlin\">class DefaultSlotComponent(...) : ComponentContext by componentContext, SlotComponent {     private val handler = retainedInstance {...}     \/* \u041f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0438\u0437 Handler \u0438 \u043c\u0430\u043f\u043f\u0438\u043c         \u0438\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u0449\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0435, \u043a\u0430\u043a         \u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u0440\u0430\u043d\u0435\u0435 \u0432 stateMapper *\/     override val model: Value&lt;Model&gt; = handler.state.map { it.toModel() }<\/code><\/pre>\n<h4>\u0418 \u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435<\/h4>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/790\/3f9\/a66\/7903f9a66331f28915271c22a4890d63.jpeg\" alt=\"\u0411\u044b\u043b\u043e? \u0423\u0437\u043d\u0430\u043b\u0438?\" title=\"\u0411\u044b\u043b\u043e? \u0423\u0437\u043d\u0430\u043b\u0438?\" width=\"1000\" height=\"539\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/790\/3f9\/a66\/7903f9a66331f28915271c22a4890d63.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0411\u044b\u043b\u043e? \u0423\u0437\u043d\u0430\u043b\u0438?<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/872164\/\"> https:\/\/habr.com\/ru\/articles\/872164\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>TL;DR<\/h2>\n<p><a href=\"https:\/\/github.com\/EricShelbogashev\/decompose-tab-navigation\" rel=\"noopener noreferrer nofollow\"><strong>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c<\/strong><\/a><\/p>\n<h4>\u0427\u0442\u043e \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c?<\/h4>\n<p>\u041a\u0430\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/www.jetbrains.com\/compose-multiplatform\/\" rel=\"noopener noreferrer nofollow\">compose<\/a>, kotlin multiplatform, <a href=\"https:\/\/github.com\/arkivanov\/Decompose\" rel=\"noopener noreferrer nofollow\">decompose<\/a>, model-view-intent, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u043f\u043e \u0442\u0430\u0431\u0430\u043c.<\/p>\n<h4>\u041a\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438?<\/h4>\n<ol>\n<li>\n<p>\u0412\u044b\u0431\u043e\u0440 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 (\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f\u0442 \u0432 \u0441\u043f\u044f\u0449\u0438\u0439 \u0440\u0435\u0436\u0438\u043c). <\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 (\u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439 \u0432\u044b\u0442\u0435\u0441\u043d\u0435\u043d\u0438\u044f).<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 (\u0441 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432).<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 (\u044d\u0442\u043e \u0442\u043e, \u0438\u0437 \u0447\u0435\u0433\u043e \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b; \u043d\u0430 \u0433\u0438\u0444\u043a\u0435 \u043d\u0438\u0436\u0435 \u044d\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 <code>readme.md<\/code>, <code>build.gradle.kts<\/code>) \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0430\u0442\u0430-\u043a\u043b\u0430\u0441\u0441\u044b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p>\ud83d\udd25 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\ud83d\udd25 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\ud83d\udd25 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438 \u0442\u0430\u0431\u043e\u0432 \u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430.<\/p>\n<\/li>\n<\/ol>\n<h4>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442?<\/h4>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0434\u0436\u043e\u0431\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0438 \u043c\u0435\u043d\u044f\u0435\u0442 <code>body<\/code> \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 <code>title.repeat(counter)<\/code> . \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u044e \u043b\u043e\u0433\u0438\u043a\u0443.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0432 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435. \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 CREATED. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438, \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u0441\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0437\u0430\u043c\u0438\u0440\u0430\u0435\u0442, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>P.S. 1 \u043c\u0431 gif. \u041f\u043e\u043c\u0438\u043b\u0443\u0439\u0442\u0435, \u043b\u044e\u0434\u0438 \u0434\u043e\u0431\u0440\u044b\u0435 \ud83d\ude4f<\/figcaption><\/div>\n<\/figure>\n<h4>\u041a\u0430\u043a\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c?<\/h4>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437\u0430, \u0442\u043e\u043b\u044c\u043a\u043e core<\/p>\n<pre><code>com.arkivanov.essenty:lifecycle:2.4.0 com.arkivanov.decompose:decompose:3.2.2 com.arkivanov.decompose:extensions-compose:3.2.2 org.jetbrains.kotlin.plugin.serialization:2.1.0 org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3<\/code><\/pre>\n<h4>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c\u0441\u044f, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c:<br \/>1. \u0412\u043a\u043b\u0430\u0434\u043a\u0430 &#8212; \u044d\u0442\u043e \u0442\u0430 \u0441\u0430\u043c\u0430\u044f \u0448\u0442\u0443\u043a\u0430 \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 &#171;\u0437\u0430\u043a\u0440\u044b\u0442\u044c&#187;, ui-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438.<br \/>2. \u041f\u0430\u043d\u0435\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043e\u043a &#8212; \u044d\u0442\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0440, \u0433\u0434\u0435 \u044d\u0442\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u043b\u0435\u0436\u0430\u0442. \u0422\u0430 \u0441\u0430\u043c\u0430\u044f \u0448\u0442\u0443\u043a\u0430 \u0441\u0432\u0435\u0440\u0445\u0443, \u043a\u0430\u043a \u0432 Google Chrome.<br \/>3. \u0421\u043b\u043e\u0442 &#8212; \u044d\u0442\u043e decompose-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0433\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. <br \/>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435, \u0441\u043b\u043e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0438 \u0442\u0435\u043a\u0441\u0442, \u043f\u0440\u0438\u0447\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0418 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u043e\u0442\u043e\u0432 \u0442\u0430\u043c \u0434\u0432\u0430, \u043e\u0434\u0438\u043d \u0441\u0432\u044f\u0437\u0430\u043d \u0441 <code>readme.txt<\/code>, \u0434\u0440\u0443\u0433\u043e\u0439 \u0441 <code>build.gradle.kts<\/code> .<br \/>4. \u041a\u043e\u043d\u0442\u0435\u043d\u0442 \u0441\u043b\u043e\u0442\u0430 &#8212; \u044d\u0442\u043e ui-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043b\u043e\u0442\u0430. <br \/>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 &#8212; \u044d\u0442\u043e <code>Card { Text(counter), Text(body) }<\/code> .<br \/>5. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 &#8212; \u044d\u0442\u043e decompose-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043f\u0430\u043d\u0435\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0438 \u0441\u043b\u043e\u0442\u044b.<br \/>6. \u041a\u043e\u043d\u0442\u0435\u043d\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 &#8212; \u044d\u0442\u043e ui-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f ui \u043f\u0430\u043d\u0435\u043b\u0438 \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0438 \u0443\u043c\u0435\u0435\u0442 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0442 (\u0430 \u043c\u043e\u0436\u0435\u0442, \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0442\u043e\u0432, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 \u043a\u0430\u0440\u0443\u0441\u0435\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439).<\/p>\n<h4>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u043a\u043e\u0434\u0435?<\/h4>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c decompose-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u0435 \u0441\u043b\u043e\u0442\u044b, \u0438 \u0443\u043c\u0435\u044e\u0449\u0438\u0439 \u043f\u043e \u043d\u0438\u043c \u043d\u0430\u0432\u0438\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f (\u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439, \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043b\u043e\u0442\u043e\u0432)<\/p>\n<pre><code class=\"kotlin\">interface ContainerComponent&lt;out SlotComponent : Any&gt; {     val children: Value&lt;Children&lt;*, TabComponent&gt;&gt;      fun onSelect(index: Int) \/\/ \u0412 UI \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0443.     fun onMove(fromIndex: Int, toIndex: Int) \/\/ \u0412 UI \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0443.     fun onTabCloseClicked(index: Int) \/\/ \u0412 UI \u043d\u0430\u0436\u0430\u043b\u0438 \"\u0437\u0430\u043a\u0440\u044b\u0442\u044c\".      class Children&lt;out C : Any, out T : Any&gt;(         \/\/ \u0418\u043d\u0441\u0442\u0430\u043d\u0441\u044b \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0432\u043a\u043b\u0430\u0434\u043e\u043a - \u0438\u0445 decompose \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b.         val items: List&lt;Child.Created&lt;C, T&gt;&gt;,         \/\/ \u0410 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.          val selected: Int?,     ) }<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u0441\u043b\u043e\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f<\/p>\n<pre><code class=\"kotlin\">import kotlinx.serialization.Serializable  @Serializable data class Config(val filename: String)<\/code><\/pre>\n<p>\u0418 \u0442\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u043b\u044f\u043c\u0431\u0434\u0443 <code>slotFactory<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u043b\u043e\u0442:<\/p>\n<pre><code class=\"kotlin\">fun main() {   val lifecycle = LifecycleRegistry()   val stateKeeper = StateKeeperDispatcher(       savedState = File(SAVED_STATE_FILE_NAME).readSerializableContainer()   )      DefaultContainerComponent(       componentContext = DefaultComponentContext(           lifecycle = lifecycle,           stateKeeper = stateKeeper       ),       configurations = listOf(Config(\"readme.txt\"), Config(\"build.gradle.kts\")),       serializer = Config.serializer(),       slotFactory = { componentContext, config -&gt;           DefaultSlotComponent(componentContext, config.filename)       }   ) }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e decompose \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 <code>ComponentContext<\/code> \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0432\u043e\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435. \u042d\u0442\u043e\u0442 \u0437\u0432\u0435\u0440\u044c \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u043c\u0435\u043b:<\/p>\n<ul>\n<li>\n<p>\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b (\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c <code>LifecycleOwner<\/code> \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/github.com\/arkivanov\/Essenty\" rel=\"noopener noreferrer nofollow\">Essenty<\/a>)<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u043e\u043d \u0442\u044f\u0436\u0435\u043b\u044b\u0439) &#8212; \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f <code>StateKeeperOwner<\/code> \u0438\u0437 \u0442\u043e\u0439 \u0436\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435&#8230;<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0438 \u0431\u0435\u0433\u043b\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442 \u043c\u043e\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043c\u044b\u0441\u043b\u0435\u0439. \u041f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043e\u0442 kotlin-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043c \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e.<\/p>\n<h3>\u0414\u0430\u0432\u043d\u044b\u043c-\u0434\u0430\u0432\u043d\u043e, \u0432 \u0434\u0430\u043b\u0451\u043a\u043e\u0439-\u0434\u0430\u043b\u0451\u043a\u043e\u0439&#8230;<\/h3>\n<blockquote>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a <code>ComponentContext<\/code> \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0435\u043c\u0430\u0440\u043a\u0438. \u041f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438, <code>ComponentContext<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 decompose-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b &#171;\u0436\u0438\u0432\u044b\u043c\u0438&#187;, \u0438 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0441 \u043e\u0442 \u0433\u0440\u044f\u0437\u043d\u0435\u0439\u0448\u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439 callback-hell, \u0435\u0441\u043b\u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0432 \u043d\u0438\u0445 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c. <br \/>\u0410 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u043d \u043d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e: \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440 <code>LifecycleRegistry()<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u043f\u043e\u0447\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u0440\u0435\u0435\u0441\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0434\u0435\u0440\u0435\u0432\u043e. \u0412 \u0446\u0435\u043b\u043e\u043c, \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<\/p>\n<\/blockquote>\n<p>\u0421 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432\u044b\u0448\u0435 (\u0441\u043c. <em>&#171;\u041a\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438?&#187;<\/em>). \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0441 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0435\u0439:<\/p>\n<pre><code class=\"kotlin\">interface ContainerComponent&lt;out SlotComponent : Any&gt; {     val children: Value&lt;Children&lt;*, SlotComponent&gt;&gt;      fun onSelect(index: Int)     fun onMove(fromIndex: Int, toIndex: Int)     fun onTabCloseClicked(index: Int)      class Children&lt;out C : Any, out T : Any&gt;(         val items: List&lt;Child.Created&lt;C, T&gt;&gt;,         val selected: Int?,     ) }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ol>\n<li>\n<p><code>Value<\/code> &#8212; \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 <code>StateFlow<\/code>  &#8212; &#171;\u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439&#187;. \u041c\u044b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u0438 \u043c\u043e\u0436\u0435\u043c \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0422\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043b\u043e\u0442\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f (\u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043b\u043e\u0442\u043e\u0432, \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0430\u043c \u043d\u0430\u0431\u043e\u0440 \u0441\u043b\u043e\u0442\u043e\u0432), \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 \u044d\u0442\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u0438\u0435, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Value:<\/p>\n<pre><code class=\"kotlin\">package com.arkivanov.decompose.value  abstract class Value&lt;out T : Any&gt; {     \/\/ \u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 T.     abstract val value: T      \/* \u041f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f T.        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u043e\u0442\u043c\u0435\u043d\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 *\/     abstract fun subscribe(observer: (T) -&gt; Unit): Cancellation }<\/code><\/pre>\n<\/p>\n<\/li>\n<li>\n<p><code>Children<\/code> &#8212; \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c decompose-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0441\u043b\u043e\u0442\u043e\u0432 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c. \u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u044e\u0434\u0430 \u043b\u044e\u0431\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0440\u0435\u0436\u0438\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f: \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0438\u043b\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435<\/p>\n<\/li>\n<li>\n<p><code>SlotComponent<\/code> &#8212; \u044d\u0442\u043e \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u043b\u043e\u0442\u043e\u0432. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0441\u043b\u043e\u0442\u044b &#8212; \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a, \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 &#8212; \u0438 \u0442\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0442\u0438\u043f\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u0447\u0442\u043e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a. <br \/>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <code>DefaultSlotComponent<\/code> \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0437 <em>&#171;\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u043a\u043e\u0434\u0435?&#187;<\/em>.<\/p>\n<\/li>\n<li>\n<p><code>C<\/code> &#8212; \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0441\u043b\u043e\u0442\u0430 <code>Children<\/code>. \u041e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>imageURL<\/code> \u0438\u043b\u0438 <code>filePath<\/code> , \u0430, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, <code>dialogId<\/code> &#8212; \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0438\u0437 \u0447\u0435\u0433\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0430\u0448 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442. \u0421\u0442\u043e\u0438\u0442 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c <code>sealed<\/code>&#8212; \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e:<\/p>\n<pre><code class=\"kotlin\">@Serializable sealed interface SealedConfig {     @Serializable     data class Image(val uri: String): SealedConfig     @Serializable     data class File(val path: Path): SealedConfig }  fun main() {     val configurations = listOf(         SealedConfig.Image(\"http:\/\/www.example.com\"),         SealedConfig.File(Path.of(\"\/home\/users\/example\/.zprofile\")),     )          val containerComponent = runOnUiThread {         DefaultContainerComponent(             componentContext = DefaultComponentContext(LifecycleRegistry()),             configurations = configurations, \/\/ &lt;--- \u0442\u0443\u0442 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438             serializer = SealedConfig.serializer(),             slotFactory = { componentContext, config -&gt;                 when(config) { \/\/ &lt;---- \u0442\u0443\u0442 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c                     is SealedConfig.File -&gt; DefaultFileComponent(componentContext, config.path)                     is SealedConfig.Image -&gt; DefaultImageComponent(componentContext, config.uri)                 }             }         )     }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u043a\u0430\u043a \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f <code>runOnUiThread<\/code> &#8212; \u044d\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c, \u043f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u0430\u044f <a href=\"https:\/\/github.com\/arkivanov\/decompose-multiplatform-template\/blob\/894c062ef324a4395f367156f38507c4a2a29954\/app-desktop\/src\/jvmMain\/kotlin\/com\/example\/myapplication\/desktop\/Utils.kt\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>.<\/p>\n<\/li>\n<li>\n<p><code>Child.Created<\/code> &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u0430\u0441\u0441, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 <code>slotFactory<\/code> \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0441 \u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439.<\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u0441\u043e\u0437\u043d\u0430\u0432, \u0441 \u0447\u0435\u043c \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e (\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0441\u043b\u043e\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438), \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u043f\u043b\u043e\u0442\u0438\u043c \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432 \u0436\u0438\u0437\u043d\u044c.<\/p>\n<p>\u0412\u044b\u0448\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 <code>slotFactory<\/code> &#8212; \u0444\u0430\u0431\u0440\u0438\u043a\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0430\u044f \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (\u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c callback-\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 <code>onTabClose<\/code> ), \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u0432\u0441\u0435 \u0435\u0449\u0435 \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043d\u0430\u0440\u0443\u0436\u0443, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 ContainerComponent:<\/p>\n<pre><code class=\"kotlin\">class DefaultContainerComponent&lt;Configuration : Any, SlotComponent : Any&gt;(     componentContext: ComponentContext,     private val configurations: List&lt;Configuration&gt;,     serializer: KSerializer&lt;Configuration&gt;,     private val slotFactory: (componentContext: ComponentContext, config: Configuration) -&gt; SlotComponent ) : ComponentContext by componentContext, ContainerComponent&lt;SlotComponent&gt; {     override val children: Value&lt;Children&lt;*, SlotComponent&gt;&gt;         get() = TODO(\"Not yet implemented\")      override fun onSelect(index: Int) {         TODO(\"Not yet implemented\")     }      override fun onMove(fromIndex: Int, toIndex: Int) {         TODO(\"Not yet implemented\")     }   <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-444327","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/444327","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=444327"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/444327\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=444327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=444327"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=444327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}