android / android/codelab-android-datastore
Lab refers to an undefined context.createDataStore(...) function
- Dominant language
- Kotlin
- Stars
- 240
- Forks
- 113
- PR merge metrics
- No merged PRs in 30d
Description
[8. SharedPreferences to Proto DataStore](https://developer.android.com/codelabs/android-proto-datastore#7) is already very chaotic in terms of modifications that ain't clear whether they apply to `UserPreferencesRepository.kt` or to `TasksActivity.kt` or maybe to both.
That's because, in previous steps, the lab mandates to temporarily create a `Context` extension property `userPreferencesStore` that it's also temporarily injected from `TasksActivity` into `UserPreferencesRepository`.
But once at step [8. SharedPreferences to Proto DataStore](https://developer.android.com/codelabs/android-proto-datastore#7), lots of these temporary things become finalized although the lab only tells what to edit but not where.
At some point, it requests to redefine `userPreferencesStore` but this time not as a `Context` extension property but as a presumably `UserPreferencesRepository` property. It doesn't clarify whose this redefinition belongs. I presume that it's `UserPreferencesRepository`.
It doesn't end there, though: the new definition invokes a non-existing `context.createDataStore(...)` function as follows:
```
private val userPreferencesStore: DataStore = context.createDataStore(
fileName = "user_prefs.pb",
serializer = UserPreferencesSerializer,
migrations = listOf(sharedPrefsMigration)
)
```
I could only finish the lab by figuring out the missing extension function as follows:
```
fun Context.createDataStore(
fileName: String,
serializer: Serializer,
corruptionHandler: ReplaceFileCorruptionHandler? = null,
migrations: List> = listOf(),
scope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
): DataStore =
DataStoreFactory.create(
produceFile = { File(this.filesDir, "datastore/$fileName") },
serializer = serializer,
corruptionHandler = corruptionHandler,
migrations = migrations,
scope = scope
)
```
If my guessing is correct, the lab should include my guessed definition for God's sake.
The provided finished branch `proto_datastore` just stuck to the temporary definition (contradicting the lab instructions that called for a redefinition.)
Contributor guide
Research direction
Start by comparing step 8 of the SharedPreferences to Proto DataStore codelab with UserPreferencesRepository.kt, TasksActivity.kt, and the proto_datastore branch. Verify where userPreferencesStore belongs and whether context.createDataStore is defined or intended; done means the instructions and finished branch consistently identify the ownership and provide every required definition.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, kotlin
- Domain
- documentation, mobile
- Issue type
- Documentation
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100