我正在 kotlin 上为 Android 编写一个应用程序“天气”。应用程序架构 - MVVM。我使用 Yandex API 获取天气数据。有 dto 类 ForecastModel 和 FactModel。FactModel 类的条件字段以字符串格式(“部分多云”、“连续大雨”等)从服务器接收有关天气状况的数据。我想将这些字符串本地化为俄语和英语。为此,我创建了 getConditionLocalized() 方法并将字符串放入资源中。但最终,它生成的不是字符串,而是数字。我知道常量和 getConditionLocalized() 函数很可能都必须在另一个类中,并且很可能需要通过 resources.getString(R.string.....) 方法调用它们,但该方法不可用在这堂课中。唯一的问题是,将所有这些放在哪个班级?在存储库中,查看模型或其他?您能告诉我如何根据 MVVM 模型正确实现它吗?
ForecastModel 和 FactModel 类的代码:
import com.company.myweatherapp.R
const val CLEAR = "clear"
const val PARTLY_CLOUDY = "partly-cloudy"
const val CLOUDY = "cloudy"
const val OVERCAST = "overcast"
const val DRIZZLE = "drizzle"
const val LIGHT_RAIN = "light-rain"
const val RAIN = "rain"
const val MODERATE_RAIN = "moderate-rain"
const val HEAVY_RAIN = "heavy-rain"
const val CONTINUOUS_HEAVY_RAIN = "continuous-heavy-rain"
const val SHOWERS = "showers"
const val WET_SNOW = "wet-snow"
const val LIGHT_SNOW = "light-snow"
const val SNOW = "snow"
const val SNOW_SHOWERS = "snow-showers"
const val HAIL = "hail"
const val THUNDERSTORM = "thunderstorm"
const val THUNDERSTORM_WITH_RAIN = "thunderstorm-with-rain"
const val THUNDERSTORM_WITH_HAIL = "thunderstorm-with-hail"
data class ForecastModel(
val fact: FactModel?,
val geo_object: GeoObjectModel?
)
data class FactModel(
val temp: Int,
val icon: String,
val condition: String
) {
fun getConditionIcon(): String {
return "https://yastatic.net/weather/i/icons/funky/dark/$icon.svg"
}
fun getConditionLocalized(): String {
return when (condition) {
CLEAR -> R.string.clear_conditions_text.toString()
PARTLY_CLOUDY -> R.string.partly_cloudy_conditions_text.toString()
CLOUDY -> R.string.cloudy_conditions_text.toString()
OVERCAST -> R.string.overcast_conditions_text.toString()
DRIZZLE -> R.string.drizzle_conditions_text.toString()
LIGHT_RAIN -> R.string.light_rain_conditions_text.toString()
RAIN -> R.string.rain_conditions_text.toString()
MODERATE_RAIN -> R.string.moderate_rain_conditions_text.toString()
HEAVY_RAIN -> R.string.heavy_rain_conditions_text.toString()
CONTINUOUS_HEAVY_RAIN -> R.string.continuous_heavy_rain_conditions_text.toString()
SHOWERS -> R.string.showers_conditions_text.toString()
WET_SNOW -> R.string.wet_snow_conditions_text.toString()
LIGHT_SNOW -> R.string.light_snow_conditions_text.toString()
SNOW -> R.string.snow_conditions_text.toString()
SNOW_SHOWERS -> R.string.snow_showers_conditions_text.toString()
HAIL -> R.string.hail_conditions_text.toString()
THUNDERSTORM -> R.string.thunderstorm_conditions_text.toString()
THUNDERSTORM_WITH_RAIN -> R.string.thunderstorm_with_rain_conditions_text.toString()
THUNDERSTORM_WITH_HAIL -> R.string.thunderstorm_with_hail_conditions_text.toString()
else -> condition
}
}
}
data class GeoObjectModel(val locality: LocalityModel)
data class LocalityModel(val name: String)```
getConditionLocalized()其他所有内容都需要在映射器中进行映射。Mapper这是一个将一个模型转换为另一个模型的类,仅此而已。好吧,启动某种 enam 线程是正确的 -ENUM在其中列出所有天气,并在映射器中解决它。映射器将需要提供者上下文之类的东西。匕首之类的东西在这里会有所帮助。日期类不适用于逻辑。大约你应该有这样的方案=你从服务器远程获取模型,映射器重新映射它们并进行所有转换,输出是另一个具有准备数据的模型。(类似于ModelRemote->mapModelLocal->map->ModelUi也就是说,有几层模型。至少。MVVM 与它无关。这里看看Clean Architecture就明白了。视图模型是一个 UI 层,一切准备就绪都应该来自数据层。此外,您的字符串会toString无缘无故地被带到脑海中。