У меня есть переменная Uint8List imageData;
, которую я создаю без значения при построении экрана. При выборе изображения с помощью image_picker
он получает его значение из состояния blo c в setState()
, а Image.memory(imageData)
отображает изображение. Когда я запускаю приложение в Интернете, проблем нет, но при запуске на iPad Image.memory(imageData)
выдает исключение Failed assertion: line 689 pos 14: 'bytes != null': is not true.
.
Как мне использовать Image.memory
, тогда, если при создании экрана imageData
имеет значение null?
Большое спасибо.
Основной код:
class _NewEditProductScreenState extends State<NewEditProductScreen> {
AutoSizeGroup autoSizeGroup = AutoSizeGroup();
TextEditingController _idController = TextEditingController();
TextEditingController _nameController = TextEditingController();
TextEditingController _brandController = TextEditingController();
TextEditingController _priceController = TextEditingController();
TextEditingController _descriptionController = TextEditingController();
TextEditingController _barcodeController = TextEditingController();
TextEditingController _categoryController = TextEditingController();
TextEditingController _minimumStockController = TextEditingController();
TextEditingController _availableQuantityController = TextEditingController();
TextEditingController _soldQuantityController = TextEditingController();
String productId = '';
String productName = '';
String brand = '';
String price = '';
String productDescription = '';
String category = '';
bool isPromotion = false;
String vendor = '';
String barcode = '';
String imageUrl = '';
// Image productImage;
Uint8List imageData;
int minimumStock = 0;
int availableQuantity = 0;
int soldQuantity = 0;
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
// return BlocProvider<ProductBloc>(
// create: (context) => ProductBloc(),
// lazy: false,
// child: BlocBuilder<ProductBloc, ProductState>(
return BlocBuilder<ProductBloc, ProductState>(
builder: (context, state) => MultiBlocListener(
listeners: [
BlocListener<ProductBloc, ProductState>(
listener: (BuildContext context, ProductState state) {
if (state is PickedImage) {
setState(() {
imageData = state.imageData;
// print(' ###### Uint8List picked image is: ${state.imageData}');
});
}
...
child: Scaffold(
body: Container(
color: Colors.black54,
// key: widget.key,
padding: EdgeInsets.symmetric(horizontal: 100, vertical: 50),
child: Container(
decoration: BoxDecoration(
color: Colors.transparent,
borderRadius: BorderRadius.circular(5),
border: Border.all(color: Colors.redAccent, width: 2),
),
padding: EdgeInsets.symmetric(horizontal: 100, vertical: 20),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Expanded(
flex: 8,
child: Container(
decoration: BoxDecoration(
color: Colors.transparent,
borderRadius: BorderRadius.circular(5),
border: Border.all(color: Colors.redAccent, width: 2),
),
child: Stack(children: [
Center(
// child: Image.memory(imageData), //productImage),
),
GestureDetector(
onTap: () {
BlocProvider.of<ProductBloc>(context)
.add(PickImage());
},
...
возможное обходное решение:
Я могу создать Uint8List в методе initState()
и назначьте его на imageData
как:
void initState() {
super.initState();
List<int> byte = [1];
productImage =
Uint8List.fromList(byte);
}
Выбор всего изображения работает отлично, но проблема в том, что он выдает закодированное исключение, которое не найдено:
════════ (8) Exception caught by image resource service ════════════════════════════════════════════
Exception: Could not instantiate image codec.
════════════════════════════════════════════════════════════════════════════════════════════════════
Вы думаете, что это обходное решение безопасно?