android / android/codelab-android-datastore

Lab refers to an undefined context.createDataStore(...) function

Open
#71 1 comment 0 reactions 0 assignees View on GitHub
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.