首页 > 解决方案 > Flutter:第一次执行后Bloc不起作用

问题描述

我试图执行 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();
}

标签: flutterdartblocflutter-bloc

解决方案


推荐阅读