首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抛出了另一个异常:找不到Material小部件

抛出了另一个异常:找不到Material小部件
EN

Stack Overflow用户
提问于 2018-12-20 00:46:05
回答 5查看 4.4K关注 0票数 1

所以基本上有一个产品编辑页面,它的行为与uppon不同,叫做。

如果是第一次创建产品,那么它将显示在选项卡视图控制器中。

如果产品正在更新,其主体将在scaffold中返回。

以下是一些截图

当我通过create product提交时,没有遇到错误。

但是,当我通过update product提交时,虽然逻辑有效,但我得到了一个简短的红屏

像这样

error Another exception was thrown: No Material widget found.

以下是该屏幕的代码

`

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'package:academy_app/models/products.dart';
import 'package:scoped_model/scoped_model.dart';
import 'package:academy_app/scoped-model/Products.dart';

class ProductEdit extends StatefulWidget {
  ProductEdit();

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return ProductEditState();
  }
}

class ProductEditState extends State<ProductEdit> {
  String title;
  String description;
  double price;
  Product product;

  final focusnode2 = FocusNode();
  final focusnode3 = FocusNode();
  Map<String, dynamic> formData = {
    "name": null,
    "desc": null,
    "price": null,
    "image": "asset/foood.jpg"
  };

  GlobalKey<FormState> formkey = GlobalKey<FormState>();

  Widget buildTitle(productItem) {
    return TextFormField(
      initialValue: productItem != null ? productItem.title : "",
      validator: (String value) {
        if (value.isEmpty || value.length < 3) {
          return 'title cannot be empty';
        }
      },
      textInputAction: TextInputAction.next,
      decoration: InputDecoration(labelText: "Title"),
      onFieldSubmitted: (String value) {
        FocusScope.of(context).requestFocus(focusnode2);
      },
      onSaved: (String valuee) {
        setState(() {
          formData["name"] = valuee;
        });
      },
    );
  }

  Widget buildDesc(productItem) {
    return TextFormField(
      initialValue: productItem != null ? productItem.description : "",
      validator: (String value) {
        if (value.isEmpty || value.length < 3) {
          return 'Cant have that short description';
        }
      },
      textInputAction: TextInputAction.next,
      onFieldSubmitted: (value) {
        FocusScope.of(context).requestFocus(focusnode3);
      },
      focusNode: focusnode2,
      maxLines: 3,
      decoration: InputDecoration(labelText: "Description"),
      onSaved: (String valuee) {
        setState(() {
          formData["desc"] = valuee;
        });
      },
    );
  }

  Widget buildPrice(productItem) {
    return TextFormField(
      initialValue: productItem != null ? productItem.price.toString() : "",
      textInputAction: TextInputAction.done,
      focusNode: focusnode3,
      decoration: InputDecoration(labelText: " How much"),
      keyboardType: TextInputType.number,
      onFieldSubmitted: (value) {
        focusnode3.unfocus();
      },
      validator: (value) {
        if (!RegExp(r'^(?:[1-9]\d*|0)?(?:\.\d+)?$').hasMatch(value)) {
          return ' Enter numbers only';
        }
      },
      onSaved: (String valuee) {
        setState(() {
          formData["price"] = double.parse(valuee);
        });
      },
    );
  }

  void submitForm(Function addProduct, Function updateProduct, int index) {
    if (!formkey.currentState.validate()) {
      return;
    }
    formkey.currentState.save();
    setState(() {
      if (index == null) {
        addProduct(Product(
            price: formData["price"],
            title: formData["name"],
            description: formData["desc"],
            image: "asset/foood.jpg"));
      } else {
        updateProduct(
          Product(
              price: formData["price"],
              title: formData["name"],
              description: formData["desc"],
              image: "asset/foood.jpg"),
        );
      }
      Navigator.pushReplacementNamed(context, '/');
    });
  }

  Widget buildSubmitButton() {
    return ScopedModelDescendant<ProductsModel>(
      builder: (BuildContext context, Widget, ProductsModel) {
        return RaisedButton(
            child: Text("Save"),
            onPressed: () => submitForm(ProductsModel.addProduct,
                ProductsModel.updateProduct, ProductsModel.selected_index));
      },
    );
  }

  Widget _buildPageContent(BuildContext context, Product product) {
    final double deviceWidth = MediaQuery.of(context).size.width;
    final double targetWidth = deviceWidth > 550.0 ? 500.0 : deviceWidth * 0.95;
    final double targetPadding = deviceWidth - targetWidth;
    return GestureDetector(
      onTap: () {
        FocusScope.of(context).requestFocus(FocusNode());
      },
      child: Container(
        margin: EdgeInsets.all(10.0),
        child: Form(
          key: formkey,
          child: ListView(
            padding: EdgeInsets.symmetric(horizontal: targetPadding / 2),
            children: <Widget>[
              buildTitle(product),
              buildDesc(product),
              buildPrice(product),
              SizedBox(
                height: 10.0,
              ),
              buildSubmitButton()

            ],
          ),
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {


    return ScopedModelDescendant<ProductsModel>(
      builder: (context, Widget child, ProductsModel) {
        product = ProductsModel.getproduct();



        return ProductsModel.selected_index == null
            ? _buildPageContent(context, product)
            : Scaffold(
                appBar: AppBar(
                  title: Text("Update Item"),
                ),
                body:_buildPageContent(context, product) ,
              );
      },
    );
  }
}

`

为什么我会看到红屏错误?我对如何传递上下文感到困惑。为什么文本字段不能通过脚手架访问材料的父对象?

EN

回答 5

Stack Overflow用户

发布于 2019-06-25 13:58:39

由于该错误表明找不到material小部件,因此需要将_buildPateContent函数的容器包装到Material小部件中。以下是您可以执行的更改:

代码语言:javascript
复制
  Widget _buildPageContent(BuildContext context, Product product) {
    final double deviceWidth = MediaQuery.of(context).size.width;
    final double targetWidth = deviceWidth > 550.0 ? 500.0 : deviceWidth * 0.95;
    final double targetPadding = deviceWidth - targetWidth;
    return GestureDetector(
      onTap: () {
        FocusScope.of(context).requestFocus(FocusNode());
      },
      child: Material(
          child: Container(
        margin: EdgeInsets.all(10.0),
        child: Form(
          key: formkey,
          child: ListView(
            padding: EdgeInsets.symmetric(horizontal: targetPadding / 2),
            children: <Widget>[
              buildTitle(product),
              buildDesc(product),
              buildPrice(product),
              SizedBox(
                height: 10.0,
              ),
              buildSubmitButton()
            ],
          ),
        ),
      ),
    ));
  }
票数 2
EN

Stack Overflow用户

发布于 2018-12-20 15:42:38

尝试将应用程序包装在materialApp中,或者将TextField包装在material Widget中。

票数 1
EN

Stack Overflow用户

发布于 2019-12-05 02:29:54

在我的例子中,我忘记了用Scaffold小部件包装我的小部件。许多小部件都需要用它包装才能正常工作。所以要改变这一点

代码语言:javascript
复制
Widget build(BuildContext context) {
  return YourScreenContent();
}

到这个

代码语言:javascript
复制
Widget build(BuildContext context) {
  return Scaffold(
    body: YourScreenContent(),
  );
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53855681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档