Я пытаюсь создать панель поиска, где пользователь может найти место и выбрать предложение, соответствующее тем персонажам, которые он написал.
Я использую 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
Почему виджет автозаполнения не обновляет предложения при перестроении? ⇐ JAVA
Программисты JAVA общаются здесь
1734395036
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79286395/why-doesnt-the-autocomplete-widget-update-the-suggestions-when-rebuilt[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия