Skip to content

Instantly share code, notes, and snippets.

View jobinlawrance's full-sized avatar

Jobin Lawrance jobinlawrance

View GitHub Profile
val appModule = module {
single { //Existing koin dependencies }
fragment { MainFragment("Now this won't crash") }
}
class MainActivity : AppCompatActivity() {
val bundle = Bundle().apply {
putString(MainFragment.KEY_TEXT, "Now this won't crash")
}
val mainFragment = MainFragment().apply {
arguements = bundle
}
inline fun <reified T : Fragment> AppCompatActivity.fragmentByTagOrNew(
tag: String, noinline factory: () -> T
): Lazy<T> {
return lazy(LazyThreadSafetyMode.NONE) {
supportFragmentManager.findFragmentByTag(tag) as? T ?: factory()
}
}
class MainActivity : AppCompatActivity() {
val mainFragment by fragmentByTagOrNew(MainFragment.TAG) {
MainFragment().withArgs {
putString(MainFragment.KEY_TEXT, "Now this won't crash")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
@jobinlawrance
jobinlawrance / KoinSetup.kt
Last active December 13, 2020 10:40
Sample Application setup when using Koin Library (code might not compile)
class HomeApplication: Application() {
internal lateinit var koinApplication: KoinApplication
override fun onCreate() {
super.onCreate()
koinApplication = startKoin {
androidContext(this@HomeApplication)
modules(apiModule, interactorModule, viewModelModule)
}
import org.koin.androidx.viewmodel.ext.android.viewModel
...
class HomeActivity: AppCompatActivity() {
private val homeViewModel by viewModel<HomeViewModel>()
override fun onCreate(..) {
...
@jobinlawrance
jobinlawrance / HomeViewModel.kt
Created December 13, 2020 14:36
HomeViewModel and HomeInteractor
class HomeViewModel(val homeInteractor: HomeInteractor) {
private val resultLiveData = MutableLiveData<Result<String>>()
fun getResultFromApi(): LiveData<Result<String>> {
homeInteractor.getResultFromApi()
.startWith(Result.InProgress)
.subscribe({ someString ->
resultLiveData.value = Result.Success(someString)
}, { err ->
@jobinlawrance
jobinlawrance / HomeActivityTest.kt
Created December 13, 2020 20:13
Testing using KoinTest
import ...
@RunWith(AndroidJUnit4ClassRunner::class)
class HomeActivityTest: KoinTest {
@get:Rule
var intentRule = IntentsTestRule(HomeActivity::class.java, true, false)
lateinit var mockModule: Module
lateinit var mockedInteractor: HomeInteractor
...
@Before
override fun setup() {
val realInteractor = get<HomeInteractor>()
mockedInteractor = Mockito.spy(realInteractor)
mockedModule = module {
single(override = true) { mockedInteractor }
}
loadKoinModules(mockModule)
class TestHomeApplication: HomeApplication { // make HomeApplication open at this point
override fun onCreate() {
super.onCreate()
koinApplication.modules(testModule)
}
}
val testModule = module {