Как мне отобразить виджет (загрузка 20%, 30%) при загрузке изображения flutter

#flutter #dart #file-upload

#flutter #dart #загрузка файла

Вопрос:

Я работаю с библиотекой multipart_request 0.3.1 для загрузки изображений, у меня есть ответ в журнале консоли (прогресс от объекта ответа 50,51,52 и т. Д.), Он идеален

Как я могу показать анимированный виджет (текст, строку состояния или строку выполнения) со следующим значением «Загрузка: 10,11,12, ..,100, завершено»,

Я должен установить setState на значение ответа, но я не знаю…Заранее благодарю

Это мой код

 import 'dart:io';

import 'package:flutter/material.dart';

import 'package:image_picker/image_picker.dart';
import 'package:multipart_request/multipart_request.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String imagePath = "";
  var showw = "";

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              FlatButton(
                child: Text("Pick an image"),
                onPressed: () async {
                  File imagen =
                      await ImagePicker.pickImage(source: ImageSource.gallery);
                  imagePath = imagen.path;
                },
              ),
              FlatButton(
                child: Text("Call multipart request"),
                onPressed: () {
                  sendRequest();
                },
              ),
              Text("Uploading: "   showw)
            ],
          ),
        ),
      ),
    );
  }

  sendRequest() {
    var request = MultipartRequest();

    request.setUrl("http://192.168.1.50/apiphp/api_imagenes.php");
    request.addFile("userImage[]", imagePath);

    Response response = request.send();

    response.onError = () {
      print("Error");
    };

    response.onComplete = (response) {
      print(response);
    };

    response.progress.listen((int progress) {
      print("progress from response object "   progress.toString());
      //var showw = progress.toString();
      //return showw;
    });

  }
}
  

Ответ №1:

Вы можете скопировать вставить запустить полный код ниже
Я использую официальный пример для демонстрации этого случая
, который вы можете сделать setState в response.onComplete и response.progress.listen
фрагмент кода

 Text(showw),
...
response.onComplete = (response) {
      setState(() {
        showw = "Complete";
      });

      print(response);
    };

response.progress.listen((int progress) {
  print("progress from response object "   progress.toString());
  setState(() {
    showw = "Uploading ${progress.toString()}";
  });
});
  

рабочая демонстрация

введите описание изображения здесь

полный код

 import 'dart:io';

import 'package:flutter/material.dart';

import 'package:image_picker/image_picker.dart';
import 'package:multipart_request/multipart_request.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String imagePath = "";
  String showw = "";

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              FlatButton(
                child: Text("Pick an image"),
                onPressed: () async {
                  File image =
                  await ImagePicker.pickImage(source: ImageSource.gallery);
                  imagePath = image.path;
                },
              ),
              FlatButton(
                child: Text("Call multipart request"),
                onPressed: () {
                  sendRequest();
                },
              ),
              Text(showw),
            ],
          ),
        ),
      ),
    );
  }

  void sendRequest() {
    var request = MultipartRequest();

    request.setUrl("https://b804ca15.ngrok.io/images");
    request.addFile("image", imagePath);

    Response response = request.send();

    response.onError = () {
      setState(() {
        showw = "Complete";
      });
    };

    response.onComplete = (response) {
      setState(() {
        showw = "Complete";
      });

      print(response);
    };

    response.progress.listen((int progress) {
      print("progress from response object "   progress.toString());
      setState(() {
        showw = "Uploading ${progress.toString()}";
      });
    });
  }
}
  

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

1. Рад помочь. пожалуйста, отметьте это как ответ, если это вам поможет. Спасибо.