как выполнить API при заполнении текстового поля BLO C FLUTTER? - PullRequest
0 голосов
/ 07 мая 2020

как выполнить API при заполнении текстового поля. поэтому, когда текстовое поле заполнено, оно начинает выполнение API. Я пробовал создать функцию проверки, которая работает, если текстовое поле не равно нулю, тогда я могу только запустить выполнение API. следующими способами:

в блоке Я делаю функцию проверки, чтобы проверить, заполнено ли текстовое поле (_prefix) или нет, но эта функция вызывает ошибку при вызове в inState в разделе пользовательского интерфейса. BLO C:

class DenomPulsaBloc {
  final _repository = EresidenceRepository();
  final _prefix = BehaviorSubject<String>();
  SharedPreferences sPrefs;
  final BehaviorSubject<List<Payload>> _subject = BehaviorSubject<List<Payload>>();

  Function(String) get prefix => _prefix.sink.add;

  cek() async{
    if(_prefix.value.length >= 3) {
      denomPulsa();
    }else{
      print("GAGAL");
    }
  }

  denomPulsa() async{
    try{
      sPrefs = await SharedPreferences.getInstance();
      ListPulsaResponses  responses = await _repository.listDenomPulsa(sPrefs.getString("userid"), sPrefs.getString("password"), sPrefs.getString("imei"),
          sPrefs.getString("coordinate"), sPrefs.getString("bit61"), sPrefs.getString("bit62"), _prefix.value);

      List<Payload> list = responses.data.payload;

      _subject.sink.add(list);

      print(list);

    }catch(e){
      print(e.toString());
      _subject.sink.add(e);
    }
  }

  dispose(){
    _subject.close();
    _prefix.close();
  }

  BehaviorSubject<List<Payload>> get subject => _subject;

}

UI:

class _PulsaPageState extends State<PulsaPage> {
  DenomPulsaBloc denomPulsaBloc;
  int selectedCard = -1;

  @override
  void initState() {
    super.initState();
    denomPulsaBloc = DenomPulsaBloc();
    denomPulsaBloc.cek();
  }

  @override
  void dispose() {

    denomPulsaBloc.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DefaultTabController(
        length: 2,
        child: Scaffold(
          backgroundColor: Colors.white,
          appBar: AppBar(
            backgroundColor: Colors.white,
            brightness: Brightness.light,
            elevation: 0.0,
            leading: InkWell(
              onTap: () {
                Navigator.of(context).pop();
              },
              child: Icon(
                Icons.arrow_back_ios,
                color: Colors.black,
                size: SizeConfig.texIconSize,
              ),
            ),
          ),
          body: SafeArea(
            child: Container(
              height: SizeConfig.screenHeight,
              width: SizeConfig.screenWidth,
              padding: EdgeInsets.symmetric(horizontal: SizeConfig.widthMultiplier * 4),
              child: Column(
                mainAxisSize: MainAxisSize.max,
                children: <Widget>[
                  Container(
                    alignment: Alignment.centerLeft,
                    child: Text(
                      'Pulsa',
                      style: AppTheme.styleSubTitleBoldLarge,
                    )
                  ),
                  Container(
                    margin: EdgeInsets.only(top: SizeConfig.heightMultiplier * 4),
                    decoration: BoxDecoration(
                      boxShadow: <BoxShadow>[
                        BoxShadow(blurRadius: 5.0, color: Colors.black12)
                      ]
                    ),
                    child: ClipRRect(
                      borderRadius: BorderRadius.circular(8.0),
                      child: Container(
                        padding: EdgeInsets.all(SizeConfig.heightMultiplier * 2),
                        color: Colors.white,
                        child: Row(
                          mainAxisSize: MainAxisSize.max,
                          mainAxisAlignment: MainAxisAlignment.start,
                          children: <Widget>[
                            Expanded(
                              flex: 1,
                              child:
                              Container(
                                child: Icon(Icons.phone_android, color: Colors.green, size: SizeConfig.texIconSize,),
                              ),
                            ),
                            Expanded(
                              flex: 9,
                              child: Container(
                                margin: EdgeInsets.only(left: SizeConfig.widthMultiplier * 3),
                                child:Column(
                                    mainAxisSize: MainAxisSize.max,
                                    crossAxisAlignment: CrossAxisAlignment.start,
                                    children: <Widget>[
                                      Container(
                                        child: Text(
                                          'Number',
                                          style: AppTheme.styleSubTitle,
                                        ),
                                      ),
                                      Container(
                                        child: Stack(children: <Widget>[
                                          Container(
                                            height: SizeConfig.heightMultiplier * 5.5,
                                            child: TextFormField(
                                              inputFormatters: [
                                                new LengthLimitingTextInputFormatter(13)
                                              ],
                                              style: AppTheme.styleSubTitleBlackSmall,
                                              decoration: const InputDecoration(
                                                  hintText: '090900909'
                                              ),
                                              onChanged: denomPulsaBloc.prefix,
                                            ),
                                          ),
                                          Align(
                                            alignment: Alignment.centerRight,
                                            child: Container(
                                              alignment: Alignment.centerRight,
                                              height: SizeConfig.texIconSize,
                                              width: SizeConfig.texIconSize,
                                              margin: EdgeInsets.only(right: SizeConfig.widthMultiplier * 9, top: SizeConfig.heightMultiplier * 1.5),
                                              child: Image.asset(
                                                "res/images/xl.png",
                                                fit: BoxFit.fill,
                                              )
                                            ),
                                          ),
                                          Align(
                                            alignment: Alignment.centerRight,
                                            child: Container(
                                              margin: EdgeInsets.only(top: SizeConfig.heightMultiplier * 1.5),
                                              child: InkWell(
                                                onTap: (){},
                                                child: Icon(
                                                  Icons.close,
                                                  size: SizeConfig.texIconSize,
                                                ),
                                              )
                                            )
                                          )
                                        ]),
                                      ),
                                    ]
                                ),
                              )
                            ),
                          ],
                        ),
                      ),
                    ),
                  ),
                  Expanded(
                    child: Container(
                      width: SizeConfig.screenWidth,
                      height: SizeConfig.screenHeight,
                      child: StreamBuilder(
                        stream: denomPulsaBloc.subject,
                        builder: (context, AsyncSnapshot<List<Payload>> snapshot) {
                          if (snapshot.hasData) {
//                          print(snapshot.data);
                            return listDenomPulsa(snapshot);
                          }else{
                            Error();
                          }
                          return Container();
                        },
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
...