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();
}