Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振/飞镖-图像采集器更新提供程序';消费者?_Flutter_Dart_Flutter Provider_Imagepicker_Flutter Change Notifier - Fatal编程技术网

Flutter 颤振/飞镖-图像采集器更新提供程序';消费者?

Flutter 颤振/飞镖-图像采集器更新提供程序';消费者?,flutter,dart,flutter-provider,imagepicker,flutter-change-notifier,Flutter,Dart,Flutter Provider,Imagepicker,Flutter Change Notifier,我正在使用ImagePicker和imagecrapper插件,以便用户可以更改当前的头像图片。当前化身是一个网络图像URL,该URL从未来获取。在当前头像上有一个按钮,允许用户从多媒体资料或他们的相机中选择和裁剪新图片 这可以正常工作,但化身不会立即更新,需要热重启,以便在整个应用程序的此屏幕和其他屏幕上看到新照片。因此,我尝试使用提供者和变更通知程序来提醒消费者,这将重建网络图像 但是我似乎找不到一种方法,用变更通知程序调用提供者。下面是我从Github获得的示例代码,我正在尝试重新编写

我正在使用
ImagePicker
imagecrapper
插件,以便用户可以更改当前的头像图片。当前化身是一个
网络图像
URL,该URL从
未来
获取。在当前头像上有一个按钮,允许用户从多媒体资料或他们的相机中选择和裁剪新图片

这可以正常工作,但化身不会立即更新,需要热重启,以便在整个应用程序的此屏幕和其他屏幕上看到新照片。因此,我尝试使用
提供者
变更通知程序
来提醒
消费者
,这将重建
网络图像

但是我似乎找不到一种方法,用
变更通知程序
调用
提供者
。下面是我从Github获得的示例代码,我正在尝试重新编写

    class ImagePickerHandler {
      ImagePickerDialog imagePicker;
      AnimationController _controller;
      ImagePickerListener _listener;
    
      ImagePickerHandler(this._listener, this._controller);
         
      openGallery(String currentuserid) async {
        imagePicker.dismissDialog();
        var image = await ImagePicker.pickImage(source: ImageSource.gallery);
        cropImage(image, currentuserid);
      }
    
      void init() {
        imagePicker =  ImagePickerDialog(this, _controller);
        imagePicker.initState();
      }
    
      Future cropImage(File image, currentuserid) async {
        var box = Hive.box('currentuser');
        String newavatar = 'https://example.com/' + avatarpath ';
        File croppedFile = await ImageCropper.cropImage(
          sourcePath: image.path,
          maxWidth: 500,
          maxHeight: 500,
          aspectRatio: CropAspectRatio(ratioX: 1.0, ratioY: 1.0),
        );
        _listener.userImage(croppedFile);
        uploadAvatar(filepath:croppedFile.path);
        box.put('currentavatar', newavatar );
      }
    
      showDialog(BuildContext context) {
        imagePicker.getImage(context);
      }
    }
    
    abstract class ImagePickerListener {
      userImage(File _image);
    }
理想情况下,我可以调用
socialProvider.putBoxAvatar(newavavatar)
来代替
box.put('currentavatar',newavatar)
,但由于这是一种方法而不是构建,我不能调用我的
socialProvider

这是包含化身照片的构建

class Picker extends StatefulWidget {
  Picker({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _PickerState createState() =>  _PickerState();
}

class _PickerState extends State<Picker>
    with TickerProviderStateMixin,ImagePickerListener{

  File _image;
  AnimationController _controller;
  ImagePickerHandler imagePicker;

  @override
  void initState() {
    super.initState();
    _controller =  AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 500),
    );

    imagePicker= ImagePickerHandler(this,_controller);
    imagePicker.init();

  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    var socialProvider = Provider.of<SocialProvider>(context);
       return  FutureBuilder(
        future: Future.wait([socialProvider.loadCurrentAvatar()]),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return
              SingleChildScrollView(
                child: Container(
                  child: GestureDetector(
                    onTap: () => imagePicker.showDialog(context),
                    child:  Center(
                        child: Stack(
                          children: <Widget>[
                            Center(
                              child: Padding(
                                padding: const EdgeInsets.fromLTRB(20, 10, 20, 5),
                                child: Consumer<SocialProvider>(
                                    builder: (context, socialProvider, child) {
                                      return Image.network(snapshot.data[0],
                                        width: 250,
                                        height: 250,
                                      );
                                    }),
                              ),
                            ),

                            Center(
                              child: ClipRRect(
                                borderRadius: BorderRadius.circular(20.0),
                                child: Container(
                                  color: Colors.black26,
                                  child: Icon(Icons.camera_alt,
                                    color: Colors.white,
                                    size: 40,
                                  ),
                                ),
                              ),
                            ),                              
                          ],
                        )
                    ),
                  ),
                ),
              );
          } else if(snapshot.hasError) {
            return
              Center(
                child: Row(
                  children: <Widget>[
                    CircularProgressIndicator(),
                    FlatButton(onPressed: null, child: Text('reload'))
                  ],
                ),
              );
          } else{
            return Center(child: CircularProgressIndicator());
          }
        }
    );
  }

  @override
  userImage(File _image) {
    setState(() {
      this._image = _image;
    });
  }
}
理想情况下,我可以调用
socialProvider.putBoxAvatar(newavavatar)
来代替
box.put('currentavatar',newavatar)
,但由于这是一种方法而不是构建,我不能调用
socialProvider

String currentavatar;

putBoxAvatar(String boxavatar) {
    var box = Hive.box('currentuser');
    box.put('currentavatar', boxavatar);
    currentavatar = boxavatar;
    notifyListeners();        
  }