Флаттер: Блок не работает после выполнения в первый раз

#flutter #dart #bloc #flutter-bloc

Вопрос:

Я пытаюсь выполнить Блок больше одного раза, однако я не знаю, как с этим справиться.

Когда я нажимаю поиск, он показывает индикатор выполнения, а затем текст «Sukces», но когда я нажимаю на него во второй раз, индикатор не отображается.

Как это исправить?

Ссылка на видео моего приложения: https://streamable.com/77jyf1

Мой код:

 import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:jaki_to_bank/screens/home/bloc/search_bloc.dart';
import 'package:provider/provider.dart';
import 'package:jaki_to_bank/generated/l10n.dart';
import 'package:jaki_to_bank/screens/home/widgets/search_button.dart';
import 'package:jaki_to_bank/screens/home/widgets/search_text_field.dart';

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final _formKey = GlobalKey<FormState>();
  final SearchBloc _bloc = SearchBloc();

  final TextEditingController _bankAccountController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(S.current.title),
      ),
      body: Container(
        padding: EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              SearchTextField(
                controller: _bankAccountController,
                validator: (text) {
                  if (text == null || text.isEmpty) {
                    return S.current.emptyFieldError;
                  }
                  return null;
                },
              ),
              SizedBox(height: 16.0),
              SearchButton(
                onPressed: () {
                  if (_formKey.currentState!.validate()) {
                    final validationBloc = context.read<SearchBloc>();
                    validationBloc.add(GetText(_bankAccountController.text));
                  }
                },
              ),
              BlocBuilder<SearchBloc, SearchState>(
                builder: (context, state) {
                  if (state is SearchInitial) {
                    return Container();
                  }

                  if (state is SearchLoading) {
                    return CircularProgressIndicator();
                  }
                  if (state is SearchFinal) {
                    return Text('Sukces!');
                  }
                  return Container();
                },
              )
            ],
          ),
        ),
      ),
    );
  }
}

 
 part of 'search_bloc.dart';

@immutable
abstract class SearchEvent {}

class GetText extends SearchEvent {
  final String bankAccountNumber;

  GetText(this.bankAccountNumber);
}

 
 import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:flutter/material.dart';
import 'package:jaki_to_bank/data/repositories/bank_repository.dart';
import 'package:meta/meta.dart';
import 'package:xml/xml.dart';

part 'search_event.dart';
part 'search_state.dart';

class SearchBloc extends Bloc<SearchEvent, SearchState> {
  SearchBloc() : super(SearchInitial());

  @override
  Stream<SearchState> mapEventToState(
    SearchEvent event,
  ) async* {
    if (event is GetText) {
      yield SearchLoading();

      final String bankAccountNumber = event.bankAccountNumber;
      final String bankIdNumber = bankAccountNumber.substring(2, 5);
      final BankRepository bankRepo = BankRepository();
      final List<String> bankIdsList = <String>[];

      final XmlDocument banks = await bankRepo.getParsedXmlText();

      final Iterable<XmlElement> bankIds =
          banks.findAllElements('NrInstytucji');

      bankIds.map((node) => node.text).forEach((element) {
        print(element);
      });

      yield SearchFinal();
    }
  }
}

 
 part of 'search_bloc.dart';

@immutable
abstract class SearchState {}

class SearchInitial extends SearchState {
  SearchInitial();
}

class SearchLoading extends SearchState {
  SearchLoading();
}

class SearchFinal extends SearchState {
  SearchFinal();
}

 

Комментарии:

1. Когда я попытался использовать ваш код после удаления между «Загрузкой поиска» и «окончательным поиском», все было в порядке. Не могли бы вы попробовать вот так?

2. На какой файл вы ссылаетесь?

3. Событие GetText в SearchBloc. Мне просто интересно, есть ли проблема со вторым событием GetText.