#flutter #flutter-layout
#прерывание #флаттер-макет
Вопрос:
Я хочу делиться и показывать данные между BottomNavigationBarItems
Это моя страница BottomNavigationBar:
class BottomNavigationBarController extends StatefulWidget {
@override
_BottomNavigationBarControllerState createState() =>
_BottomNavigationBarControllerState();
}
class _BottomNavigationBarControllerState
extends State<BottomNavigationBarController> {
List<Widget> pages = [];
@override
void initState() {
pages.add(HomePage(
key: PageStorageKey('HomePage'),
));
pages.add(MapPage(
key: PageStorageKey('MapPage'),
));
super.initState();
}
int _currentIndex = 0;
Widget _bottomNavigationBar(int selectedIndex) => BottomNavigationBar(
onTap: (int index) => setState(() => _currentIndex = index),
currentIndex: selectedIndex,
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(icon: Icon(Icons.home), label: "Home"),
BottomNavigationBarItem(icon: Icon(Icons.map), label: "MapPage"),
],
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("iArrived"),
actions: _currentIndex != 1
? <Widget>[
IconButton(
icon: Icon(Icons.keyboard_arrow_right),
onPressed: () {
setState(() {
_currentIndex ;
});
})
]
: null),
backgroundColor: Colors.white,
bottomNavigationBar: _bottomNavigationBar(_currentIndex),
body: IndexedStack(
index: _currentIndex,
children: pages,
),
);
}
}
И я хочу отправить свое местоположение из MapPage на домашнюю страницу.
В отображении есть функция, которая выполняется при изменении места:
void _setLocation(LatLng latlng) {
setState(() {
lat = latlng.latitude;
lng = latlng.longitude;
});
}
Я думаю, что мне нужно вызвать какую-то функцию, например обратный вызов внутри _setLocation(), но я не знаю, как ее реализовать, чтобы показывать местоположение на моей домашней странице и обновлять его каждый раз, когда я его меняю.
Спасибо за помощь.
Если ваш ответ заключается в использовании плагина shared_preferences, можете ли вы сказать мне, как бы вы это реализовали? Потому что я попробовал это, и у меня это не сработало. Еще раз спасибо.
Ответ №1:
Вы можете использовать плагин поставщика для управления состоянием:
- Создайте модель, в которой хранится общее значение:
class LocationModel extends ChangeNotifier {
Location location;
void updateLocation(Location location) {
this.location = location;
notifyListeners();
}
}
- Оберните ваш корневой виджет классом Provider:
@override
Widget build(BuildContext build) {
return ChangeNotifierProvider(
create: (_) => LocationModel(),
child: App(),
);
}
- Когда вы меняете общее значение в модели (вам нужно получить модель от поставщика, это зависит от конкретной реализации). Например:
onTap() {
model.updateLocation(newLocation):
}
Комментарии:
1. Большое вам спасибо! Мне пришлось просмотреть документацию, которую вы отправили, потому что я не знал плагин, и это здорово! Большое вам спасибо! Это было очень полезно!