{"id":15695586,"url":"https://github.com/prongbang/mvi-flow","last_synced_at":"2025-07-23T00:34:28.285Z","repository":{"id":87919742,"uuid":"323708161","full_name":"prongbang/mvi-flow","owner":"prongbang","description":"MVI = Coroutine + Flow Android","archived":false,"fork":false,"pushed_at":"2022-05-24T16:20:19.000Z","size":163,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-19T11:08:55.062Z","etag":null,"topics":["mvi","mvi-android","mvi-architecture","mvi-clean-architecture","mvi-coroutines-flow","mvi-coroutines-flow-kotlin","mvi-flow"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/prongbang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-12-22T18:50:39.000Z","updated_at":"2023-10-18T09:24:27.000Z","dependencies_parsed_at":null,"dependency_job_id":"39358fb0-4e8d-4243-86f5-7c4ae679376f","html_url":"https://github.com/prongbang/mvi-flow","commit_stats":{"total_commits":12,"total_committers":2,"mean_commits":6.0,"dds":0.5,"last_synced_commit":"d14bf2cbbd33c0e282aa07f575c5f943cd054825"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/prongbang/mvi-flow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prongbang%2Fmvi-flow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prongbang%2Fmvi-flow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prongbang%2Fmvi-flow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prongbang%2Fmvi-flow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/prongbang","download_url":"https://codeload.github.com/prongbang/mvi-flow/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prongbang%2Fmvi-flow/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266597014,"owners_count":23953894,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["mvi","mvi-android","mvi-architecture","mvi-clean-architecture","mvi-coroutines-flow","mvi-coroutines-flow-kotlin","mvi-flow"],"created_at":"2024-10-03T19:01:59.142Z","updated_at":"2025-07-23T00:34:28.261Z","avatar_url":"https://github.com/prongbang.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mvi-flow\n\n[![](https://jitpack.io/v/prongbang/mvi-flow.svg)](https://jitpack.io/#prongbang/mvi-flow)\n\n## Setup\n\n- `build.gradle`\n\n```\nallprojects {\n    repositories {\n        maven { url 'https://jitpack.io' }\n    }\n}\n```\n\n- `app/build.gradle`\n\n```gradle\nimplementation 'com.github.prongbang:mvi-flow:1.0.5'\n```\n\n## How to use\n\n- MainIntent.kt\n\n```kotlin\nimport com.prongbang.flow.FlowIntent\n\nsealed class MainIntent : FlowIntent {\n\tobject GetData : MainIntent()\n}\n```\n\n- MainSate.kt\n\n```kotlin\nimport com.prongbang.flow.FlowState\n\nsealed class MainState : FlowState {\n\tdata class Result(val data: String) : MainState()\n}\n```\n\n- MainEffect.kt\n\n```kotlin\nimport com.prongbang.flow.FlowEffect\n\nsealed class MainEffect : FlowEffect {\n\tdata class Error(val data: String) : MainEffect()\n}\n```\n\n- GetMessageUseCase.kt\n\n```kotlin\nimport com.prongbang.flow.FlowUseCase\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\n\nclass GetMessageUseCase : FlowUseCase\u003cUnit, String\u003e {\n\toverride suspend fun execute(params: Unit): String {\n\t\treturn withContext(Dispatchers.Default) {\n\t\t\t\"Hello MVI Flow\"\n\t\t}\n\t}\n}\n```\n\n- MainViewModel.kt\n\n```kotlin\nimport com.prongbang.flow.FlowViewModel\nimport com.prongbang.mviflowex.domain.MainEffect\nimport com.prongbang.mviflowex.domain.MainIntent\nimport com.prongbang.mviflowex.domain.MainState\n\nclass MainViewModel(\n\t\tprivate val getMessageUseCase: GetMessageUseCase\n) : FlowViewModel\u003cMainIntent, MainState, MainEffect\u003e() {\n    \n\toverride fun onProcessIntent(intent: MainIntent) {\n\t\twhen (intent) {\n\t\t\tMainIntent.GetData -\u003e processGetData()\n\t\t}\n\t}\n\n\tprivate fun processGetData() = viewModelScope.launch(Dispatchers.IO) {\n\t\tval result = getMessageUseCase.execute(Unit)\n\t\tsetState(MainState.Result(result))\n\t\tsetEffect(MainEffect.Error(\"Hello Effect\"))\n\t}\n}\n```\n\n- MainActivity.kt\n\n```kotlin\nimport com.prongbang.flow.FlowViewRenderer\n\nclass MainActivity : AppCompatActivity(), FlowViewRenderer\u003cMainState, MainEffect\u003e {\n\n\tprivate val mainViewModel: MainViewModel by viewModel()\n\n\tprivate val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }\n\n\toverride fun onCreate(savedInstanceState: Bundle?) {\n\t\tsuper.onCreate(savedInstanceState)\n\t\tsetContentView(binding.root)\n\t\tinitObserve()\n\t\tinitLoad()\n\t}\n\n\toverride fun initObserve() {\n\t\tmainViewModel.subscribe(::render, ::renderEffect)\n\t}\n\n\tprivate fun initLoad() {\n\t\tmainViewModel.process(MainIntent.GetData)\n\t}\n\n\toverride fun render(state: MainState) {\n\t\twhen (state) {\n\t\t\tis MainState.Result -\u003e {\n\t\t\t\tbinding.messageText.text = state.data\n\t\t\t}\n\t\t}\n\t}\n\n\toverride fun renderEffect(effects: MainEffect) {\n\t\twhen (effects) {\n\t\t\tis MainEffect.Error -\u003e {\n\t\t\t\tbinding.effectText.text = effects.data\n\t\t\t}\n\t\t}\n\t}\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprongbang%2Fmvi-flow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprongbang%2Fmvi-flow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprongbang%2Fmvi-flow/lists"}