Прерывистая отправка и отображение данных между BottomNavigationBarItem

#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:


Вы можете использовать плагин поставщика для управления состоянием:

  1. Создайте модель, в которой хранится общее значение:
 class LocationModel extends ChangeNotifier {
  Location location;

  void updateLocation(Location location) {
    this.location = location;
    notifyListeners();
  }
}
 
  1. Оберните ваш корневой виджет классом Provider:
 @override
Widget build(BuildContext build) {
  return ChangeNotifierProvider(
    create: (_) => LocationModel(),
    child: App(),
  );
}
 
  1. Когда вы меняете общее значение в модели (вам нужно получить модель от поставщика, это зависит от конкретной реализации). Например:
 onTap() {
  model.updateLocation(newLocation):
}
 

Комментарии:

1. Большое вам спасибо! Мне пришлось просмотреть документацию, которую вы отправили, потому что я не знал плагин, и это здорово! Большое вам спасибо! Это было очень полезно!