无法使用 Bloc 从 TextFormField 输入文本

问题描述 投票:0回答:1

从下图中可以看到,它成功地从API获取数据,但是每次我点击TextFormField输入文本时,它就像是在调用另一个状态或刷新页面,这就是为什么我无法输入任何消息。

注意: 没有 BlocBuilder TextFormField 工作正常。

我正在使用。

  • flutter_bloc: ^8.1.5
  • Android studio Hedgehog | 2023.1.1 Patch 2
  • Flutter 3.16.5
  • Dart 3.2.3

enter image description here

  late TextEditingController _controller;

  @override
  void initState() {
    super.initState();
    _controller = TextEditingController();
    BlocProvider.of<FetchSubcategoryByIdCubit>(context).fetchSubcategoryByCategoryIdCubit(context, categoryId: '123abcd');
  }

  @override
  void dispose() {
    super.dispose();
    _controller.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: BlocBuilder<FetchSubcategoryByIdCubit, FetchSubcategoryByIdState>(
        builder: (BuildContext context, FetchSubcategoryByIdState state) {
          if (state is FetchSubcategoryByIdSuccess) {
            final data = state.categories;
            return Padding(
              padding: const EdgeInsets.all(10.0),
              child: ListView(
                children: <Widget>[
                  const SizedBox(height: 32),
                  TextFormField(
                    controller: _controller,
                    decoration: InputDecoration(
                      hintText: 'Enter title',
                    ),
                  ),
                  const SizedBox(height: 32),
                  Text('SUCCESS $data'),

                ],
              ),
            );
          }
          return Center(child: CircularProgressIndicator.adaptive());
        },
      ),
    );
  }

以下肘级

class FetchSubcategoryByIdCubit extends Cubit<FetchSubcategoryByIdState> {
  final FetchSubcategoryByCategoryIdUseCase fetchSubcategoryByCategoryIdUseCase;
  FetchSubcategoryByIdCubit({
    required this.fetchSubcategoryByCategoryIdUseCase,
  }) : super(FetchSubcategoryByIdInitial());

  Future<void> fetchSubcategoryByCategoryIdCubit(context, {required String categoryId}) async {
    emit(FetchSubcategoryByIdLoading());

    try {
      final result = await fetchSubcategoryByCategoryIdUseCase.call(categoryId);
      emit(FetchSubcategoryByIdSuccess(categories: result.data!.data!));

    } catch (e) {
      emit(FetchSubcategoryByIdFailure());
    }
  }
}
flutter dart bloc textformfield
1个回答
0
投票

避免在当前状态为成功且与之前相同时重建 TextFormField。

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: BlocBuilder<FetchSubcategoryByIdCubit, FetchSubcategoryByIdState>(
      buildWhen: (previous, current) {
        return current is! FetchSubcategoryByIdSuccess || previous != current;
      },
      builder: (BuildContext context, FetchSubcategoryByIdState state) {
        if (state is FetchSubcategoryByIdSuccess) {
          final data = state.categories;
          return Padding(
            padding: const EdgeInsets.all(10.0),
            child: ListView(
              children: <Widget>[
                const SizedBox(height: 32),
                TextFormField(
                  controller: _controller,
                  decoration: InputDecoration(
                    hintText: 'Enter title',
                  ),
                ),
                const SizedBox(height: 32),
                Text('SUCCESS $data'),
              ],
            ),
          );
        }
        return Center(child: CircularProgressIndicator.adaptive());
      },
    ),
  );
}
© www.soinside.com 2019 - 2024. All rights reserved.