簡體   English   中英

Flutter。類型“Null”不是類型轉換中類型“String”的子類型

[英]Flutter. type 'Null' is not a subtype of type 'String' in type cast

════════異常被widgets庫捕獲═════════════════════════════════ _CastError was throwed building Builder: type 'Null' is not a subtype of type 'String' in type cast

導致錯誤的相關小部件是 MaterialApp enter image description here

附上我的代碼。 這是關於 Maxwell Udemy Course 的。 商城APP模塊。 當我在 edit_product_screen 中按下添加按鈕時出現錯誤。 他在2019年錄制課程。我面臨這個錯誤。 我找不到錯誤。 任何人,請解決錯誤。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/product.dart';
import '../providers/products.dart';

class EditProductScreen extends StatefulWidget {
  static const routeName = '/edit-product';
  const EditProductScreen({super.key});

  @override
  State<EditProductScreen> createState() => _EditProductScreenState();
}

class _EditProductScreenState extends State<EditProductScreen> {
  final priceFocus = FocusNode();
  final imageControl = TextEditingController();
  final form = GlobalKey<FormState>();
  var isInit = true;
  var initValues = {
    'title': '',
    'description': '',
    'price': '',
    'imageUrl': ''
  };
  var editProduct =
      Product(id: '', title: '', desc: '', imageUrl: '', price: 0.0);

  @override
  void dispose() {
    priceFocus.dispose();
    imageControl.dispose();
    super.dispose();
  }

  @override
  void didChangeDependencies() {
    if (isInit) {
      final productid = ModalRoute.of(context)!.settings.arguments as String;
      if (productid != null) {
        editProduct =
            Provider.of<Products>(context, listen: false).findById(productid);
        initValues = {
          'title': editProduct.title,
          'description': editProduct.desc,
          'price': editProduct.price.toString(),
          'imageUrl': '',
        };
        imageControl.text = editProduct.imageUrl;
      }
    }
    isInit = false;
    super.didChangeDependencies();
  }

  void formSave() {
    final valid = form.currentState!.validate();
    if (!valid) {
      return;
    }
    form.currentState!.save();
    if (editProduct.id != null) {
      Provider.of<Products>(context, listen: false)
          .updateProduct(editProduct.id, editProduct);
    } else {
      Provider.of<Products>(context, listen: false).addProduct(editProduct);
    }
    Navigator.of(context).pop();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Edit Product'),
        actions: [
          IconButton(onPressed: formSave, icon: const Icon(Icons.save))
        ],
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
            key: form,
            child: ListView(
              children: [
                TextFormField(
                  initialValue: initValues['title'],
                  decoration: const InputDecoration(labelText: 'Title'),
                  textInputAction: TextInputAction.next,
                  onFieldSubmitted: (_) {
                    FocusScope.of(context).requestFocus(priceFocus);
                  },
                  onSaved: (newValue) {
                    editProduct = Product(
                      id: editProduct.id,
                      title: newValue as String,
                      desc: editProduct.desc,
                      imageUrl: editProduct.imageUrl,
                      price: editProduct.price,
                      isFavorite: editProduct.isFavorite,
                    );
                  },
                  validator: (value) {
                    if (value!.isEmpty) {
                      return 'Enter Title';
                    }
                    return null;
                  },
                ),
                TextFormField(
                  initialValue: initValues['price'],
                  decoration: const InputDecoration(labelText: 'Price'),
                  textInputAction: TextInputAction.next,
                  keyboardType: TextInputType.number,
                  focusNode: priceFocus,
                  onSaved: (newValue) {
                    editProduct = Product(
                      id: editProduct.id,
                      title: editProduct.title,
                      desc: editProduct.desc,
                      imageUrl: editProduct.imageUrl,
                      price: double.parse(newValue as String),
                      isFavorite: editProduct.isFavorite,
                    );
                  },
                ),
                TextFormField(
                  initialValue: initValues['description'],
                  decoration: const InputDecoration(labelText: 'Description'),
                  textInputAction: TextInputAction.next,
                  maxLines: 3,
                  keyboardType: TextInputType.multiline,
                  onSaved: (newValue) {
                    editProduct = Product(
                      id: editProduct.id,
                      title: editProduct.title,
                      desc: newValue as String,
                      imageUrl: editProduct.imageUrl,
                      price: editProduct.price,
                      isFavorite: editProduct.isFavorite,
                    );
                  },
                ),
                Row(
                  children: [
                    Container(
                      height: 100,
                      width: 100,
                      margin: const EdgeInsets.only(top: 8, right: 10),
                      decoration: BoxDecoration(
                          border: Border.all(width: 1, color: Colors.grey)),
                      child: imageControl.text.isEmpty
                          ? const Center(child: Text('Enter Url'))
                          : FittedBox(
                              child: Image.network(
                                imageControl.text,
                                fit: BoxFit.cover,
                              ),
                            ),
                    ),
                    Expanded(
                      child: TextFormField(
                        decoration:
                            const InputDecoration(labelText: 'Image Url'),
                        textInputAction: TextInputAction.done,
                        keyboardType: TextInputType.url,
                        controller: imageControl,
                        onFieldSubmitted: (_) {
                          formSave();
                        },
                        onSaved: (newValue) {
                          editProduct = Product(
                            id: editProduct.id,
                            title: editProduct.title,
                            desc: editProduct.desc,
                            imageUrl: newValue as String,
                            price: editProduct.price,
                            isFavorite: editProduct.isFavorite,
                          );
                        },
                      ),
                    ),
                  ],
                ),
              ],
            )),
      ),
    );
  }
}

嘗試檢查ModalRoute.of(context)..settings.arguments這不應該是null

在您的 didChangeDependencies 方法中,您正在實例化一個名為 productId 的變量,並且您正在從 ModalRoute.of(context)...settings,arguments 獲取一個值並將其轉換為字符串,但該值可以是 null。這就是您檢查它是否存在的原因`s null 就在該行之后。

@override
  void didChangeDependencies() {
    if (isInit) {
      final productid = ModalRoute.of(context)!.settings.arguments as String;
      if (productid != null) {
        editProduct =
            Provider.of<Products>(context, listen: false).findById(productid);
        initValues = {
          'title': editProduct.title,
          'description': editProduct.desc,
          'price': editProduct.price.toString(),
          'imageUrl': '',
        };
        imageControl.text = editProduct.imageUrl;
      }
    }
    isInit = false;
    super.didChangeDependencies();
  }

所以你可以轉換為一個可為空的字符串,我認為你的問題已經解決了

final productid = ModalRoute.of(context)!.settings.arguments as String?;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM