Android 如何从文件室中检索布尔值并以懒散列状态显示它
我正在建立这个习惯跟踪器,我面临两个问题:首先,我在片段上创建的数据只有在我重新启动应用程序后才会显示,为什么会发生这种情况 还有,我有3张桌子,日期,习惯,日期和习惯。当DatesWithHabits为true时,我使用一个开关在DatesWithHabits上添加一个新行,当为false时将其删除。这一切正常,但当我选择一个不同的日期时,它不会加载它所处的状态,即使它在表上。当我点击日期并将其显示在表上时,如何使其显示为打开 希望我能说清楚。下面是我的代码Android 如何从文件室中检索布尔值并以懒散列状态显示它,android,kotlin,android-room,android-jetpack-compose,Android,Kotlin,Android Room,Android Jetpack Compose,我正在建立这个习惯跟踪器,我面临两个问题:首先,我在片段上创建的数据只有在我重新启动应用程序后才会显示,为什么会发生这种情况 还有,我有3张桌子,日期,习惯,日期和习惯。当DatesWithHabits为true时,我使用一个开关在DatesWithHabits上添加一个新行,当为false时将其删除。这一切正常,但当我选择一个不同的日期时,它不会加载它所处的状态,即使它在表上。当我点击日期并将其显示在表上时,如何使其显示为打开 希望我能说清楚。下面是我的代码 @Dao interface Us
@Dao
interface UserDao {
@Transaction
@Query("SELECT * FROM date")
suspend fun getAllDates(): List<CalDate>
@Transaction
@Query("SELECT * FROM date WHERE date = :date")
suspend fun getDateWithHabits(date: String): List<DatesWithHabits>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertHabitWithDate(crossRef: DatesHabitsCrossRef)
视图模型
@HiltViewModel
class UserViewModel @Inject constructor(
private val repository: MainRepository
) : ViewModel() {
val calDateList: MutableState<List<CalDate>> = mutableStateOf(listOf())
init {
getAllDates()
}
viewModelScope.launch() {
try {
val result: List<CalDate> = repository.getAllDates()
calDateList.value = result
} catch (e: Exception) {
Log.e("SSS", "${e.message.toString()}; ${e.stackTrace}")
}
}
}
val datesWithHabits : MutableState<List<DatesWithHabits>> = mutableStateOf(listOf())
fun getDatesWithHabits(date: String){
viewModelScope.launch {
datesWithHabits.value = repository.getDatesWithHabits(date)
}
}
fun insertHabitWithDate(crossRef: DatesHabitsCrossRef){
viewModelScope.launch {
repository.insertHabitWithDate(crossRef)
}
}
@HiltViewModel
类UserViewModel@Inject构造函数(
专用val存储库:MainRepository
):ViewModel(){
val calDateList:MutableState=mutableStateOf(listOf())
初始化{
getAllDates()
}
viewModelScope.launch(){
试一试{
val结果:List=repository.getAllDates()
calDateList.value=结果
}捕获(e:例外){
Log.e(“SSS”,“${e.message.toString()};${e.stackTrace}”)
}
}
}
val datesWithHabits:MutableState=mutableStateOf(listOf())
趣味getDatesWithHabits(日期:字符串){
viewModelScope.launch{
datesWithHabits.value=repository.getDatesWithHabits(日期)
}
}
fun insertHabitWithDate(交叉引用:DateShabitCrossRef){
viewModelScope.launch{
repository.insertHabitWithDate(crossRef)
}
}
那碎片呢
@AndroidEntryPoint
class CalendarListFragment : Fragment() {
private val viewModel: UserViewModel by viewModels()
@RequiresApi(Build.VERSION_CODES.O)
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return ComposeView(requireContext()).apply {
setContent {
val datesWithHabits = viewModel.datesWithHabits.value
val dateList = viewModel.calDateList.value
Column(Modifier.padding(8.dp)) {
LazyRow(modifier = Modifier.padding(vertical = 8.dp)) {
items(items = dateList) { date ->
DateCard(
date = date,
onClick = { dateSelected.value = date.date.toString()
viewModel.getDatesWithHabits(date.date)
)
}
}
LazyColumn(Modifier.padding(8.dp)) {
items(items = habitList) { habit ->
HabitCard(
habit = habit,
viewModel,
dateSelected.value,
datesWithHabits
)
}
}
@Composable
fun HabitCard(
habit: Habit,
viewModel: UserViewModel,
calDate: String,
datesHabit: List<DatesWithHabits>
) {
Card {
Row {
Text(text = habit.habit)
HabitSwitch(viewModel, habit.habit, calDate, datesHabit)
}
}
}
@Composable
fun DateCard(
date: CalDate,
onClick: () -> Unit
) {
Card{
Column {
Text(
text = date.week,
)
Text(
text = date.date,
)
}
}
}
@Composable
fun HabitSwitch(
viewModel: UserViewModel,
habit: String,
calDate: String,
dateHabit: List<DatesWithHabits>
) {
var state = remember { mutableStateOf(false) }
Switch(
checked = state.value,
onCheckedChange = {
state.value = it
if (it) {
viewModel.insertHabitWithDate(DatesHabitsCrossRef(calDate, habit))
} else {
viewModel.deleteHabitWithDate(DatesHabitsCrossRef(calDate, habit))
}
}
)
}
@AndroidEntryPoint
类CalendarListFragment:Fragment(){
private val viewModel:UserViewModel by viewModels()
@RequiresApi(Build.VERSION\u code.O)
覆盖创建视图(
充气器:布局充气器,容器:视图组?,
savedInstanceState:捆绑?
):查看{
返回ComposeView(requireContext())。应用{
设置内容{
val dateswithhobits=viewModel.dateswithhobits.value
val dateList=viewModel.calDateList.value
列(修饰符填充(8.dp)){
懒散的人(修饰符=修饰符.填充(垂直=8.dp)){
项目(项目=日期列表){date->
日期卡(
日期=日期,
onClick={dateSelected.value=date.date.toString()
viewModel.getDatesWithHabits(date.date)
)
}
}
LazyColumn(修饰符填充(8.dp)){
项目(项目=习惯列表){习惯->
习惯卡(
习惯,
视图模型,
dateSelected.value,
约会习惯
)
}
}
@组合的
娱乐习惯卡(
习惯:习惯,
viewModel:UserViewModel,
calDate:String,
日期:列表
) {
卡片{
划船{
文本(文本=习惯。习惯)
HabitSwitch(viewModel、habit.habit、calDate、datesHabit)
}
}
}
@组合的
趣味约会卡(
日期:CalDate,
onClick:()->单位
) {
卡片{
纵队{
正文(
text=date.week,
)
正文(
text=date.date,
)
}
}
}
@组合的
趣味习惯开关(
viewModel:UserViewModel,
习惯:绳子,
calDate:String,
日期习惯:列表
) {
var state=记住{mutableStateOf(false)}
开关(
选中=state.value,
onCheckedChange={
state.value=it
如果(它){
viewModel.insertHabitWithDate(DateShabitCrossRef(calDate,习惯))
}否则{
viewModel.deleteHabitWithDate(DateShabitCrossRef(calDate,习惯))
}
}
)
}
@AndroidEntryPoint
class CalendarListFragment : Fragment() {
private val viewModel: UserViewModel by viewModels()
@RequiresApi(Build.VERSION_CODES.O)
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return ComposeView(requireContext()).apply {
setContent {
val datesWithHabits = viewModel.datesWithHabits.value
val dateList = viewModel.calDateList.value
Column(Modifier.padding(8.dp)) {
LazyRow(modifier = Modifier.padding(vertical = 8.dp)) {
items(items = dateList) { date ->
DateCard(
date = date,
onClick = { dateSelected.value = date.date.toString()
viewModel.getDatesWithHabits(date.date)
)
}
}
LazyColumn(Modifier.padding(8.dp)) {
items(items = habitList) { habit ->
HabitCard(
habit = habit,
viewModel,
dateSelected.value,
datesWithHabits
)
}
}
@Composable
fun HabitCard(
habit: Habit,
viewModel: UserViewModel,
calDate: String,
datesHabit: List<DatesWithHabits>
) {
Card {
Row {
Text(text = habit.habit)
HabitSwitch(viewModel, habit.habit, calDate, datesHabit)
}
}
}
@Composable
fun DateCard(
date: CalDate,
onClick: () -> Unit
) {
Card{
Column {
Text(
text = date.week,
)
Text(
text = date.date,
)
}
}
}
@Composable
fun HabitSwitch(
viewModel: UserViewModel,
habit: String,
calDate: String,
dateHabit: List<DatesWithHabits>
) {
var state = remember { mutableStateOf(false) }
Switch(
checked = state.value,
onCheckedChange = {
state.value = it
if (it) {
viewModel.insertHabitWithDate(DatesHabitsCrossRef(calDate, habit))
} else {
viewModel.deleteHabitWithDate(DatesHabitsCrossRef(calDate, habit))
}
}
)
}