Почему виджет автозаполнения не обновляет предложения при перестроении?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему виджет автозаполнения не обновляет предложения при перестроении?

Сообщение Anonymous »

Я пытаюсь создать панель поиска, где пользователь может найти место и выбрать предложение, соответствующее тем персонажам, которые он написал.
Я использую BLOC и API для получения предложений из строки, которую написал пользователь. Виджет, который я использую для отображения предложения, — «Автозаполнение».
Моя проблема в том, что этот виджет автозаполнения не перестраивает предложения, в то время как построитель блоков (родительский элемент «Автозаполнение») перестраивается правильно.
Мой блок для получения предложений имеет 3 состояния: Ошибка, PlaceSuggestionsLoading и PlaceSuggestionLoaded, и работает нормально.
Вот что Я пробовал:
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

class Place {
final String name;
Place({required this.name});
}

abstract class PlaceResearchState {}

class PlaceResearchInitial extends PlaceResearchState {}

class PlaceSuggestionsLoading extends PlaceResearchState {}

class PlaceSuggestionsLoaded extends PlaceResearchState {
final List
placeSuggestions;
PlaceSuggestionsLoaded(this.placeSuggestions);
}

class PlaceSuggestionsError extends PlaceResearchState {
final String message;
PlaceSuggestionsError(this.message);
}

class PlaceResearchBloc extends Cubit {
PlaceResearchBloc() : super(PlaceResearchInitial());

void searchSuggestions(String query) {
if (query.isEmpty) {
emit(PlaceResearchInitial());
return;
}
emit(PlaceSuggestionsLoading());
Future.delayed(Duration(milliseconds: 500), () {
final suggestions = _fetchPlaceSuggestions(query);
if (suggestions.isNotEmpty) {
emit(PlaceSuggestionsLoaded(suggestions));
} else {
emit(PlaceSuggestionsError("No suggestion found"));
}
});
}

List _fetchPlaceSuggestions(String query) {
List allPlaces = [
Place(name: 'New York'),
Place(name: 'Paris'),
Place(name: 'London'),
Place(name: 'Hamburg'),
Place(name: 'Barcelona')
];
return allPlaces.where((place) => place.name.toLowerCase().contains(query.toLowerCase())).toList();
}
}

class SearchBarWithBlocListener extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Autocomplete MRE")),
body: Stack(
children: [
Positioned(
top: 20,
left: 10,
right: 10,
child: Material(
elevation: 4,
borderRadius: BorderRadius.circular(8),
child: BlocProvider(
create: (_) => PlaceResearchBloc(),
child: BlocBuilder(
builder: (context, state) {
List suggestions = [];

if (state is PlaceSuggestionsLoaded) {
suggestions = state.placeSuggestions.map((place) => place.name).toList();
}

print("Bloc builder Suggestions : $suggestions");

return Autocomplete(
optionsBuilder: (TextEditingValue textEditingValue) {

print("Autocomplete suggestions : $suggestions");

return suggestions.where(
(suggestion) => suggestion.toLowerCase().contains(textEditingValue.text.toLowerCase()),
);
},
displayStringForOption: (String option) => option,
onSelected: (String selection) {
print('Selected suggestion : $selection');
},
fieldViewBuilder: (BuildContext context, TextEditingController fieldTextEditingController, FocusNode fieldFocusNode, VoidCallback onFieldSubmitted) {
return TextField(
controller: fieldTextEditingController,
focusNode: fieldFocusNode,
onChanged: (value) {
// Search for suggestions on each modifications
context.read().searchSuggestions(value);
},
decoration: InputDecoration(
hintText: "Search for a place",
border: InputBorder.none,
contentPadding: EdgeInsets.symmetric(horizontal: 15, vertical: 10),
),
);
},
);
},
),
),
),
),
],
),
);
}
}

Чего я не понимаю, так это того, что первый отпечаток:
print("Bloc builder Suggestions : $suggestions");

срабатывает, когда появляются новые предложения, но не второе:
print("Autocomplete suggestions : $suggestions");

и поэтому предложения не обновляются при загрузке блоком.

Я не понимаю, почему виджет автозаполнения не перестраивается, когда BlocBuilder ...

Я делаю что-то не так или чего-то не понимаю?
Это мой pubspec.yaml:
# State management
flutter_bloc: ^8.1.6


Подробнее здесь: https://stackoverflow.com/questions/792 ... en-rebuilt
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»