Обработчик кликов в 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).

Подвести итог:

  1. Переименуйте свой класс, добавьте Spec до конца (но не переименовывать CAFAssessmentListItem.onEditTextClick призыв).
  2. Добавить @Prop к Assessment param и удалить параметр Fragment из onCreateLayout
  3. Заменить cafFragment.getActivity().getResources(). призывы просто использовать идентификаторы ресурсов и соответствующие методы в виджетах
  4. Добавить .handle(textInputHandle) к TextInput виджет
  5. Значения цвета настройки очистки
Другие вопросы по тегам