Обработчик кликов в Builder нельзя применить к void - PullRequest
0 голосов
/ 03 апреля 2020

Я работаю в мобильном приложении (android) и начинаю изучать лито-фреймворк, я пишу обработчик кликов для определенного виджета внутри компонента. Но отображается ошибка

«Построитель не может быть аннулирован», почему эта проблема возникла по какой-то причине?

Как решить эту проблему. Мне нужен еще один вопрос. как получить значение ввода текста Спасибо за ваш ответ

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 Ответ

0 голосов
/ 03 апреля 2020

Прежде всего, имя вашего класса LayoutSpe c должно заканчиваться на Spec, и вы никогда не должны вызывать его методы напрямую. Когда вашему классу Spe c будет присвоено имя MyComponentSpec, компилятор сгенерирует реальную реализацию Litho Component с именем MyComponent (обратите внимание на отсутствие суффикса Spec). И методы этого класса вы должны использовать. Т.е. в вашем примере вы ссылаетесь на CAFAssessmentListItem.onEditTextClick(c, textInputHandle), который является методом Spec (который вы написали вручную), но вы должны использовать метод Компонента (который будет сгенерирован компилятором).

Во-вторых, все входные данные для компонента должны быть помечены как @Prop, то есть @Prop Assessment assessment. Опять же, потому что вы не должны использовать метод onCreateLayout самостоятельно - вы будете использовать сгенерированный ComponentBuilder. Например:

CAFAssessmentListItem.create(c)
  .assessment(myAssessment)
  .n(myString)
  .build()

В-третьих, вам не нужен ваш фрагмент для извлечения ресурсов. Для этого есть определенные c методы, например

Text.create(c)
  .testRes(resId)
  .textColorRes(colorResId)
  .backgroundColorRes(colorResId2)

В-четвертых, вы никогда не связывали textInputHandle с виджетом TextInput, чтобы получить что-либо на onClick. Проверьте это сделать c: 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. Add .handle(textInputHandle) в TextInput виджет
  5. Очистка настроек цветовых значений
...