Giter Site home page Giter Site logo

vitaliy-anatolievych / simple_nav_architecture Goto Github PK

View Code? Open in Web Editor NEW
0.0 1.0 0.0 242 KB

Реалізація простої MVVM навігації у додатку.

Home Page: https://www.youtube.com/watch?v=bXI5x8QRXwo&t=3037s&ab_channel=RomanAndrushchenko

Kotlin 86.50% Java 13.50%

simple_nav_architecture's Introduction

Core - модуль документація

Вимагає реалізувати 2 контракти для роботи: Вимагає реалізувати 2 контракти для роботи:

  • ModelsProvider - провайдер залежностей для ViewModelFactory
  • FragmentsHolder - контракт для Activity який підключає навігацію.

Також має наступні контракти для роботи через CoreViewModel

  • Navigator - контракт навігації
  • UIActions
    • toast - показ повідомлень
    • getString - доставка з ресурсів тексту

Порядок та приклад реалізації контрактів

ModelsProvider

  • Необхідно передати залежності які будуть передаватись ViewModelFactory до конструкторів ViewModel
class App: Application(), ModelsProvider {

    private val dependency = listOf<Any>(
        InMemoryColorsRepository()
    )

// Передати залежності які будуть використовувати 
// скоуп Application
    override val models: List<Any>
        get() = dependency
}

FragmentsHolder

  1. Створити [CoreViewModel] так передати UIActions та NavigatorManager
  2. Оголосити сам навігатор, типу [StackFragmentNavigator]
  3. Створити StackFragmentNavigator в onCreate
  4. У notifyScreenUpdates прокинути navigator.notifyScreenUpdates()
  5. Повернути єкземпляр класу [CoreViewModel] до Core модулю

MainActivity.kt

/**
 * Приклад реалізації Activity
 */
class MainActivity : AppCompatActivity(), FragmentsHolder {

/**
* 2. Оголосити сам навігатор, типу [StackFragmentNavigator]
*/
    private lateinit var navigator: StackFragmentNavigator

/**
* 1. Створити [CoreViewModel] так передати UIActions та 
* NavigatorManager
*/
    private val activityViewModel by viewModelCreator<CoreViewModel> {
        CoreViewModel(
            uiActions = AndroidUIActions(applicationContext),
            navigatorManager = NavigatorManager(),
        )
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 3. Створити StackFragmentNavigator в onCreate
        navigator = StackFragmentNavigator(
            activity = this,
            navigatorManager = activityViewModel.navigatorManager,
            savedInstanceState = savedInstanceState,
            containerId = R.id.fragmentContainer,
            animations = Animations(
                enterAnim = R.anim.enter,
                exitAnim = R.anim.exit,
                popEnterAnim = R.anim.pop_enter,
                popExitAnim = R.anim.pop_exit
            ),
            initialScreenCreator = { CurrentColorFragment.Screen() }
        )

    }

    override fun onSupportNavigateUp(): Boolean {
        onBackPressed()
        return true
    }

/**
* 4. У notifyScreenUpdates прокинути navigator.notifyScreenUpdates()
*/
    override fun notifyScreenUpdates() {
        navigator.notifyScreenUpdates()
        val f = supportFragmentManager.findFragmentById(R.id.fragmentContainer)

        if (f is HasScreenTitle && f.getScreenTitle() != null) {
            // fragment has custom screen title -> display it
            supportActionBar?.title = f.getScreenTitle()
        } else {
            supportActionBar?.title = getString(R.string.app_name)
        }
    }

/**
* 5. Повернути єкземпляр класу [CoreViewModel] до Core модулю
*/
    override fun getActivityScopeViewModel(): CoreViewModel {
        return activityViewModel
    }

}

Приклад використання

Fragment

class ExampleFragment : BaseFragment() {

// Якщо потрібно передати аргументи до єкрану,
// використовуемо конструктор з даними які серіалізуються
// class Screen(value: String) : BaseScreen
    class Screen : BaseScreen

    override val viewModel by screenViewModel<ExampleViewModel>()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        TODO("Основна робота")
    }
}

ViewModel

class ExampleViewModel(
    private val navigator: Navigator,
    private val uiActions: UiActions,
) : BaseViewModel() {
		
// Прийде результат з інших єкранів
    override fun onResult(result: Any) {
        super.onResult(result)
        if (result is TestClass) {
            val message = uiActions.getString(R.string.test, result.name)
            uiActions.toast(message)
        }
    }
		
// Приклад навігації на наступний єкран
    fun navigateToNextScreen(value: Any) {
        val screen = ExampleSecondFragment.Screen(value)
        navigator.launch(screen)
    }
}

simple_nav_architecture's People

Contributors

vitaliy-anatolievych avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.