flutter - 将图片从计算机加载到 Web 应用程序
问题描述
我正在尝试构建一个 Web 应用程序,但我不知道如何将图片从用户计算机加载到 Web。在移动应用程序上,它可以与 image_picker 库一起使用,但在我的网络应用程序上却不能这样工作。是否有人对此有所了解,或者计算机是否有不同的库?
解决方案
这是我的一个项目的一个片段。
用户界面:1**
StreamBuilder(
initialData: [],
stream: Addnewbloc.imageStream,
builder: (context, snapshot) {
List<Widget> kids=[Padding(
padding: EdgeInsets.all(8.0),
child: InkWell(
onTap: () async {
// adds images
FilePickerResult result = await FilePicker.platform.pickFiles(allowMultiple: true,type: FileType.custom,allowedExtensions: ['jpg', 'png', 'jpeg'],);
if(result != null) {
res = result.files;
Addnewbloc.imageeventSink.add(res);
} else {
// User canceled the picker
}
},
child: Container(
decoration: BoxDecoration(border: Border.all(color: Colors.red[400]),),
height: getProportionateScreenHeight(100),
width: getProportionateScreenWidth(50),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Center(child: Icon(Icons.add)),
Text('Add Image'),],),
),
),
),];
for (int i=0;i<snapshot.data.length;i++){
Uint8List bytes = snapshot.data[i].bytes;
kids.add(
Padding(
padding: EdgeInsets.all(8.0),
child: InkWell(
onLongPress: (){
showDialog(context: context, builder: (context) {
return AlertDialog(
title: Text('Remove Image'),
content: Text('Are you sure you want to remove this image ?'),
actions: [
TextButton(onPressed: (){Addnewbloc.imageremoveSink.add(i);Navigator.pop(context);}, child: Text('Yes')),
TextButton(onPressed: ()=>{Navigator.pop(context)}, child: Text('No'))
],
);
},);
},
child: Container(
decoration: BoxDecoration(border: Border.all(color: Colors.red[400]),),
height: getProportionateScreenHeight(100),
width: getProportionateScreenWidth(50),
child: Image.memory(bytes,fit: BoxFit.fill,),
),
),
));
}
return Container(
width: double.infinity,
decoration: BoxDecoration(
border: Border.all(color: Colors.grey[400]),
),
child: Wrap(
children: kids,
),
);
},),
使用流控制器进行状态管理(将新图像添加到列表中)
import 'dart:async';
import 'package:file_picker/file_picker.dart';
class NewProductBloc{
List<PlatformFile> files;
// for image upload
final _imageStreamController = StreamController<List<PlatformFile>>(); // for images
final _imageeventStreamController = StreamController<List<PlatformFile>>(); // for images
final _imageremoveStreamController = StreamController<int>(); // for images removal
StreamSink<List<PlatformFile>> get imageSink => _imageStreamController.sink;
Stream<List<PlatformFile>> get imageStream => _imageStreamController.stream;
StreamSink<List<PlatformFile>> get imageeventSink => _imageeventStreamController.sink;
Stream<List<PlatformFile>> get imageeventStream => _imageeventStreamController.stream;
StreamSink<int> get imageremoveSink => _imageremoveStreamController.sink;
Stream<int> get imageremoveStream => _imageremoveStreamController.stream;
NewProductBloc(){
files = [];
//add image
imageeventStream.listen((event) {
event.forEach((element) {
if (!files.contains(element))
files.add(element);
});
imageSink.add(files);
});
// removal
imageremoveStream.listen((index) {
files.removeAt(index);
imageSink.add(files);
});
}
void dispose(){
_imageremoveStreamController.close();
_imageeventStreamController.close();
_imageremoveStreamController.close();
}
}
图片:
1** 用户界面小部件
使用的包file_picker
推荐阅读
- django - 谁能解释为什么这会给出错误 django url 模式
- wpf - 使用受限用户权限运行和安装时出现问题
- python - 使用 tkinter 如何将树视图重新定位到左上角
- python - 运行 wsgi.py 时出现 ModuleNotFoundError
- excel - google sheet是否支持类似于excel宏的功能
- xcode - 您必须在上次反应本机升级后启用位码重建它
- group-by - 当其观察值不包含 SAS 中的某些值时删除组
- javascript - 我想将数据从父组件(状态)传递给子组件
- c++ - QDialog派生类
- java - java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void androidx.appcompat.app.ActionBar.hide()”