Flutter BottomNavigationBar ждут асин c функцию - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть нижняя панель навигации в StatefulWidget и диалоговое окно с 3 вариантами: открыть камеру, галерею или отменить.

Вот мой код: панель навигации

Widget build(BuildContext context) {
    return new Scaffold(
      body: PageView(
        children: [
          Container(
            color: Colors.white,child: HomePage(),),
          Container(
            color: Colors.white,child: AddPost(),),
        ],
        controller: pageController,
        physics: NeverScrollableScrollPhysics(),
        onPageChanged: onPageChanged,
      ),
      bottomNavigationBar: CupertinoTabBar(
        backgroundColor: Colors.white,
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(
              icon: Icon(Icons.home,
              title: Container(height: 0.0),
              backgroundColor: Colors.white),
          BottomNavigationBarItem(
              icon: Icon(Icons.add_circle,
              title: Container(height: 0.0),
          )
        ],
        onTap: navigationTapped,
        currentIndex: _page,
      ),
    );
  }

диалог

  File file;
  _selectImage( ) async {
    return showDialog<Null>(
      context: context,
      barrierDismissible: false, // user must tap button!
      builder: (BuildContext context) {
        return SimpleDialog(
          title: const Text('Create a Post'),
          children: <Widget>[
            SimpleDialogOption(
                child: const Text('Take a photo'),
                onPressed: () async {
                  Navigator.pop(context);
                  File imageFile =
                      await ImagePicker.pickImage(source: ImageSource.camera, maxWidth: 1920, maxHeight: 1200, imageQuality: 80);
                  setState(() {
                    file = imageFile;
                  });
                }),
            SimpleDialogOption(
                child: const Text('Choose from Gallery'),
                onPressed: () async {
                  Navigator.of(context).pop();
                  File imageFile =
                      await ImagePicker.pickImage(source: ImageSource.gallery, maxWidth: 1920, maxHeight: 1200, imageQuality: 80);
                  setState(() {
                    file = imageFile;
                  });
                }),
            SimpleDialogOption(
              child: const Text("Cancel"),
              onPressed: () {
                Navigator.pop(context);
              },
            )
          ],
        );
      },
    );
  }

Я хочу сделать что-то вроде этого, я могу открыть диалоговое окно, но он не ждал, пока выбран вариант

void navigationTapped(int page) async{
    if(page != 1){
      pageController.jumpToPage(page);
    }else{
      await _selectImage(); //opens dialog
    }
    //Handle button tap
  }

Как я могу ждать, пока пользователь не выберет опцию при нажатии на навигационную панель?

Заранее спасибо!

1 Ответ

1 голос
/ 02 апреля 2020

В вашей функции _selectImage вы можете подождать, пока диалоговое окно будет закрыто, для выполнения некоторого кода, подобного следующему:

await showDialog(
  context: context,
  barrierDismissible: false, // user must tap button!
  builder: (BuildContext context) {
    return SimpleDialog(
      title: const Text('Create a Post'),
      children: <Widget>[
        SimpleDialogOption(
          child: const Text('Take a photo'),
          onPressed: () async {
            Navigator.pop(context);
            File imageFile = await ImagePicker.pickImage(source: ImageSource.camera, maxWidth: 1920, maxHeight: 1200, imageQuality: 80);
            setState(() {
              file = imageFile;
            });
          }),
        SimpleDialogOption(
          child: const Text('Choose from Gallery'),
          onPressed: () async {
            Navigator.of(context).pop();
            File imageFile = await ImagePicker.pickImage(source: ImageSource.gallery, maxWidth: 1920, maxHeight: 1200, imageQuality: 80);
            setState(() {
              file = imageFile;
            });
          }),
        SimpleDialogOption(
          child: const Text("Cancel"),
          onPressed: () {
            Navigator.pop(context);
          },
        )
      ],
    );
  },
).then((onValue) {
  if (onValue != null) {
    /// Code you want to do
  }
});

onValue можно установить с помощью этой функции:

Navigator.pop(context, valueYouWantToReturn);

Если вы хотите выполнить какой-либо код, даже если onValue равен нулю (Navigator.pop(context)), удалите условие

...