从下图中可以看到,它成功地从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
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());
}
}
}
避免在当前状态为成功且与之前相同时重建 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());
},
),
);
}