Обработчик кликов в Builder не может быть применен к void
Я работаю в мобильном приложении (android) и начинаю изучать лито-фреймворк, я пишу обработчик кликов для определенного виджета внутри компонента. Но ошибка отображается
"Builder не может быть применен к void", почему эта проблема возникла не случайно?
Как решить эту проблему. Мне нужна другая проблема. как получить значение ввода текста Спасибо за ваш ответ
package com.hotfoot.rapid.aubank.sbl.fragment.qde;
import android.graphics.Color;
import android.os.Build;
import android.text.InputType;
import android.text.Layout;
import androidx.annotation.RequiresApi;
import com.facebook.litho.Border;
import com.facebook.litho.ClickEvent;
import com.facebook.litho.Column;
import com.facebook.litho.Component;
import com.facebook.litho.ComponentContext;
import com.facebook.litho.Handle;
import com.facebook.litho.annotations.LayoutSpec;
import com.facebook.litho.annotations.OnCreateLayout;
import com.facebook.litho.annotations.OnEvent;
import com.facebook.litho.annotations.Param;
import com.facebook.litho.annotations.Prop;
import com.facebook.litho.widget.Text;
import com.facebook.litho.widget.TextInput;
import com.facebook.yoga.YogaEdge;
import com.hotfoot.rapid.au.msme.app.pojo.caf.Assessment;
import com.hotfoot.rapid.aubank.sbl.R;
import java.util.ArrayList;
import java.util.List;
@LayoutSpec
public class CAFAssessmentListItem {
@RequiresApi(api = Build.VERSION_CODES.P)
@OnCreateLayout
static Component onCreateLayout(
ComponentContext c,
CAFAssessmentFragment cafFragment,
Assessment assessment,
@Prop String n) {
List<String> districtNames = new ArrayList();
districtNames.add("Chennai");
districtNames.add("Erode");
districtNames.add("Coimbatore");
districtNames.add("Tirunelveli");
final Handle textInputHandle = new Handle();
return Column.create(c)
.child(
Text.create(c)
.text(cafFragment.getActivity().getResources().getString(R.string.ro_assessment))
.marginDip(YogaEdge.ALL, 10.0f)
.textAlignment(Layout.Alignment.ALIGN_LEFT)
.textSizeSp(18.0f)
.textStyle(1)
.textColor(
cafFragment.getActivity().getResources().getColor(R.color.input_text_color)))
.child(
Text.create(c)
.text("CUSTOMER NAME")
.marginDip(YogaEdge.ALL, 10.0f)
.textAlignment(Layout.Alignment.ALIGN_NORMAL)
.textSizeSp(12.0f)
.textColor(cafFragment.getActivity().getResources().getColor(R.color.text_color)))
.child(
TextInput.create(c)
.hint("")
.marginDip(YogaEdge.ALL, 10.0f)
.inputType(InputType.TYPE_CLASS_TEXT)
.background(
cafFragment.getActivity().getResources().getDrawable(R.drawable.ic_apply_line))
.multiline(false)
.maxLines(1))
.child(
Text.create(c)
.text("CUSTOMER ADDRESS")
.paddingDip(YogaEdge.ALL, 1.0f)
.marginDip(YogaEdge.ALL, 10.0f)
.textAlignment(Layout.Alignment.ALIGN_NORMAL)
.textSizeSp(12.0f)
.textColor(cafFragment.getActivity().getResources().getColor(R.color.text_color)))
.child(
TextInput.create(c)
.hint("")
.marginDip(YogaEdge.ALL, 10.0f)
.inputType(InputType.TYPE_CLASS_TEXT)
.multiline(true)
.maxLines(5)
.background(
cafFragment.getActivity().getResources().getDrawable(R.drawable.bg_edt_popup)))
.child(
Text.create(c)
.text("CUSTOMER CONTACT NO")
.marginDip(YogaEdge.ALL, 10.0f)
.textAlignment(Layout.Alignment.ALIGN_NORMAL)
.textSizeSp(12.0f)
.textColor(cafFragment.getActivity().getResources().getColor(R.color.text_color)))
.child(
TextInput.create(c)
.hint("")
.marginDip(YogaEdge.ALL, 10.0f)
.inputType(InputType.TYPE_CLASS_PHONE)
.background(
cafFragment.getActivity().getResources().getDrawable(R.drawable.ic_apply_line))
.multiline(false)
.maxLines(1))
.child(
Text.create(c)
.text("CUSTOMER BUSINESS")
.marginDip(YogaEdge.ALL, 10.0f)
.textAlignment(Layout.Alignment.ALIGN_NORMAL)
.textSizeSp(12.0f)
.textColor(cafFragment.getActivity().getResources().getColor(R.color.text_color)))
.child(
TextInput.create(c)
.hint("")
.marginDip(YogaEdge.ALL, 10.0f)
.inputType(InputType.TYPE_CLASS_TEXT)
.background(
cafFragment.getActivity().getResources().getDrawable(R.drawable.ic_apply_line))
.multiline(false)
.maxLines(1))
.child(
Text.create(c)
.text("LOAN AMOUNT APPLIED")
.marginDip(YogaEdge.ALL, 10.0f)
.textAlignment(Layout.Alignment.ALIGN_NORMAL)
.textSizeSp(12.0f)
.textColor(cafFragment.getActivity().getResources().getColor(R.color.text_color)))
.child(
TextInput.create(c)
.hint("")
.marginDip(YogaEdge.ALL, 10.0f)
.inputType(InputType.TYPE_CLASS_NUMBER)
.background(
cafFragment.getActivity().getResources().getDrawable(R.drawable.ic_apply_line))
.multiline(false)
.maxLines(1))
.child(
Text.create(c)
.text("TENURE")
.marginDip(YogaEdge.ALL, 10.0f)
.textAlignment(Layout.Alignment.ALIGN_NORMAL)
.textSizeSp(12.0f)
.textColor(cafFragment.getActivity().getResources().getColor(R.color.text_color)))
.child(
TextInput.create(c)
.hint("")
.marginDip(YogaEdge.ALL, 10.0f)
.inputType(InputType.TYPE_CLASS_NUMBER)
.background(
cafFragment.getActivity().getResources().getDrawable(R.drawable.ic_apply_line))
.multiline(false)
.maxLines(1))
.child(
Text.create(c)
.text("EMi")
.marginDip(YogaEdge.ALL, 10.0f)
.textAlignment(Layout.Alignment.ALIGN_NORMAL)
.textSizeSp(12.0f)
.textColor(cafFragment.getActivity().getResources().getColor(R.color.text_color)))
.child(
TextInput.create(c)
.hint("")
.marginDip(YogaEdge.ALL, 10.0f)
.inputType(InputType.TYPE_CLASS_NUMBER)
.background(
cafFragment.getActivity().getResources().getDrawable(R.drawable.ic_apply_line))
.multiline(false)
.maxLines(1))
.child(
Text.create(c)
.text("PD WITH")
.marginDip(YogaEdge.ALL, 10.0f)
.textAlignment(Layout.Alignment.ALIGN_NORMAL)
.textSizeSp(12.0f)
.textColor(cafFragment.getActivity().getResources().getColor(R.color.text_color)))
.child(
com.facebook.litho.widget.Spinner.create(c)
.marginDip(YogaEdge.ALL, 10.0f)
.options(districtNames)
.selectedOption(districtNames.get(1))
.border(
Border.create(c)
.widthDip(YogaEdge.ALL, 1)
.color(YogaEdge.ALL, Color.BLACK)
.build()))
.child(
Text.create(c)
.text("PLACE OF PD-ADDRESS")
.marginDip(YogaEdge.ALL, 10.0f)
.textAlignment(Layout.Alignment.ALIGN_NORMAL)
.textSizeSp(12.0f)
.textColor(cafFragment.getActivity().getResources().getColor(R.color.text_color)))
.child(
com.facebook.litho.widget.Spinner.create(c)
.marginDip(YogaEdge.ALL, 10.0f)
.options(districtNames)
.selectedOption(districtNames.get(1))
.border(
Border.create(c)
.widthDip(YogaEdge.ALL, 1)
.color(YogaEdge.ALL, Color.BLACK)
.build()))
.child(
Text.create(c)
.text("PURPOSE OF LOAN")
.marginDip(YogaEdge.ALL, 10.0f)
.textAlignment(Layout.Alignment.ALIGN_NORMAL)
.textSizeSp(12.0f)
.textColor(cafFragment.getActivity().getResources().getColor(R.color.text_color)))
.child(
com.facebook.litho.widget.Spinner.create(c)
.marginDip(YogaEdge.ALL, 10.0f)
.options(districtNames)
.selectedOption(districtNames.get(1))
.border(
Border.create(c)
.widthDip(YogaEdge.ALL, 1)
.color(YogaEdge.ALL, Color.BLACK)
.build()))
.child(
Text.create(c)
.text("SAVE")
.textSizeSp(14.0f)
.paddingDip(YogaEdge.ALL, 12.0f)
.textAlignment(Layout.Alignment.ALIGN_CENTER)
.marginDip(YogaEdge.ALL, 10.0f)
.backgroundColor(cafFragment.getActivity().getResources().getColor(R.color.orange))
.textColor(cafFragment.getActivity().getResources().getColor(R.color.white))
.border(
Border.create(c)
.widthDip(YogaEdge.ALL, 1)
.color(YogaEdge.ALL, Color.parseColor("#F36F21"))
.build()))
.child(
Text.create(c)
.text("NEXT")
.textSizeSp(14.0f)
.paddingDip(YogaEdge.ALL, 12.0f)
.textAlignment(Layout.Alignment.ALIGN_CENTER)
.marginDip(YogaEdge.ALL, 10.0f)
.backgroundColor(cafFragment.getActivity().getResources().getColor(R.color.purple))
.textColor(cafFragment.getActivity().getResources().getColor(R.color.white))
.border(
Border.create(c)
.widthDip(YogaEdge.ALL, 1)
.color(YogaEdge.ALL, Color.parseColor("#FFA500"))
.build()))
.clickHandler(CAFAssessmentListItem.onEditTextClick(c, textInputHandle))
.build();
}
@OnEvent(ClickEvent.class)
static void onEditTextClick(ComponentContext c, @Param Handle textInputHandle) {
String customer = TextInput.getText(c, textInputHandle).toString();
}
}
1 ответ
Прежде всего, имя вашего класса LayoutSpec должно заканчиваться на Spec
и вы никогда не должны вызывать его методы напрямую. Когда ваш класс Spec будет названMyComponentSpec
компилятор сгенерирует реальную реализацию Litho Component с именем MyComponent
(обратите внимание на отсутствие суффикса Spec
). И методы этого класса вы должны использовать. Т.е. в вашем примере вы ссылаетесьCAFAssessmentListItem.onEditTextClick(c, textInputHandle)
который Spec
(который вы написали вручную), но вы должны использовать метод Component (который будет сгенерирован компилятором).
Во-вторых, все входы в компонент должны быть помечены как @Prop
, т.е. @Prop Assessment assessment
. Опять же, потому что вы не должны использоватьonCreateLayout
метод самостоятельно - вы будете использовать сгенерированный ComponentBuilder. Подобно:
CAFAssessmentListItem.create(c)
.assessment(myAssessment)
.n(myString)
.build()
В-третьих, вам не нужен ваш фрагмент для извлечения ресурсов. Для этого есть специальные методы, т.е.
Text.create(c)
.testRes(resId)
.textColorRes(colorResId)
.backgroundColorRes(colorResId2)
В-четвертых, ты никогда не связывался textInputHandle
с TextInput
виджет, чтобы получить что-нибудь на onClick
. Посмотрите этот документ: https://fblitho.com/docs/trigger-events. Вам нужно добавить.handle(textInputHandle)
к TextInput
.
И, наконец, вам не нужно разбирать цвет из строки .color(Color.parseColor("#F36F21"))
когда у вас уже есть значение для этого цвета - вы можете просто использовать шестнадцатеричный int .color(0xFFF36F21)
.
Подвести итог:
- Переименуйте свой класс, добавьте
Spec
до конца (но не переименовыватьCAFAssessmentListItem.onEditTextClick
призыв). - Добавить
@Prop
кAssessment
param и удалить параметр Fragment изonCreateLayout
- Заменить
cafFragment.getActivity().getResources().
призывы просто использовать идентификаторы ресурсов и соответствующие методы в виджетах - Добавить
.handle(textInputHandle)
кTextInput
виджет - Значения цвета настройки очистки