בקשת מידע | קבלת json מREST API בJetpack Compose למשתנים
-
אני מתכנת פעם ראשונה אפליקציית Jetpack Compose עבור אנדרואיד, ויש לי מסך שבו אני מציג למשתמש כפתורים שנוצרים מתוך רשימה, ככה
val buttonLabels = arrayOf("קפה נמס", "קפה שחור", "טסטר צ'ויס") val buttonLabelsList = buttonLabels.toList() items(buttonLabelsList.chunked(2), itemContent = { buttonPair -> Row( modifier = Modifier .fillMaxWidth() .height(120.dp), horizontalArrangement = Arrangement.spacedBy(16.dp), ) { for (label in buttonPair) { Button( onClick = { val amountItem = "2" bthText = label bthAmount = amountItem isButtonPressed = true }, modifier = Modifier .weight(1f) .fillMaxHeight() .padding(vertical = 20.dp, horizontal = 20.dp), colors = ButtonDefaults.buttonColors( contentColor = Color(0xFFE3F2FD) ), shape = MaterialTheme.shapes.medium ) { Text( text = label, style = MaterialTheme.typography.bodyLarge .copy( fontFamily = FontFamily(Font(R.font.rubik_regular, FontWeight.Normal)), fontWeight = FontWeight.Normal, fontSize = 24.sp, ), textAlign = TextAlign.Center ) } } } })
ואני רוצה שהרשימה תתקבל מכתובת אינטרנט בREST API שיישלח json עם תווית, איידי, ופרטים נוספים עבור כל כפתור. אני רוצה שהנתונים יתקבלו בעת פתיחת האפליקציה ולא בכל פתיחה של המסך הספציפי/יישמרו באפליקציה עד לריענון מכפתור ייעודי (אולי עדיף)
הענין הוא שאינני מצליח לקבל את הנתונים מקריאת הרשת.
אני מבצע את זה עם Retrofit וקריאת הרשת מתבצעת בהצלחה, והנתונים מגיעים, אבל אינני מצליח לאכסן אותם במשתנה/להשתמש בהם כמקור לbuttonLabels.
בכוונה אני לא מביא את הקוד לקריאות הרשת עצמם, כי זה עובד מעולה, וחסר לי בהבנת הלוגיקה של הקוטלין + Jetpack Compose עצמה (לענ"ד)
אשמח להסבר/דוגמה על המימוש (ViewModel) או אפילו להדרכה ממי שמבין בקוטלין/Jetpack Compose
-
@זונדל הרבה לפני... מחקתי את הנסיונות נלך על נקי.
זה הViewModel
package com.abaye.abayecoffee.network import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.abaye.abayecoffee.ApiService import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory class MyViewModel : ViewModel() { private val httpClient = OkHttpClient.Builder() .addInterceptor(HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY }) .build() private val retrofit = Retrofit.Builder() .baseUrl("https://abaye.co/") .addConverterFactory(GsonConverterFactory.create()) .client(httpClient) .build() private val apiService = retrofit.create(ApiService::class.java) fun getBth(s: String): String { var responseBodyString = "" viewModelScope.launch(Dispatchers.IO) { try { val response = apiService.getBth(s) responseBodyString = response.body()?.string().toString() println(responseBodyString) } catch (e: Exception) { e.printStackTrace() } } return responseBodyString } }
והAPI סרוויס
package com.abaye.abayecoffee import okhttp3.ResponseBody import retrofit2.Response import retrofit2.http.Field import retrofit2.http.FormUrlEncoded import retrofit2.http.POST interface ApiService { @FormUrlEncoded @POST("api/getBth") suspend fun getBth( @Field("s") username: String, ): Response<ResponseBody> }
הprintln(responseBodyString) אכן מדפיס את התוכן, אבלכיצד אני מקבל את זה לתוך הלbuttonLabels (כמובן שאצטרך לנתח את הjson ולשרשר רק את הנתונים הרצויים)
-
@אביי אתה צריך בקלאס של יצירת הכפתורים להשתמש ליצור משתנה
val viewModel: MyViewModel = getViewModel()
ואז אתה שאתה קורא לפונקציה
for (label in buttonPair) { Button( onClick = { val amountItem = "2" bthText = label bthAmount = amountItem isButtonPressed = true // קריאה לפונקציה מה-ViewModel viewModel.getBth(label) }, modifier = Modifier .weight(1f) .fillMaxHeight() .padding(vertical = 20.dp, horizontal = 20.dp), colors = ButtonDefaults.buttonColors( contentColor = Color(0xFFE3F2FD) ), shape = MaterialTheme.shapes.medium ) { Text( text = label, style = MaterialTheme.typography.bodyLarge .copy( fontFamily = FontFamily(Font(R.font.rubik_regular, FontWeight.Normal)), fontWeight = FontWeight.Normal, fontSize = 24.sp, ), textAlign = TextAlign.Center ) } }
נ.ב. נעזרתי בgpt מכיון שאין לי נסיון עם Jetpack אני יותר java-xml
-
@זונדל כתב בבקשת מידע | קבלת json מREST API בJetpack Compose למשתנים:
נ.ב. נעזרתי בgpt מכיון שאין לי נסיון עם Jetpack אני יותר java-xml
רואים, זה בכלל לא מה שהתכוונתי... לקרוא לפונקציה זה לא הבעיה שלי... השאלה שלי היא כיצד אני מקבל את הנתונים שמתקבלים בViewModel (מה שמודפס בprintln(responseBodyString)) לתוך משתנה כלשהו..
אולי @לא-מתייאש יוכל לעזור, זכור לי שציינת פעם שאתה מתכנת בJetpack Compose
-
@אביי כתב בבקשת מידע | קבלת json מREST API בJetpack Compose למשתנים:
@זונדל כתב בבקשת מידע | קבלת json מREST API בJetpack Compose למשתנים:
נ.ב. נעזרתי בgpt מכיון שאין לי נסיון עם Jetpack אני יותר java-xml
רואים, זה בכלל לא מה שהתכוונתי... לקרוא לפונקציה זה לא הבעיה שלי... השאלה שלי היא כיצד אני מקבל את הנתונים שמתקבלים בViewModel (מה שמודפס בprintln(responseBodyString)) לתוך משתנה כלשהו..
אולי @לא-מתייאש יוכל לעזור, זכור לי שציינת פעם שאתה מתכנת בJetpack Compose
מקראיה שטחית אני רואה שאתה לא מכיר את קוטלין, ולא יודע מה זה VIEWMODEL, הVIEWMODEL שלך בכלל לא משתמש כVIEWMODEL, אוליי כREPOSITORY אבל זה גם לא הצורה.
אתה צריך ללמוד קודם כל את העקרונות של קוטלין טוב טוב, אח"כ תוכל לעבור לJETPACK COMPOSE, וכשתשלוט על JETPACK COMPOSE, תוכל ללמוד את הMVVM. (אני גם לא רואה מודל במה שללחת)בטמפלייט שלי (אף שזה למחשבים דרך הJVM) תוכל לראות מה זה VIEWMODEL, וגם איך מנהלים את הSTATE (שזה הבעייה שלך)
https://github.com/kdroidFilter/compose-desktop
אני גם מקבל נתונים דרך API. -
@לא-מתייאש כתב בבקשת מידע | קבלת json מREST API בJetpack Compose למשתנים:
מקראיה שטחית אני רואה שאתה לא מכיר את קוטלין, ולא יודע מה זה VIEWMODEL, הVIEWMODEL שלך בכלל לא משתמש כVIEWMODEL, אוליי כREPOSITORY אבל זה גם לא הצורה.
אכן,
אתה צריך ללמוד קודם כל את העקרונות של קוטלין טוב טוב, אח"כ תוכל לעבור לJETPACK COMPOSE
ואכן
עדיין לא מצאתי מדריך נורמלי בעברית, ועם המדריכים (האולי מצויינים) של גוגל אני קצת מתקשה בגלל השפה..
אעיין בטמפלייט שלך בעז"ה, תודה
-
@אביי כתב בבקשת מידע | קבלת json מREST API בJetpack Compose למשתנים:
@לא-מתייאש כתב בבקשת מידע | קבלת json מREST API בJetpack Compose למשתנים:
מקראיה שטחית אני רואה שאתה לא מכיר את קוטלין, ולא יודע מה זה VIEWMODEL, הVIEWMODEL שלך בכלל לא משתמש כVIEWMODEL, אוליי כREPOSITORY אבל זה גם לא הצורה.
אכן,
אתה צריך ללמוד קודם כל את העקרונות של קוטלין טוב טוב, אח"כ תוכל לעבור לJETPACK COMPOSE
ואכן
עדיין לא מצאתי מדריך נורמלי בעברית, ועם המדריכים (האולי מצויינים) של גוגל אני קצת מתקשה בגלל השפה..
אעיין בטמפלייט שלך בעז"ה, תודה
אם רק התחלת, אוליי תוודא שקוטלין עם JETPACK COMPOSE, זה מה שהכי מתאים לפרוייקט שלך, ושיש לך צורך בלבנות אפליקצייה נטיבית.
שפות כמו DART עם FLUTTER מאפשרות לך לבנות אפליקציות גם כן (שנראות נטיביות) אבל בהרבה פחות סיבוכים. -
@לא-מתייאש כתב בבקשת מידע | קבלת json מREST API בJetpack Compose למשתנים:
שפות כמו DART עם FLUTTER מאפשרות לך לבנות אפליקציות גם כן (שנראות נטיביות) אבל בהרבה פחות סיבוכים.
ידוע.
זה בתכנון לשלב הבא, כעת אני רוצה ללמוד את עניין הJetpack Compose לכן בחרתי לעשות את זה דווקא עם זה..