在颤振中使用imagePicker和Firebase存储时,在何处应用setState方法

在颤振中使用imagePicker和Firebase存储时,在何处应用setState方法,firebase,flutter,firebase-storage,imagepicker,Firebase,Flutter,Firebase Storage,Imagepicker,首先,先谢谢大家。我觉得答案就在那里,我就是看不见。以下是我努力实现的目标: 我想将图像选取器选择的照片上传到Firestore,并在屏幕上设置 全局变量 从图库中挑选一张照片(效果很好) 将其上载到Firestore存储(工作正常) 现在我知道我可以使用image_Picker设置的“_image”文件,并使用setState更新应用程序,但这当然不是目标。 我的问题是,我在哪里使用setState将所选照片显示在屏幕上?首先,我将向您链接官方的颤振指南,其中的方法是setState set

首先,先谢谢大家。我觉得答案就在那里,我就是看不见。以下是我努力实现的目标:

我想将图像选取器选择的照片上传到Firestore,并在屏幕上设置

  • 全局变量
  • 从图库中挑选一张照片(效果很好)
  • 将其上载到Firestore存储(工作正常)
  • 现在我知道我可以使用image_Picker设置的“_image”文件,并使用setState更新应用程序,但这当然不是目标。
    我的问题是,我在哪里使用setState将所选照片显示在屏幕上?

    首先,我将向您链接官方的颤振指南,其中的方法是setState

    setState方法不会重新加载应用程序。。它会通知内核某个对象的状态已更改。。如果您在一个页面中并调用setState方法,则只有该页面将被“重新加载”或。。更确切地说。。将重新加载该页的状态

    因此,要回答您的问题,您必须在数据就位时调用setState方法。。 当您调用setState时,将调用方法build,这样您就可以在构建方法中更新带有url图像的变量


    再见:D

    设置状态的位置完全取决于应用程序的流程以及您希望它发生的时间

    但假设您有一个页面或小部件,希望显示
    NetworkImage
    。您可以在其他地方初始化
    downloadUrl
    ,并将其传递到小部件中,然后将
    NetworkImage
    设置为initState

    class ImageWidget extends StatefulWidget {
      final String downloadUrl;
    
      const ImageWidget({Key key, this.downloadUrl}) : super(key: key);
      @override
      _ImageWidgetState createState() => _ImageWidgetState();
    }
    
    class _ImageWidgetState extends State<ImageWidget> {
      NetworkImage networkImage;
    
      @override
      void initState() {
        super.initState();
        _setNetworkImage(widget.downloadUrl);
      }
    
      void _setNetworkImage(String url) {
        setState(() {
          if (url.isEmpty || url == null) {
            networkImage = NetworkImage('some Default Image');
          } else {
            networkImage = NetworkImage(widget.downloadUrl);
          }
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return ...display networkImage how you want it...
      }
    }
    
    class ImageWidget扩展了StatefulWidget{
    最终字符串下载URL;
    const-ImageWidget({Key-Key,this.downloadUrl}):super(Key:Key);
    @凌驾
    _ImageWidgetState createState()=>\u ImageWidgetState();
    }
    类_ImageWidgetState扩展状态{
    网络图像;
    @凌驾
    void initState(){
    super.initState();
    _setNetworkImage(widget.downloadUrl);
    }
    void\u setNetworkImage(字符串url){
    设置状态(){
    if(url.isEmpty | | url==null){
    networkImage=networkImage(“某些默认图像”);
    }否则{
    networkImage=networkImage(widget.downloadUrl);
    }
    });
    }
    @凌驾
    小部件构建(构建上下文){
    return…按需要显示网络图像。。。
    }
    }
    
    如果这对你的应用程序的流程不起作用,那么考虑具体地确定它是什么时候和什么时候发生,然后有人可以给你一个更好的答案。
    Future getImage() async {
      final pickedFile = await picker.getImage(
        source: ImageSource.gallery,
        imageQuality: 75,
      );
      _image = File(pickedFile.path);
      uploadImage(_image);
    }
    
    Future<void> uploadImage(File imageFile) async {
      try {
        String imageLocation = 'images/${_auth.currentUser.uid}.jpg';
        await _storage.ref(imageLocation).putFile(imageFile);
        setState(() {}); ///////// This did not work
      } on FirebaseException catch (e) {
        print(e.code);
      } catch (e) {
        print(e.message);
      }
    }
    
    Future<void> downloadImageURL() async {
      downloadURL = await _storage
        .ref('images/${_auth.currentUser.uid}.jpg')
        .getDownloadURL();
    }
    
    image: downloadURL == null || downloadURL.isEmpty
      ? NetworkImage(some Default Image)
      : NetworkImage(downloadURL),
    
    class ImageWidget extends StatefulWidget {
      final String downloadUrl;
    
      const ImageWidget({Key key, this.downloadUrl}) : super(key: key);
      @override
      _ImageWidgetState createState() => _ImageWidgetState();
    }
    
    class _ImageWidgetState extends State<ImageWidget> {
      NetworkImage networkImage;
    
      @override
      void initState() {
        super.initState();
        _setNetworkImage(widget.downloadUrl);
      }
    
      void _setNetworkImage(String url) {
        setState(() {
          if (url.isEmpty || url == null) {
            networkImage = NetworkImage('some Default Image');
          } else {
            networkImage = NetworkImage(widget.downloadUrl);
          }
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return ...display networkImage how you want it...
      }
    }