В методе build
под _RestaurantQueryState
вы возвращаете scaffold
вне метода builder
. Первоначально restaurantList
имеет значение null. Следовательно, вы не составляете список. Каждый раз, когда поток обновляется, вы получаете данные моментального снимка для обновления restaurantList
.
Проблема возникает здесь. Несмотря на то, что restaurantList
обновлен, виджет RestaurantList
не обновляется, потому что он находится вне метода построителя. Вы можете использовать следующий код. Здесь мы создаем виджет, содержащий виджет RestaurantList
. Виджет обновляется всякий раз, когда обновляется поток.
class _RestaurantQueryState extends State<RestaurantQuery> {
NearRestaurantBloc bloc;
@override
Widget build(BuildContext context) {
final database = Provider.of<Database>(context, listen: true);
final session = Provider.of<Session>(context);
final userCoordinates = session.position;
//////////////////////////////////
//initialize RestaurantList widget
//////////////////////////////////
Widget restaurantWidget = RestaurantList(
nearbyRestaurantsList: [],
stillLoading: false,
);
bloc = NearRestaurantBloc(
source: database.patronRestaurants(),
userCoordinates: userCoordinates,
);
return StreamBuilder<List<Restaurant>>(
stream: bloc.stream,
builder: (context, snapshot) {
bool stillLoading = true;
var restaurantList = List<Restaurant>();
if (snapshot.connectionState == ConnectionState.active) {
if (snapshot.hasData && snapshot.data.length > 0) {
restaurantList = snapshot.data;
/////////////////////////////
//update the restaurant widget
//////////////////////////////
restaurantWidget = RestaurantList(
nearbyRestaurantsList: restaurantList,
stillLoading: stillLoading,
);
}
stillLoading = false;
}
return Scaffold(
appBar: AppBar(
title: Text(
'Restaurants near you',
style: TextStyle(color: Theme.of(context).appBarTheme.color),
),
elevation: 2.0,
),
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
///////////////////////////
//use the restaurant Widget
///////////////////////////
body: restaurantWidget,
),
);
},
);
}