Future<void> loadProfile() async {
final profile = await repository.fetchProfile();
setState(() {
_profile = profile;
});
}
Future<void> loadProfile() async {
final profile = await repository.fetchProfile();
if (!mounted) return;
setState(() {
_profile = profile;
});
}
class ProfileCubit extends Cubit<ProfileState> {
ProfileCubit(this.repository) : super(const ProfileState.initial());
final ProfileRepository repository;
Future<void> loadProfile() async {
emit(const ProfileState.loading());
final profile = await repository.fetchProfile();
emit(ProfileState.loaded(profile));
}
}
class ProfileCubit extends Cubit<ProfileState> {
ProfileCubit(this.repository) : super(const ProfileState.initial());
final ProfileRepository repository;
Future<void> loadProfile() async {
emit(const ProfileState.loading());
final profile = await repository.fetchProfile();
if (isClosed) return;
emit(ProfileState.loaded(profile));
}
}
Future<void> onQueryChanged(String query) async {
setState(() => _loading = true);
final results = await repository.search(query);
if (!mounted) return;
setState(() {
_loading = false;
_results = results;
});
}
int _searchGeneration = 0;
Future<void> onQueryChanged(String query) async {
final generation = ++_searchGeneration;
setState(() => _loading = true);
final results = await repository.search(query);
if (!mounted || generation != _searchGeneration) return;
setState(() {
_loading = false;
_results = results;
});
} CancelToken? _searchCancelToken;
Future<void> onQueryChanged(String query) async {
_searchCancelToken?.cancel();
_searchCancelToken = CancelToken();
setState(() => _loading = true);
try {
final results = await repository.search(
query,
cancelToken: _searchCancelToken,
);
if (!mounted) return;
setState(() {
_loading = false;
_results = results;
});
} on DioException catch (error) {
if (CancelToken.isCancel(error)) return;
if (!mounted) return;
setState(() {
_loading = false;
_error = 'Не удалось загрузить результаты';
});
}
} @override
void dispose() {
_searchCancelToken?.cancel();
super.dispose();
} Timer? _searchDebounce;
void onQueryChanged(String query) {
_searchDebounce?.cancel();
_searchDebounce = Timer(const Duration(milliseconds: 400), () {
_search(query);
});
}
Future<void> _search(String query) async {
setState(() => _loading = true);
final results = await repository.search(query);
if (!mounted) return;
setState(() {
_loading = false;
_results = results;
});
} @override
void dispose() {
_searchDebounce?.cancel();
super.dispose();
} @override
Widget build(BuildContext context) {
return FutureBuilder<List<Item>>(
future: repository.loadItems(),
builder: (context, snapshot) {
// ...
return const SizedBox.shrink();
},
);
} late final Future<List<Item>> _itemsFuture;
@override
void initState() {
super.initState();
_itemsFuture = repository.loadItems();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<List<Item>>(
future: _itemsFuture,
builder: (context, snapshot) {
// ...
return const SizedBox.shrink();
},
);
} late final StreamSubscription<Message> _subscription;
@override
void initState() {
super.initState();
_subscription = chatRepository.messages.listen((message) {
setState(() {
_messages.add(message);
});
});
} late final StreamSubscription<Message> _subscription;
@override
void initState() {
super.initState();
_subscription = chatRepository.messages.listen((message) {
if (!mounted) return;
setState(() {
_messages.add(message);
});
});
}
@override
void dispose() {
_subscription.cancel();
super.dispose();
} Future<void> submitForm(BuildContext context) async {
final result = await repository.sendForm();
showDialog<void>(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Готово'),
content: Text(result.message),
);
},
);
} Future<void> submitForm(BuildContext context) async {
final result = await repository.sendForm();
if (!context.mounted) return;
showDialog<void>(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Готово'),
content: Text(result.message),
);
},
);
} Future<void> submitForm() async {
emit(const FormState.sending());
final result = await repository.sendForm();
if (isClosed) return;
emit(FormState.success(result.message));
} BlocListener<FormCubit, FormState>(
listener: (context, state) {
if (state is FormSuccess) {
showDialog<void>(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Готово'),
content: Text(state.message),
);
},А экран уже решает, как отреагировать на успешный результат:
);
}
},
child: const FormView(),
)