Неудачное утверждение: строка 689 поз. 14: 'bytes! = Null': неверно и обходной путь на iOS Flutter - PullRequest
0 голосов
/ 09 июля 2020

У меня есть переменная 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.
════════════════════════════════════════════════════════════════════════════════════════════════════

Вы думаете, что это обходное решение безопасно?

...