如何在 2 周后自动删除订单中的项目 flutter firebase

问题描述 投票:0回答:1

我刚刚创建了一个电子商务应用程序,我希望每两周后删除订单页面中的商品 我刚刚创建了一个电子商务 flutter 应用程序,但我希望产品仅订购一次,两周后订单页面中的项目应被删除。下面是我的代码。所以我的计划是,一旦一个项目被添加到订单屏幕,它应该在两周后被删除。我不希望有太多订单,因此从添加之日起,每件商品都会开始倒计时,直至被删除


orders_providers.dart

import 'dart:async';

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';

import '../model/orders_model.dart';

class OrdersProvider with ChangeNotifier {
static List<OrderModel> _orders = [];

List<OrderModel> get getOrders {
return _orders;
}

void clearLocalOrders() {
_orders.clear();
notifyListeners();
}

Future<void> fetchOrders() async {
User? user = FirebaseAuth.instance.currentUser;

      DateTime.now().subtract(Duration(seconds: 5));
      await FirebaseFirestore.instance
          .collection('orders')
          .where("userId", isEqualTo: user!.uid)
          .get()
          .then((QuerySnapshot ordersSnapshot) {
        _orders = [];
        ordersSnapshot.docs.forEach((element) {
          _orders.insert(
            0,
            OrderModel(
              orderId: element.get('orderId'),
              userId: element.get('userId'),
              productId: element.get('productId'),
              userName: element.get('userName'),
              price: element.get('price').toString(),
              imageUrl: element.get('imageUrl'),
              quantity: element.get('quantity').toString(),
              orderDate: element.get('orderDate'),
            ),
          );
        });
      });
    
      notifyListeners();
    }

}

orders_widget.dart
import 'package:fancy_shimmer_image/fancy_shimmer_image.dart';
import 'package:flutter/material.dart';
import 'package:new_customers_app/screens/orders/order_done.dart';
import 'package:provider/provider.dart';
import '../../inner_screens/product_details.dart';
import '../../model/orders_model.dart';
import '../../providers/products_provider.dart';
import '../../services/global_methods.dart';
import '../../services/utils.dart';
import '../../widgets/text_widget.dart';

class OrderWidget extends StatefulWidget {
const OrderWidget({Key? key}) : super(key: key);

@override
State<OrderWidget> createState() => _OrderWidgetState();
}

class _OrderWidgetState extends State<OrderWidget> {
late String orderDateToShow;

@override
void didChangeDependencies() {
final ordersModel = Provider.of<OrderModel>(context);
var orderDate = ordersModel.orderDate.toDate();
orderDateToShow = '${orderDate.day}/${orderDate.month}/${orderDate.year}';
super.didChangeDependencies();
}

@override
Widget build(BuildContext context) {
final ordersModel = Provider.of\<OrderModel\>(context);
final Color color = Utils(context).color;
Size size = Utils(context).getScreenSize;
final productProvider = Provider.of\<ProductsProvider\>(context);
final getCurrProduct = productProvider.findProdById(ordersModel.productId);
return ListTile(

      subtitle:
          Text('Paid: \$${double.parse(ordersModel.price).toStringAsFixed(2)}'),
      onTap: () {
        Navigator.pushNamed(context, OrderDone.routeName,
            arguments: ordersModel.productId);
      },
      leading: FancyShimmerImage(
        width: size.width * 0.2,
        imageUrl: getCurrProduct.imageUrl,
        boxFit: BoxFit.fill,
      ),
      title: TextWidget(
          text: '${getCurrProduct.title}  x${ordersModel.quantity}',
          color: color,
          textSize: 18),
      trailing: TextWidget(text: orderDateToShow, color: color, textSize: 18),
      
    );

}
}

order_screen.dart
import 'package:flutter/material.dart';
import 'package:flutter_iconly/flutter_iconly.dart';
import 'package:provider/provider.dart';
import '../../../providers/orders_provider.dart';
import '../../../services/utils.dart';
import '../../../widgets/empty_screen.dart';
import '../../../widgets/text_widget.dart';
import 'orders_widget.dart';

class OrdersScreen extends StatefulWidget {
static const routeName = '/OrderScreen';

const OrdersScreen({Key? key}) : super(key: key);

@override
State<OrdersScreen> createState() => _OrdersScreenState();
}

class _OrdersScreenState extends State<OrdersScreen> {
@override
Widget build(BuildContext context) {
final Color color = Utils(context).color;
Size size = Utils(context).getScreenSize;
final ordersProvider = Provider.of\<OrdersProvider\>(context);
final ordersList = ordersProvider.getOrders;
return FutureBuilder(
future: ordersProvider.fetchOrders(),
builder: (context, snapshot) {
return ordersList.isEmpty
? const EmptyScreen(
title: 'You did not place any order yet',
subtitle: 'order something and make me happy :)',
buttonText: 'Shop now',
imagePath: 'assets/images/box.png',
)
: Scaffold(
appBar: AppBar(
leading: InkWell(
borderRadius: BorderRadius.circular(12),
onTap: () {
Navigator.pop(context);
},
child: Icon(
IconlyLight.arrowLeft2,
color: color,
),
),
elevation: 0,
centerTitle: false,
title: TextWidget(
text: 'My Courses (${ordersList.length})',
color: color,
textSize: 24.0,
isTitle: true,
),
backgroundColor: Theme.of(context)
.scaffoldBackgroundColor
.withOpacity(0.9),
),
body: ListView.separated(
itemCount: ordersList.length,
itemBuilder: (ctx, index) {
return GestureDetector(
onTap: () {
Navigator.of(context).pop();
},
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 2, vertical: 6),
child: ChangeNotifierProvider.value(
value: ordersList\[index\],
child: const OrderWidget(),
),
),
);
},
separatorBuilder: (BuildContext context, int index) {
return Divider(
color: color,
thickness: 1,
);
},
));
});
}
}
flutter firebase dart google-cloud-firestore
1个回答
0
投票

最简单的方法是在集合上设置生存时间策略,在每个文档的特定字段中指定的日期/时间之后删除文档。然后在您的代码中添加一个包含未来两周日期/时间的附加字段,该策略将自动删除该日期/时间的文档。

© www.soinside.com 2019 - 2024. All rights reserved.