Как показать диалог с FutureBuilder при нажатии кнопки? - PullRequest
0 голосов
/ 01 сентября 2018

Я загружаю изображение FirebaseStorage с FutureBuilder, и когда я нажимаю кнопку загрузки, я хочу показать диалоговое окно ожидания. Изображение успешно загружено в FireStorage, но ничего не отображается. Что плохого в моих кодах? Я думаю, что FutureBuilder вернет виджет и нажмет кнопку void. Может быть, это проблема. Или я неправильно называю FutureBuilder. Есть ли у вас какие-либо советы или предложения для моего неправильного кода?

Вот мой код;



    Widget buildBody(BuildContext context) {
        return new SingleChildScrollView(
          child: new Column(
            children: [
              new SizedBox(
                width: double.infinity,
                child: new RaisedButton(
                  child: new Text('Upload'),
                  onPressed:  () {
                    futureBuilder();
                  },
                ),
              ),
            ],
          ),
        );
      }

     Future mediaUpload() async {
        final fileName = DateTime.now().millisecondsSinceEpoch.toString() + '.jpg';
        final StorageReference storage = FirebaseStorage.instance.ref().child(fileName);
        final StorageUploadTask task = storage.putFile(_image);
        return task.future;
      }

      Widget futureBuilder() {
        return new FutureBuilder(
          future: mediaUpload(),
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            switch (snapshot.connectionState) {
              case ConnectionState.none:
                print('ConnectionState.none');
                return new Text('Press button to start.');
              case ConnectionState.active:
                print('ConnectionState.active');
                return new Text('');
              case ConnectionState.waiting:
                waitingDialog(context);
                return waitingDialog(context);
              case ConnectionState.done:
                print('ConnectionState.done');
                if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
                print(snapshot.data.downloadUrl);
                Navigator.of(context).pushReplacementNamed('home');
                return new Text('Result: ${snapshot.data.downloadUrl}');
            }
          },
        );
      }

      waitingDialog(BuildContext context) {
        return showDialog(
          context: context,
          barrierDismissible: false,
          builder: (BuildContext context) {
            return new Center(
              child: new SizedBox(
                width: 40.0,
                height: 40.0,
                child: const CircularProgressIndicator(
                  value: null,
                  strokeWidth: 2.0,
                ),
              ),
            );
          },
        );
      }

1 Ответ

0 голосов
/ 01 сентября 2018

Я не уверен на 100%, почему FutureBuilder не работает. Но у меня есть предположение. В приведенном выше примере FutureBuilder - это , не прикрепленное к widgetTree (экран). Не прикреплено означает, что возвращаемое значение из FutureBuilder не отображается на экране. В этом случае Text возвращается на основе snapshot.connectionState, который не прикреплен к экрану.

Работа вокруг: (Я проверил, и это сработало, не могли бы вы проверить)

futureBuilder(BuildContext context) {
  mediaUpload().then((task) {          // fire the upload
    Navigator.of(context).maybePop();  // remove the dialog on success upload
  });                                  // we can use task(which returned from
                                       // mediaUpload()) to get the values like downloadUrl.
  waitingDialog(context);             // show the spinner dialog
}
...