- 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/
我正在尝试从flutter应用程序构建apk,但出现此错误: Note: /mnt/Software/Linux/Flutter/flutter/.pub-cache/hosted/pub.dartl
我有一个名为 X 的较大应用程序,还有另一个名为 Y 的较小应用程序。他们现在彼此分开,并且工作正常。我想将应用程序 Y 集成到 X 中。我想将 Y 的代码放入 X 项目中,但它们应该有不同的 Mai
在android Studio中选择Create New Flutter Project,出现如下4个选项。 Flutter 应用程序 Flutter 插件 Flutter 包 flutter 模块
我看到我的 flutter 项目生成了一个文件 ios/Flutter/Flutter.podspec ,这个文件有什么用? 如果它与生成的 Flutter.framework 有关? 我应该将它包含
我尝试过的 在包含flutter SDK的位置添加/编辑.bash_profile.rtf文件。 导出PATH = / Users / temur / Documents / Projects / F
Flutter 日志会打印数千个详细/垃圾邮件日志。 我正在尝试调试一个复杂的应用程序,但是打印太冗长了,以至于我很难找到我自己打印的东西。 有没有办法禁用详细? 就像是: Logger.level.
在flutter 1.22更新之后,我在Lineargradient colors属性中遇到错误,这给我一个错误,即未定义名称colors参数。.在Android中更新flutter和flutter插
在下面的代码 widget.hintText 中给出错误,我试图将日期选择器作为单独的组件,并在从其他文件调用它时动态传递提示文本值。 import 'package:date_field/date_
在下面的代码 widget.hintText 中给出错误,我试图将日期选择器作为单独的组件,并在从其他文件调用它时动态传递提示文本值。 import 'package:date_field/date_
Flutter 1.0 发布后,我正在按照步骤搭建 Flutter 开发环境。 在步骤中(如所附屏幕截图所示),它说要更新 $PATH 两次,一次使用 flutter 工具的路径 export PAT
我有一个用 flutter 编写的移动应用程序,我想将其转换为 flutter_web 应用程序(集成 flutter_web 尚不可用)。我目前遇到包裹问题。 我已按照本网站中列出的说明进行操作 h
如何向我的 Flutter 路由添加自定义转换?这是我目前的路线结构。 class MyApp extends StatelessWidget { // This widget is the
我正在尝试通过 URL 在 webview 中显示网页。我试过 flutter_webview_plugin 插件,但是当我在浏览器上运行项目时它不起作用。 在 flutter web applica
我正在使用 animatedContainer 在按下按钮时显示 listView.builder()。这是一个要显示的简单子(monad)列表,但问题是我不知道 ListView 构建器的高度会传递
我目前正在我的应用程序中制作渐变背景动画......我正在使用 lottie 动画的帮助下这样做!我试图将它封装在一个容器中并成功地做到了。但是有一个问题,尽管我将高度更改为大于 2000 的东西,但
美好的一天! 我无法弄清楚如何使用 google 标签管理器设置 flutter。我找到了 this package包括标签管理器 api。但是我不知道如何正确配置它。 (在网络上我只需要复制粘贴一个
我的购物车模型如下 class Cart { String description; double unitCost; double amount; int quantity; S
在 Flutter 应用程序中,我想为在线托管的资源(图像、视频等)实现缓存。 我希望它能在原生平台 (Android/iOS)(例如使用文件系统)和网络(例如使用 IndexedDB)上运行。 Fl
我写了一个页面,在顶部一切都很好,应该是这样。在底部我有一个事件的历史。我的容器的宽度是自动确定的(取决于屏幕的宽度),而高度 - 不,在不同的设备上有不同的高度(底部的缩进是不同的)。是否可以自动确
我正在处理一个页面,其中有一些字段,例如 textfield 和 slider。在页面的末尾必须有一个用于进行下一步的按钮,该按钮被包裹在 Align 中以在页面之间具有固定位置。 另一方面,resi
我是一名优秀的程序员,十分优秀!