Flutter: блок не работает после первого запуска

avatar
szakes1
8 августа 2021 в 20:13
319
0
1

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

Когда я нажимаю кнопку "Поиск", отображается круговой индикатор выполнения, а затем текст "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();
}

Источник
KuKu
9 августа 2021 в 04:41
0

Когда я попробовал ваш код после удаления между кодом «SearchLoading» и «SearchFinal», все было в порядке. Вы бы попробовали так?

szakes1
9 августа 2021 в 08:50
0

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

KuKu
9 августа 2021 в 09:25
0

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

Joel Broström
9 марта 2022 в 12:16
0

Вы нашли исправление?

Ответы (0)