- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将对象列表添加到 firestore 文档
我定义了产品数据模型
我也有类别数据模型
我想将类别列表添加到 firestore 中的产品文档
我将类别添加到临时列表,然后将值放入 product.categoriesproduct.categories = categorytemplist;
我使用了提供者状态
当我保存产品以恢复屏幕保持时,没有错误但它没有保存
所有与产品形式相关的文件如下
//product form dart file
import 'package:flutter/material.dart';
import '../api/categories_api.dart';
import '../models/category_model.dart';
import '../providers/category_provider.dart';
import '../api/products.dart';
import '../models/product_model.dart';
import '../providers/product_provider.dart';
import 'package:provider/provider.dart';
class ProductForm extends StatefulWidget {
final bool isUpdating;
ProductForm({@required this.isUpdating});
@override
_ProductFormState createState() => _ProductFormState();
}
class _ProductFormState extends State<ProductForm> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
ProductModel _currentProduct;
CategoryModel _categoryDropdownValue;
List<CategoryModel> _categoryTempList=[];
@override
void initState() {
super.initState();
ProductProvider productProvider = Provider.of<ProductProvider>(context, listen: false);
CategoryProvider categoryProvider = Provider.of<CategoryProvider>(context, listen: false);
getCategories(categoryProvider);
if (productProvider.currentProduct != null) {
_currentProduct = productProvider.currentProduct;
} else {
_currentProduct = new ProductModel();
}
}
Widget _buildIdField() {
return TextFormField(
decoration: InputDecoration(labelText: 'Brand ID'),
initialValue: _currentProduct.id,
keyboardType: TextInputType.text,
style: TextStyle(fontSize: 20),
validator: (String value) {
if (value.isEmpty) {
return 'Product ID is required';
}
return null;
},
onSaved: (String value) {
_currentProduct.id = value;
},
);
}
Widget _buildNameField() {
return TextFormField(
decoration: InputDecoration(labelText: 'Product name'),
initialValue: _currentProduct.name,
keyboardType: TextInputType.text,
style: TextStyle(fontSize: 20),
onSaved: (String value) {
_currentProduct.name = value;
},
);
}
Widget _buildCategoryField() {
CategoryProvider categoryProvider = Provider.of<CategoryProvider>(context);
return DropdownButtonFormField<CategoryModel>(
hint: Text('Select category'),
value: _categoryDropdownValue,
icon: Icon(Icons.arrow_downward),
iconSize: 24,
elevation: 16,
style: TextStyle(color: Colors.deepPurple),
onChanged: (CategoryModel newValue) {
setState(() {
_categoryDropdownValue = newValue;
});
},
items: categoryProvider.categoryList.map<DropdownMenuItem<CategoryModel>>((CategoryModel value) {
return DropdownMenuItem<CategoryModel>(
value: value,
child: Text(value.name),
);}
).toList(),
// onSaved: (CategoryModel value){
// _currentProduct.categories= _categoryTempList;
// print('save categories at dropdownmenu');
// },
);
}
_addCategories(CategoryModel category) {
if (category!=null ){
setState(() {
_categoryTempList.add(category);
});
}
}
_onProductUploaded(ProductModel product) {
ProductProvider productProvider = Provider.of<ProductProvider>(context, listen: false);
productProvider.addProduct(product);
Navigator.pop(context);
}
_saveProduct() {
print('saveProduct Called');
if (!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
_currentProduct.categories= _categoryTempList ;
print('form saved');
uploadProduct(_currentProduct, widget.isUpdating, _onProductUploaded);
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
appBar: AppBar(title: Text('Product Form')),
body: SingleChildScrollView(
padding: EdgeInsets.all(32),
child: Form(
key: _formKey,
autovalidate: true,
child: Column(children: <Widget>[
Text(
widget.isUpdating ? "Edit Product" : "Create Product",
textAlign: TextAlign.center,
style: TextStyle(fontSize: 30),
),
SizedBox(height: 16),
_buildIdField(),
_buildNameField(),
_buildCategoryField(),
ButtonTheme(
child: RaisedButton(
child: Text('Add', style: TextStyle(color: Colors.white)),
onPressed: () => _addCategories(_categoryDropdownValue),
),),
GridView.count(
shrinkWrap: true,
scrollDirection: Axis.vertical,
padding: EdgeInsets.all(8),
crossAxisCount: 3,
crossAxisSpacing: 4,
mainAxisSpacing: 4,
children: _categoryTempList
.map(
(CategoryModel value) => Card(
color: Colors.black54,
child: Center(
child: Text(
value.name,
style: TextStyle(color: Colors.white, fontSize: 14),
),
),
),
)
.toList(),
),
]),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
FocusScope.of(context).requestFocus(new FocusNode());
_saveProduct();
},
child: Icon(Icons.save),
foregroundColor: Colors.white,
),
);
}
}
//产品数据模型dart文件
import 'package:cloud_firestore/cloud_firestore.dart';
import 'category_model.dart';
class ProductModel{
static const ID = "id";
static const NAME = "name";
static const CATEGORIES= "categories";
String id;
String name;
List<CategoryModel> categories;
// named constructure
ProductModel();
// deserialize data from firestore
ProductModel.fromMap(Map<String, dynamic> data){
id = data[ID];
name = data[NAME];
categories = data[CATEGORIES];
}
Map<String, dynamic> toMap() {
return {
'ID': id,
'NAME':name,
'CATEGORIES': categories,
};
}
}
// Category data model dart file
import 'package:cloud_firestore/cloud_firestore.dart';
class CategoryModel{
static const ID = "id";
static const NAME = "name";
String id;
String name;
// named constructure
CategoryModel();
// deserialize data from firestore
CategoryModel.fromMap(Map<String, dynamic> data){
id = data[ID];
name = data[NAME];
}
Map<String, dynamic> toMap() {
return {
'ID': id,
'NAME':name,
};
}
}
// Product provider dart file
import '../models/product_model.dart';
import 'package:flutter/material.dart';
class ProductProvider with ChangeNotifier {
List<ProductModel> _productList=[];
ProductModel _currentProduct;
List<ProductModel> _featuredProductList=[];
// getter
List<ProductModel> get productList => _productList;
List<ProductModel> get featuredProductList => _featuredProductList;
ProductModel get currentProduct => _currentProduct;
// setter
set productList(List<ProductModel> productList) {
_productList = productList;
notifyListeners();
}
set currentProduct(ProductModel product) {
_currentProduct = product;
notifyListeners();
}
addProduct(ProductModel product) {
_productList.insert(0, product);
notifyListeners();
}
deleteProduct(ProductModel product) {
_productList.removeWhere((_product) => _product.id == product.id);
notifyListeners();
}
}
//类别提供者 dart 文件
import '../models/category_model.dart';
import 'package:flutter/material.dart';
class CategoryProvider with ChangeNotifier {
List<CategoryModel> _categoryList=[];
CategoryModel _currentCategory;
List<CategoryModel> _featuredCategoryList=[];
// getter
List<CategoryModel> get categoryList => _categoryList;
List<CategoryModel> get featuredCategoryList => _featuredCategoryList;
CategoryModel get currentCategory => _currentCategory;
// setter
set categoryList(List<CategoryModel> categoryList) {
_categoryList = categoryList;
notifyListeners();
}
set featuredCategoryList(List<CategoryModel> featuredCategoryList) {
_featuredCategoryList = featuredCategoryList;
notifyListeners();
}
set currentCategory(CategoryModel category) {
_currentCategory = category;
notifyListeners();
}
addCategory(CategoryModel category) {
_categoryList.insert(0, category);
notifyListeners();
}
deleteCategory(CategoryModel category) {
_categoryList.removeWhere((_category) => _category.id == category.id);
notifyListeners();
}
}
//产品 api dart 文件 - firestore
import 'package:cloud_firestore/cloud_firestore.dart';
import '../providers/product_provider.dart';
import '../models/product_model.dart';
getProducts(ProductProvider productProvider) async{
QuerySnapshot snapshot= await Firestore.instance.collection('products').getDocuments();
List<ProductModel> _productList=[];
snapshot.documents.forEach((document){
ProductModel product= ProductModel.fromMap(document.data);
_productList.add(product);
});
productProvider.productList=_productList;
}
uploadProduct(ProductModel product, bool isUpdating, Function productUploaded, {String imageUrl}) async {
CollectionReference productRef = Firestore.instance.collection('products');
if (imageUrl != null) {
product.picture = imageUrl;
}
if (isUpdating) {
await productRef.document(product.id).updateData(product.toMap());
productUploaded(product);
print('updated product with id: ${product.id}');
} else {
DocumentReference documentRef = await productRef.add(product.toMap());
product.id = documentRef.documentID;
print('uploaded successfully: ${product.toString()}');
await documentRef.setData(product.toMap(), merge: true);
productUploaded(product);
}
}
deleteProduct(ProductModel product, Function productDeleted) async {
await Firestore.instance.collection('products').document(product.id).delete();
productDeleted(product);
}
最佳答案
我终于找到了在产品数据模型中将对象列表添加到 firestore 中的文档的方法,它解决了问题:
'类别':categories.map((i) => i.toMap()).toList(),
ProductModel{
String id;
String name;
List<CategoryModel> categories
ProductModel.fromMap(Map<String, dynamic> data){
id = data['id'];
name= data['name'];
categories = data['categories']; // here there is a problem, as i can't get product document with list of objects but i am working on it
}
Map<String, dynamic> toMap() {
return {
'id': id,
'name':name,
'categories': categories.map((i) => i.toMap()).toList(), // this worked well
};}}
CategoryModel{
String id;
String name;
CategoryModel.fromMap(Map<String, dynamic> data){
id = data['id'];
name= data['name'];
}
Map<String, dynamic> toMap() {
return {
'id': id,
'name':name,
};}}
关于list - 我想将对象列表添加到 firestore 文档中,- flutter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60367431/
我创建了一个用户可以添加测试的字段。这一切运行顺利我只希望当用户点击(添加另一个测试)然后上一个(添加另一个测试)删除并且这个显示在新字段中。 所有运行良好的唯一问题是点击(添加另一个字段)之前添加另
String[] option = {"Adlawan", "Angeles", "Arreza", "Benenoso", "Bermas", "Brebant
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在努力将 jQuery 滚动功能添加到 nav-tab (Bootstrap 3)。我希望用户能够选择他们想要的选项卡,并在选项卡内容中有一个可以平滑滚动到 anchor 的链接。这是我的代码,可
我正在尝试在用户登录后再添加 2 个 ui 选项卡。首先,我尝试做一个之后。 $('#slideshow').tabs('remove', '4'); $("#slideshow ul li:last
我有一个包含选择元素的表单,我想通过选择添加和删除其中一些元素。这是html代码(这里也有jsfiddle http://jsfiddle.net/txhajy2w/):
正在写这个: view.backgroundColor = UIColor.white.withAlphaComponent(0.9) 等同于: view.backgroundColor = UICo
好的,如果其中有任何信息,我想将这些列添加到一起。所以说我有 账户 1 2 3 . 有 4 个帐户空间,但只有 3 个帐户。我如何创建 java 脚本来添加它。 最佳答案 Live Example H
我想知道是否有一种有效的预制算法来确定一组数字的和/差是否可以等于不同的数字。示例: 5、8、10、2,使用 + 或 - 等于 9。5 - 8 = -3 + 10 = 7 + 2 = 9 如果有一个预
我似乎有一个卡住的 git repo。它卡在所有基本的添加、提交命令上,git push 返回所有内容为最新的。 从其他帖子我已经完成了 git gc 和 git fsck/ 我认为基本的调试步骤是
我的 Oracle SQL 查询如下- Q1- select hca.account_number, hca.attribute3, SUM(rcl.extended_amou
我正在阅读 http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingG
我正在尝试添加一个“加载更多”按钮并限制下面的结果,这样投资组合页面中就不会同时加载 1000 个内容,如下所示:http://typesetdesign.com/portfolio/ 我对 PHP
我遇到这个问题,我添加了 8 个文本框,它工作正常,但是当我添加更多文本框(如 16 个文本框)时,它不会添加最后一个文本框。有人遇到过这个问题吗?提前致谢。 Live Link: JAVASCRIP
add/remove clone first row default not delete 添加/删除克隆第一行默认不删除&并获取正确的SrNo(例如:添加3行并在看到问题后删除SrNo.2)
我编码this ,但删除按钮不起作用。我在控制台中没有任何错误.. var counter = 0; var dataList = document.getElementById('materi
我有一个类似数组的对象: [1:数组[10]、2:数组[2]、3:数组[2]、4:数组[2]、5:数组[3]、6:数组[1]] 我正在尝试删除前两个元素,执行一些操作,然后将它们再次插入到同一位置。
使用的 Delphi 版本:2007 你好, 我有一个 Tecord 数组 TInfo = Record Name : String; Price : Integer; end; var Info
我使用了基本的 gridster 代码,然后我声明了通过按钮添加和删除小部件的函数它工作正常但是当我将调整大小功能添加到上面的代码中时,它都不起作用(我的意思是调整大小,添加和删除小部件) 我的js代
title 323 323 323 title 323 323 323 title 323 323 323 JS $(document).keydown(function(e){
我是一名优秀的程序员,十分优秀!