1)product manual api integration
2)order management implementation
This commit is contained in:
parent
174d7afa99
commit
545637e035
@ -1,4 +1,7 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<application
|
||||
android:label="cheminova"
|
||||
|
BIN
assets/images/cart.png
Normal file
BIN
assets/images/cart.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
47
lib/controller/product_mannual_controller.dart
Normal file
47
lib/controller/product_mannual_controller.dart
Normal file
@ -0,0 +1,47 @@
|
||||
import 'package:cheminova/controller/product_mannual_service.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import '../models/product_mannual_model.dart'; // Your model import
|
||||
// Your service import
|
||||
|
||||
class ProductManualController extends GetxController {
|
||||
|
||||
var productManualList = <ProductManualModel>[].obs;
|
||||
|
||||
// Service to fetch data
|
||||
final ProductMannualService productMannualService = ProductMannualService();
|
||||
|
||||
// Loading state
|
||||
var isLoading = false.obs;
|
||||
|
||||
// Method to fetch product manuals from the service
|
||||
void fetchProductManuals() async {
|
||||
try {
|
||||
// Set loading to true
|
||||
isLoading.value = true;
|
||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
String? token = prefs.getString('token');
|
||||
var manuals = await productMannualService.getProductManuals(token!);
|
||||
|
||||
// If data is returned, update the list
|
||||
if (manuals != null) {
|
||||
productManualList.value = manuals;
|
||||
} else {
|
||||
productManualList.value = []; // If no data, set an empty list
|
||||
}
|
||||
} catch (e) {
|
||||
// Handle error here, for example logging or showing an error message
|
||||
print("Error fetching product manuals: $e");
|
||||
} finally {
|
||||
// Set loading to false
|
||||
isLoading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
// Fetch product manuals when the controller is initialized
|
||||
fetchProductManuals();
|
||||
super.onInit();
|
||||
}
|
||||
}
|
36
lib/controller/product_mannual_service.dart
Normal file
36
lib/controller/product_mannual_service.dart
Normal file
@ -0,0 +1,36 @@
|
||||
|
||||
|
||||
import '../models/product_mannual_model.dart';
|
||||
import '../utils/common_api_service.dart'; // Replace with your actual common API service import
|
||||
|
||||
class ProductMannualService {
|
||||
Future<List<ProductManualModel>?> getProductManuals(String token) async {
|
||||
try {
|
||||
String url = "/api/productmanual/getall"; // Base URL to fetch product manuals
|
||||
|
||||
final response = await commonApiService<List<ProductManualModel>>(
|
||||
method: "GET",
|
||||
url: url,
|
||||
additionalHeaders: { // Pass the token here
|
||||
'Authorization': 'Bearer $token',
|
||||
},
|
||||
fromJson: (json) {
|
||||
if (json['productManuals'] != null) {
|
||||
// Map the list of product manuals from the response
|
||||
final List<ProductManualModel> productManuals = (json['productManuals'] as List)
|
||||
.map((manualJson) => ProductManualModel.fromJson(manualJson as Map<String, dynamic>))
|
||||
.toList();
|
||||
return productManuals;
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
},
|
||||
);
|
||||
return response;
|
||||
} catch (e) {
|
||||
|
||||
print(e.toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
120
lib/models/product_mannual_model.dart
Normal file
120
lib/models/product_mannual_model.dart
Normal file
@ -0,0 +1,120 @@
|
||||
class ProductManualModel {
|
||||
final String id;
|
||||
final String title;
|
||||
final ProductManualDetails productManual;
|
||||
final String createdAt;
|
||||
final String updatedAt;
|
||||
|
||||
ProductManualModel({
|
||||
required this.id,
|
||||
required this.title,
|
||||
required this.productManual,
|
||||
required this.createdAt,
|
||||
required this.updatedAt,
|
||||
});
|
||||
|
||||
// Factory method to create a ProductManualModel from JSON
|
||||
factory ProductManualModel.fromJson(Map<String, dynamic> json) {
|
||||
return ProductManualModel(
|
||||
id: json['_id'] ?? '',
|
||||
title: json['title'] ?? '',
|
||||
productManual: ProductManualDetails.fromJson(json['product_manual']),
|
||||
createdAt: json['createdAt'],
|
||||
updatedAt: json['updatedAt'],
|
||||
);
|
||||
}
|
||||
|
||||
// Method to convert a ProductManualModel to JSON
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'_id': id,
|
||||
'title': title,
|
||||
'product_manual': productManual.toJson(),
|
||||
'createdAt': createdAt,
|
||||
'updatedAt': updatedAt,
|
||||
};
|
||||
}
|
||||
|
||||
// Override toString for better debugging
|
||||
@override
|
||||
String toString() {
|
||||
return 'ProductManualModel(id: $id, title: $title, productManual: $productManual, createdAt: $createdAt, updatedAt: $updatedAt)';
|
||||
}
|
||||
}
|
||||
|
||||
class ProductManualDetails {
|
||||
final String publicId;
|
||||
final String url;
|
||||
final String filename;
|
||||
|
||||
ProductManualDetails({
|
||||
required this.publicId,
|
||||
required this.url,
|
||||
required this.filename,
|
||||
});
|
||||
|
||||
// Factory method to create ProductManualDetails from JSON
|
||||
factory ProductManualDetails.fromJson(Map<String, dynamic> json) {
|
||||
return ProductManualDetails(
|
||||
publicId: json['public_id'] ?? '',
|
||||
url: json['url'] ?? '',
|
||||
filename: json['filename'] ?? '',
|
||||
);
|
||||
}
|
||||
|
||||
// Method to convert ProductManualDetails to JSON
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'public_id': publicId,
|
||||
'url': url,
|
||||
'filename': filename,
|
||||
};
|
||||
}
|
||||
|
||||
// Override toString for better debugging
|
||||
@override
|
||||
String toString() {
|
||||
return 'ProductManualDetails(publicId: $publicId, url: $url, filename: $filename)';
|
||||
}
|
||||
}
|
||||
|
||||
// Model for handling the entire response
|
||||
class ProductManualResponse {
|
||||
final bool success;
|
||||
final List<ProductManualModel> productManuals;
|
||||
final int total;
|
||||
|
||||
ProductManualResponse({
|
||||
required this.success,
|
||||
required this.productManuals,
|
||||
required this.total,
|
||||
});
|
||||
|
||||
// Factory method to create ProductManualResponse from JSON
|
||||
factory ProductManualResponse.fromJson(Map<String, dynamic> json) {
|
||||
var productList = (json['productManuals'] as List)
|
||||
.map((manual) => ProductManualModel.fromJson(manual))
|
||||
.toList();
|
||||
|
||||
return ProductManualResponse(
|
||||
success: json['success'] ?? false,
|
||||
productManuals: productList,
|
||||
total: json['total'] ?? 0,
|
||||
);
|
||||
}
|
||||
|
||||
// Method to convert ProductManualResponse to JSON
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'success': success,
|
||||
'productManuals': productManuals.map((manual) => manual.toJson()).toList(),
|
||||
'total': total,
|
||||
};
|
||||
}
|
||||
|
||||
// Override toString for better debugging
|
||||
@override
|
||||
String toString() {
|
||||
return 'ProductManualResponse(success: $success, total: $total, productManuals: $productManuals)';
|
||||
}
|
||||
}
|
@ -9,6 +9,7 @@ class Product {
|
||||
final Brand brand;
|
||||
final int price;
|
||||
int quantity;
|
||||
bool selected;
|
||||
final int gst;
|
||||
final int hsnCode;
|
||||
final String description;
|
||||
@ -24,6 +25,7 @@ class Product {
|
||||
required this.brand,
|
||||
required this.price,
|
||||
this.quantity =1,
|
||||
this.selected=false,
|
||||
required this.gst,
|
||||
required this.hsnCode,
|
||||
required this.description,
|
||||
|
@ -138,7 +138,7 @@ class _ChangePasswordScreenState extends State<ChangePasswordScreen> {
|
||||
hintText: "Current Password",
|
||||
labelText: "Current Password",
|
||||
controller: authController.currentpassController,
|
||||
obscureText: true,
|
||||
obscureText: false,
|
||||
keyboardType: TextInputType.text,
|
||||
),
|
||||
|
||||
@ -146,7 +146,7 @@ class _ChangePasswordScreenState extends State<ChangePasswordScreen> {
|
||||
InputField(
|
||||
hintText: "New Password",
|
||||
labelText: "New Password",
|
||||
obscureText: true,
|
||||
obscureText: false,
|
||||
controller: authController.newpassController,
|
||||
keyboardType: TextInputType.text,
|
||||
),
|
||||
@ -154,7 +154,7 @@ class _ChangePasswordScreenState extends State<ChangePasswordScreen> {
|
||||
InputField(
|
||||
hintText: "Confirm Password",
|
||||
labelText: "Confirm Password",
|
||||
obscureText: true,
|
||||
obscureText: false,
|
||||
controller: authController.confirmpassController,
|
||||
keyboardType: TextInputType.text,
|
||||
),
|
||||
|
@ -1,5 +1,6 @@
|
||||
import 'package:cheminova/screens/authentication/controller/auth_service.dart';
|
||||
import 'package:cheminova/screens/home_screen.dart';
|
||||
import 'package:cheminova/utils/show_snackbar.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
@ -25,8 +26,12 @@ class AuthController extends GetxController {
|
||||
isLoading.value = false;
|
||||
update();
|
||||
if (response != null) {
|
||||
showSnackbar("Your Successfully logged In!");
|
||||
Get.offAll(() => const HomeScreen());
|
||||
}
|
||||
else if(response == null){
|
||||
showSnackbar("Please Enter Valid Email or Password");
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> forgotpass() async{
|
||||
@ -39,7 +44,7 @@ class AuthController extends GetxController {
|
||||
isLoading.value = false;
|
||||
update();
|
||||
if(response != null){
|
||||
|
||||
showSnackbar("Email sent successfully");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,13 +1,12 @@
|
||||
import 'dart:ui';
|
||||
import 'package:cheminova/screens/authentication/controller/auth_controller.dart';
|
||||
import 'package:cheminova/screens/authentication/forget_password_screen.dart';
|
||||
import 'package:cheminova/screens/authentication/verify_phone_screen.dart';
|
||||
import 'package:cheminova/widgets/custom_button.dart';
|
||||
import 'package:cheminova/widgets/input_field.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import '../../widgets/comman_text_from_filed.dart';
|
||||
import '../../widgets/custom_button.dart';
|
||||
import 'controller/auth_controller.dart';
|
||||
import 'forget_password_screen.dart';
|
||||
// Make sure you import HomeScreen
|
||||
|
||||
class LoginScreen extends StatefulWidget {
|
||||
const LoginScreen({super.key});
|
||||
@ -19,6 +18,8 @@ class LoginScreen extends StatefulWidget {
|
||||
class _LoginScreenState extends State<LoginScreen> {
|
||||
final formKey = GlobalKey<FormState>();
|
||||
final authController = Get.put(AuthController());
|
||||
final String emailPattern = r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$';
|
||||
final String passwordPattern = r'^.{6,}$'; // At least 6 characters
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@ -30,9 +31,7 @@ class _LoginScreenState extends State<LoginScreen> {
|
||||
decoration: const BoxDecoration(
|
||||
image: DecorationImage(
|
||||
fit: BoxFit.cover,
|
||||
image: AssetImage(
|
||||
'assets/images/image_1.png',
|
||||
),
|
||||
image: AssetImage('assets/images/image_1.png'),
|
||||
),
|
||||
borderRadius: BorderRadius.only(
|
||||
bottomLeft: Radius.circular(50.0),
|
||||
@ -45,6 +44,8 @@ class _LoginScreenState extends State<LoginScreen> {
|
||||
),
|
||||
),
|
||||
SingleChildScrollView(
|
||||
child: Form(
|
||||
key: formKey,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
@ -130,17 +131,37 @@ class _LoginScreenState extends State<LoginScreen> {
|
||||
),
|
||||
),
|
||||
),
|
||||
InputField(
|
||||
hintText: "Email",
|
||||
labelText: "Email",
|
||||
CommonTextFormField(
|
||||
controller: authController.emailController,
|
||||
keyboardType: TextInputType.emailAddress,
|
||||
validator: (value) {
|
||||
if (value == null || value.isEmpty) {
|
||||
return 'Please enter your email id';
|
||||
}
|
||||
if (!RegExp(emailPattern).hasMatch(value)) {
|
||||
return 'Please Enter valid email';
|
||||
}
|
||||
return null;
|
||||
},
|
||||
title: 'Email',
|
||||
label: "Email",
|
||||
),
|
||||
InputField(
|
||||
hintText: "Password",
|
||||
labelText: "Password",
|
||||
const SizedBox(height: 15),
|
||||
CommonTextFormField(
|
||||
controller: authController.passwordController,
|
||||
validator: (value) {
|
||||
if (value == null || value.isEmpty) {
|
||||
return 'Please enter your password';
|
||||
}
|
||||
if (!RegExp(passwordPattern).hasMatch(value)) {
|
||||
return 'Please Enter valid password';
|
||||
}
|
||||
return null;
|
||||
},
|
||||
obscureText: true,
|
||||
title: 'Password',
|
||||
maxLines: 1,
|
||||
label: "Password",
|
||||
),
|
||||
const SizedBox(height: 30),
|
||||
GestureDetector(
|
||||
@ -161,7 +182,12 @@ class _LoginScreenState extends State<LoginScreen> {
|
||||
Obx(
|
||||
() => CustomButton(
|
||||
text: "Login",
|
||||
onPressed: () => authController.login(),
|
||||
onPressed: () {
|
||||
if (formKey.currentState!.validate()) {
|
||||
// Perform login action
|
||||
authController.login();
|
||||
}
|
||||
},
|
||||
isLoading: authController.isLoading.value,
|
||||
),
|
||||
),
|
||||
@ -172,6 +198,7 @@ class _LoginScreenState extends State<LoginScreen> {
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
@ -16,7 +16,8 @@ import '../../models/product_model1.dart';
|
||||
class OrderConfermationScreen extends StatefulWidget {
|
||||
Product? productModel;
|
||||
PlacedOrderModel? placedOrder;
|
||||
OrderConfermationScreen({super.key,this.productModel,this.placedOrder});
|
||||
List<Product>? selectedProducts;
|
||||
OrderConfermationScreen({super.key,this.productModel,this.placedOrder,this.selectedProducts});
|
||||
|
||||
@override
|
||||
State<OrderConfermationScreen> createState() =>
|
||||
@ -143,10 +144,10 @@ class _OrderConfermationScreenState extends State<OrderConfermationScreen> {
|
||||
padding: EdgeInsets.all(Get.width * 0.02),
|
||||
child: ListView.builder(
|
||||
padding: EdgeInsets.zero,
|
||||
itemCount: _cartController.cartList.length,
|
||||
itemCount: _cartController.selectedProducts.length,
|
||||
itemBuilder: (context, index) =>
|
||||
ProductCard(
|
||||
productModel:_cartController.cartList[index],
|
||||
productModel:_cartController.selectedProducts[index],
|
||||
isCheckout: true,
|
||||
),
|
||||
),
|
||||
|
@ -1,10 +1,9 @@
|
||||
import 'package:auto_size_text/auto_size_text.dart';
|
||||
import 'package:cheminova/controller/get_order_placed_controller.dart';
|
||||
import 'package:cheminova/models/oder_place_model.dart';
|
||||
import 'package:cheminova/models/order_item_model.dart';
|
||||
import 'package:cheminova/models/place_order_list_model.dart';
|
||||
import 'package:cheminova/models/product_model.dart';
|
||||
import 'package:cheminova/screens/order_management/order_fullfilment_screen.dart';
|
||||
import 'package:cheminova/widgets/product_card.dart';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
@ -49,7 +48,7 @@ Future<void> adduni()async {
|
||||
final List<PlacedOrderList> uniqueOrders = [];
|
||||
|
||||
for (var order in _getPlacedOrderController.placedOrders) {
|
||||
if (uniqueOrderIds.add(order.id)) {
|
||||
if (uniqueOrderIds.add(order.uniqueId)) {
|
||||
uniqueOrders.add(order);
|
||||
}
|
||||
}
|
||||
@ -158,7 +157,7 @@ Future<void> adduni()async {
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
Text(widget.placedOrderList!.id),
|
||||
Text(widget.placedOrderList!.uniqueId),
|
||||
],
|
||||
),
|
||||
),
|
||||
@ -283,6 +282,7 @@ Future<void> adduni()async {
|
||||
),
|
||||
SizedBox(
|
||||
width: Get.width,
|
||||
height: Get.height*0.06,
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets.fromLTRB(8, 8, 8, 0),
|
||||
@ -295,7 +295,8 @@ Future<void> adduni()async {
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
Text("${widget.placedOrderList!.shipTo}")
|
||||
AutoSizeText("${widget.placedOrderList!.shipTo}",maxLines: 4,
|
||||
overflow:TextOverflow.ellipsis,)
|
||||
],
|
||||
),
|
||||
),
|
||||
|
@ -177,7 +177,7 @@ class _OrderManagementScreenState extends State<OrderManagementScreen> {
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Text("Order ID: ", style: GoogleFonts.roboto(fontSize: 14, fontWeight: FontWeight.bold)),
|
||||
Text("${order.id}")
|
||||
Text("${order.uniqueId}")
|
||||
],
|
||||
),
|
||||
),
|
||||
|
@ -1,5 +1,4 @@
|
||||
import 'package:cheminova/models/oder_place_model.dart';
|
||||
import 'package:cheminova/models/product_model.dart';
|
||||
|
||||
import 'package:cheminova/screens/order/checkout_screen.dart';
|
||||
import 'package:cheminova/widgets/my_drawer.dart';
|
||||
import 'package:cheminova/widgets/product_card.dart';
|
||||
@ -9,12 +8,14 @@ import 'package:get/get.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
|
||||
import '../../controller/cart_controller.dart';
|
||||
import '../../models/oder_place_model.dart';
|
||||
import '../../models/product_model1.dart';
|
||||
|
||||
class CartScreen extends StatefulWidget {
|
||||
Product? productModel;
|
||||
PlacedOrderModel? placedOrder;
|
||||
CartScreen({super.key, this.productModel,this.placedOrder});
|
||||
|
||||
CartScreen({super.key, this.productModel, this.placedOrder});
|
||||
|
||||
@override
|
||||
State<CartScreen> createState() => _CartScreenState();
|
||||
@ -23,12 +24,33 @@ class CartScreen extends StatefulWidget {
|
||||
class _CartScreenState extends State<CartScreen> {
|
||||
final CartController _cartController = Get.find<CartController>();
|
||||
|
||||
// @override
|
||||
bool _selectAll = true; // Default to true to select all products
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
if (widget.productModel != null) {
|
||||
_cartController.addToCart(widget.productModel!);
|
||||
}
|
||||
// Ensure all products are pre-selected by default
|
||||
_cartController.initializeSelections();
|
||||
_checkIfAllSelected(); // Check if all products are selected by default
|
||||
}
|
||||
|
||||
void _toggleSelectAll(bool? value) {
|
||||
setState(() {
|
||||
_selectAll = value ?? false;
|
||||
_cartController.selectAllProducts(_selectAll);
|
||||
});
|
||||
}
|
||||
|
||||
void _checkIfAllSelected() {
|
||||
// This function checks if all items are selected or not and updates _selectAll
|
||||
setState(() {
|
||||
_selectAll = _cartController.cartList.every(
|
||||
(product) => _cartController.selectedProducts.contains(product),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
@ -62,8 +84,8 @@ class _CartScreenState extends State<CartScreen> {
|
||||
),
|
||||
),
|
||||
],
|
||||
title: Center(
|
||||
child: const Text(
|
||||
title: const Center(
|
||||
child: Text(
|
||||
"Cart",
|
||||
),
|
||||
),
|
||||
@ -77,7 +99,31 @@ class _CartScreenState extends State<CartScreen> {
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
SafeArea(
|
||||
child: Obx(() {
|
||||
if (_cartController.cartList.isEmpty) {
|
||||
return Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Image.asset(
|
||||
'assets/images/cart.png',
|
||||
width: Get.width * 0.5,
|
||||
height: Get.width * 0.5,
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
Text(
|
||||
'Your Cart is empty',
|
||||
style: GoogleFonts.roboto(
|
||||
fontSize: 24,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Colors.white,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
return Column(
|
||||
children: [
|
||||
SizedBox(
|
||||
height: Get.height * 0.02,
|
||||
@ -94,97 +140,111 @@ class _CartScreenState extends State<CartScreen> {
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
// "Select All" Checkbox
|
||||
Row(
|
||||
children: [
|
||||
Checkbox(
|
||||
value: _selectAll,
|
||||
onChanged: _toggleSelectAll,
|
||||
),
|
||||
Text(
|
||||
"Select All",
|
||||
style: GoogleFonts.roboto(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: Get.height * 0.6,
|
||||
child: Obx(() {
|
||||
return ListView.builder(
|
||||
child: ListView.builder(
|
||||
padding: EdgeInsets.zero,
|
||||
itemCount: _cartController.cartList.length,
|
||||
itemBuilder: (context, index) => ProductCard(
|
||||
productModel: _cartController.cartList[index],
|
||||
isInCart: true,
|
||||
placedOrder:widget.placedOrder,
|
||||
),
|
||||
);
|
||||
}),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
Obx(() {
|
||||
itemBuilder: (context, index) {
|
||||
return Row(
|
||||
children: [
|
||||
Checkbox(
|
||||
value: _cartController.selectedProducts.contains(
|
||||
_cartController.cartList[index]),
|
||||
onChanged: (value) {
|
||||
_cartController.toggleProductSelection(
|
||||
_cartController.cartList[index],
|
||||
value!,
|
||||
);
|
||||
_checkIfAllSelected(); // Check if all are selected after each toggle
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: ProductCard(
|
||||
productModel:
|
||||
_cartController.cartList[index],
|
||||
isInCart: true,
|
||||
placedOrder: widget.placedOrder,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
"Subtotal ",
|
||||
style: GoogleFonts.roboto(
|
||||
fontSize: 15,
|
||||
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
Text("₹ ${_cartController.subtotal.value}"),
|
||||
Obx(() =>
|
||||
Text("₹ ${_cartController.subtotal.value}")),
|
||||
],
|
||||
);
|
||||
|
||||
}),
|
||||
|
||||
|
||||
// const SizedBox(
|
||||
// height: 16,
|
||||
// ),
|
||||
Obx(() {
|
||||
return Row(
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
"GST ",
|
||||
style: GoogleFonts.roboto(
|
||||
fontSize: 15,
|
||||
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold
|
||||
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
Text("₹ ${_cartController.gstTotal.value}"),
|
||||
Obx(() =>
|
||||
Text("₹ ${_cartController.gstTotal.value}")),
|
||||
],
|
||||
);
|
||||
|
||||
}),
|
||||
Obx(() {
|
||||
return Row(
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
"Total Amount ",
|
||||
style: GoogleFonts.roboto(
|
||||
fontSize: 15,
|
||||
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
Text(" ₹ ${_cartController.grandTotal.value}"),
|
||||
Obx(() => Text(
|
||||
"₹ ${_cartController.grandTotal.value}")),
|
||||
],
|
||||
);
|
||||
|
||||
}),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: Get.height * 0.025,
|
||||
),
|
||||
SizedBox(height: Get.height * 0.020),
|
||||
SizedBox(
|
||||
width: Get.width * 0.9,
|
||||
height: Get.height * 0.06,
|
||||
child: ElevatedButton(
|
||||
onPressed: () => Get.to(() => CheckoutScreen(
|
||||
|
||||
productModel:widget.productModel
|
||||
selectedProducts: _cartController.selectedProducts,
|
||||
)),
|
||||
style: ElevatedButton.styleFrom(
|
||||
foregroundColor: Colors.white,
|
||||
@ -203,10 +263,277 @@ class _CartScreenState extends State<CartScreen> {
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// import 'package:cheminova/models/oder_place_model.dart';
|
||||
// import 'package:cheminova/models/product_model.dart';
|
||||
// import 'package:cheminova/screens/order/checkout_screen.dart';
|
||||
// import 'package:cheminova/widgets/my_drawer.dart';
|
||||
// import 'package:cheminova/widgets/product_card.dart';
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:flutter_svg/svg.dart';
|
||||
// import 'package:get/get.dart';
|
||||
// import 'package:google_fonts/google_fonts.dart';
|
||||
//
|
||||
// import '../../controller/cart_controller.dart';
|
||||
// import '../../models/product_model1.dart';
|
||||
//
|
||||
// class CartScreen extends StatefulWidget {
|
||||
// Product? productModel;
|
||||
// PlacedOrderModel? placedOrder;
|
||||
//
|
||||
// CartScreen({super.key, this.productModel, this.placedOrder});
|
||||
//
|
||||
// @override
|
||||
// State<CartScreen> createState() => _CartScreenState();
|
||||
// }
|
||||
//
|
||||
// class _CartScreenState extends State<CartScreen> {
|
||||
// final CartController _cartController = Get.find<CartController>();
|
||||
//
|
||||
// bool _selectAll = false; // State to track "Select All" checkbox
|
||||
//
|
||||
// @override
|
||||
// void initState() {
|
||||
// super.initState();
|
||||
// if (widget.productModel != null) {
|
||||
// _cartController.addToCart(widget.productModel!);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// void _toggleSelectAll(bool? value) {
|
||||
// setState(() {
|
||||
// _selectAll = value ?? false;
|
||||
// _cartController.cartList.forEach((product) {
|
||||
// _cartController.toggleProductSelection(product, _selectAll);
|
||||
// });
|
||||
// });
|
||||
// }
|
||||
//
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return Scaffold(
|
||||
// extendBodyBehindAppBar: true,
|
||||
// appBar: AppBar(
|
||||
// backgroundColor: Colors.transparent,
|
||||
// elevation: 0,
|
||||
// leading: Builder(
|
||||
// builder: (context) {
|
||||
// return GestureDetector(
|
||||
// onTap: () => Scaffold.of(context).openDrawer(),
|
||||
// child: Padding(
|
||||
// padding: const EdgeInsets.all(16.0),
|
||||
// child: SvgPicture.asset(
|
||||
// 'assets/svg/menu.svg',
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
// actions: [
|
||||
// GestureDetector(
|
||||
// onTap: () => Get.back(),
|
||||
// child: Padding(
|
||||
// padding: const EdgeInsets.all(8.0),
|
||||
// child: SvgPicture.asset(
|
||||
// 'assets/svg/back_arrow.svg',
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// title: Center(
|
||||
// child: const Text(
|
||||
// "Cart",
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// drawer: const MyDrawer(),
|
||||
// body: Stack(
|
||||
// fit: StackFit.expand,
|
||||
// children: [
|
||||
// Image.asset(
|
||||
// 'assets/images/image_1.png',
|
||||
// fit: BoxFit.cover,
|
||||
// ),
|
||||
// SafeArea(
|
||||
// child: Obx(() {
|
||||
// if (_cartController.cartList.isEmpty) {
|
||||
// return Center(
|
||||
// child: Column(
|
||||
// mainAxisAlignment: MainAxisAlignment.center,
|
||||
// children: [
|
||||
// Image.asset(
|
||||
// 'assets/images/cart.png',
|
||||
// width: Get.width * 0.5,
|
||||
// height: Get.width * 0.5,
|
||||
// ),
|
||||
// const SizedBox(height: 20),
|
||||
// Text(
|
||||
// 'Your Cart is empty',
|
||||
// style: GoogleFonts.roboto(
|
||||
// fontSize: 24,
|
||||
// fontWeight: FontWeight.w500,
|
||||
// color: Colors.white,
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
// return Column(
|
||||
// children: [
|
||||
// SizedBox(
|
||||
// height: Get.height * 0.02,
|
||||
// ),
|
||||
// Card(
|
||||
// margin: const EdgeInsets.symmetric(horizontal: 18),
|
||||
// shape: RoundedRectangleBorder(
|
||||
// borderRadius: BorderRadius.circular(19),
|
||||
// side: const BorderSide(color: Color(0xFFFDFDFD)),
|
||||
// ),
|
||||
// color: const Color(0xFFB4D1E5).withOpacity(0.9),
|
||||
// child: Padding(
|
||||
// padding: const EdgeInsets.all(12.0),
|
||||
// child: Column(
|
||||
// mainAxisSize: MainAxisSize.min,
|
||||
// children: [
|
||||
// // "Select All" Checkbox
|
||||
// Row(
|
||||
// children: [
|
||||
// Checkbox(
|
||||
// value: _selectAll,
|
||||
// onChanged: _toggleSelectAll,
|
||||
// ),
|
||||
// Text(
|
||||
// "Select All",
|
||||
// style: GoogleFonts.roboto(
|
||||
// fontSize: 16,
|
||||
// fontWeight: FontWeight.w500,
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// SizedBox(
|
||||
// height: Get.height * 0.6,
|
||||
// child: ListView.builder(
|
||||
// padding: EdgeInsets.zero,
|
||||
// itemCount: _cartController.cartList.length,
|
||||
// itemBuilder: (context, index) {
|
||||
// return Row(
|
||||
// children: [
|
||||
// Checkbox(
|
||||
// value: _cartController
|
||||
// .cartList[index].selected,
|
||||
// onChanged: (value) {
|
||||
// setState(() {
|
||||
//
|
||||
// });
|
||||
// _cartController.toggleProductSelection(
|
||||
// _cartController.cartList[index],
|
||||
// value!);
|
||||
// },
|
||||
// ),
|
||||
// Expanded(
|
||||
// child: ProductCard(
|
||||
// productModel:
|
||||
// _cartController.cartList[index],
|
||||
// isInCart: true,
|
||||
// placedOrder: widget.placedOrder,
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
// ),
|
||||
// const SizedBox(height: 10),
|
||||
// Row(
|
||||
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
// children: [
|
||||
// Text(
|
||||
// "Subtotal ",
|
||||
// style: GoogleFonts.roboto(
|
||||
// fontSize: 15,
|
||||
// color: Colors.black,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
// Obx(() => Text("₹ ${_cartController.subtotal.value}")),
|
||||
// ],
|
||||
// ),
|
||||
// Row(
|
||||
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
// children: [
|
||||
// Text(
|
||||
// "GST ",
|
||||
// style: GoogleFonts.roboto(
|
||||
// fontSize: 15,
|
||||
// color: Colors.black,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
// Obx(() => Text("₹ ${_cartController.gstTotal.value}")),
|
||||
// ],
|
||||
// ),
|
||||
// Row(
|
||||
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
// children: [
|
||||
// Text(
|
||||
// "Total Amount ",
|
||||
// style: GoogleFonts.roboto(
|
||||
// fontSize: 15,
|
||||
// color: Colors.black,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
// Obx(() => Text("₹ ${_cartController.grandTotal.value}")),
|
||||
// ],
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// SizedBox(height: Get.height * 0.020),
|
||||
// SizedBox(
|
||||
// width: Get.width * 0.9,
|
||||
// height: Get.height * 0.06,
|
||||
// child: ElevatedButton(
|
||||
// onPressed: () => Get.to(() => CheckoutScreen(
|
||||
// productModel: widget.productModel,
|
||||
// )),
|
||||
// style: ElevatedButton.styleFrom(
|
||||
// foregroundColor: Colors.white,
|
||||
// backgroundColor: const Color(0xFF00784C),
|
||||
// shape: RoundedRectangleBorder(
|
||||
// borderRadius: BorderRadius.circular(10),
|
||||
// ),
|
||||
// ),
|
||||
// child: Text(
|
||||
// "Proceed to Checkout",
|
||||
// style: GoogleFonts.roboto(
|
||||
// fontSize: 16,
|
||||
// fontWeight: FontWeight.w600,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// );
|
||||
// }),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
26
lib/screens/product/pdf_screen.dart
Normal file
26
lib/screens/product/pdf_screen.dart
Normal file
@ -0,0 +1,26 @@
|
||||
|
||||
import 'package:cheminova/models/product_mannual_model.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
|
||||
|
||||
|
||||
class ViewPdfScreen extends StatefulWidget {
|
||||
final ProductManualModel productManualModel;
|
||||
const ViewPdfScreen({super.key, required this.productManualModel});
|
||||
|
||||
@override
|
||||
State<ViewPdfScreen> createState() => _ViewPdfScreenState();
|
||||
}
|
||||
|
||||
class _ViewPdfScreenState extends State<ViewPdfScreen> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: SafeArea(
|
||||
child: SfPdfViewer.network(
|
||||
widget.productManualModel.productManual.url,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
134
lib/screens/product/product_mannual.dart
Normal file
134
lib/screens/product/product_mannual.dart
Normal file
@ -0,0 +1,134 @@
|
||||
import 'package:cheminova/controller/product_mannual_controller.dart';
|
||||
import 'package:cheminova/models/product_mannual_model.dart';
|
||||
import 'package:cheminova/screens/product/pdf_screen.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:get/get.dart';
|
||||
import '../../widgets/custom_button.dart';
|
||||
|
||||
class ProductsManualScreen extends StatefulWidget {
|
||||
const ProductsManualScreen({super.key});
|
||||
|
||||
@override
|
||||
_ProductsManualScreenState createState() => _ProductsManualScreenState();
|
||||
}
|
||||
|
||||
class _ProductsManualScreenState extends State<ProductsManualScreen> {
|
||||
final ProductManualController _productManualController = Get.put(ProductManualController());
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_productManualController.fetchProductManuals(); // Fetch product manual list from API
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
extendBodyBehindAppBar: true,
|
||||
appBar: _buildAppBar(),
|
||||
body: Stack(
|
||||
alignment: Alignment.topCenter,
|
||||
children: [
|
||||
_buildBackgroundImage(),
|
||||
Center(
|
||||
child: SingleChildScrollView(
|
||||
child: _buildCardContent(),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// Extract AppBar to its own method
|
||||
AppBar _buildAppBar() {
|
||||
return AppBar(
|
||||
backgroundColor: Colors.transparent,
|
||||
elevation: 0,
|
||||
leading: GestureDetector(
|
||||
onTap: () => Get.back(),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: SvgPicture.asset('assets/svg/menu.svg'),
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
GestureDetector(
|
||||
onTap: () => Get.back(),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: SvgPicture.asset('assets/svg/back_arrow.svg'),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
// Extract background image widget
|
||||
Widget _buildBackgroundImage() {
|
||||
return Container(
|
||||
height: 900,
|
||||
decoration: const BoxDecoration(
|
||||
image: DecorationImage(
|
||||
fit: BoxFit.cover,
|
||||
image: AssetImage('assets/images/image_1.png'),
|
||||
),
|
||||
),
|
||||
child: SizedBox(
|
||||
width: Get.width,
|
||||
height: Get.height * 0.7,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// Build the card content
|
||||
Widget _buildCardContent() {
|
||||
return Obx(() {
|
||||
if (_productManualController.isLoading.value) {
|
||||
return const CircularProgressIndicator(); // Loading state
|
||||
}
|
||||
|
||||
if (_productManualController.productManualList.isEmpty) {
|
||||
return const Text("No product manuals available"); // Empty state
|
||||
}
|
||||
|
||||
return Card(
|
||||
margin: const EdgeInsets.symmetric(horizontal: 24),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(19),
|
||||
side: const BorderSide(color: Color(0xFFFDFDFD)),
|
||||
),
|
||||
color: const Color(0xFFB4D1E5).withOpacity(0.9),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
children: _buildProductButtons(),
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// Method to create a list of CustomButtons for products dynamically from API data
|
||||
List<Widget> _buildProductButtons() {
|
||||
return _productManualController.productManualList.map((productManual) {
|
||||
return CustomButton(
|
||||
text: productManual.title ?? "No Title", // Dynamically fetch product name
|
||||
onPressed: () => _navigateToPdfScreen(productManual),
|
||||
);
|
||||
}).toList();
|
||||
}
|
||||
|
||||
// Method to handle navigation to PDF screen
|
||||
void _navigateToPdfScreen(ProductManualModel productManual) {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => ViewPdfScreen(
|
||||
productManualModel: productManual,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,22 +1,31 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class InputField extends StatelessWidget {
|
||||
class InputField extends StatefulWidget {
|
||||
final String hintText;
|
||||
final String labelText;
|
||||
final TextEditingController controller;
|
||||
final bool obscureText;
|
||||
final TextInputType? keyboardType;
|
||||
final String? Function(String?)? validator;// Add this line for validation
|
||||
|
||||
const InputField({
|
||||
InputField({
|
||||
super.key,
|
||||
required this.hintText,
|
||||
required this.labelText,
|
||||
required this.controller,
|
||||
this.obscureText = false,
|
||||
this.keyboardType = TextInputType.text,
|
||||
this.validator, // Add this
|
||||
});
|
||||
|
||||
@override
|
||||
State<InputField> createState() => _InputFieldState();
|
||||
}
|
||||
|
||||
class _InputFieldState extends State<InputField> {
|
||||
bool _isObscured = true;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
@ -24,15 +33,16 @@ class InputField extends StatelessWidget {
|
||||
width: Get.width * 0.9,
|
||||
padding: const EdgeInsets.fromLTRB(6, 10, 10, 0),
|
||||
child: TextFormField(
|
||||
controller: controller,
|
||||
obscureText: obscureText,
|
||||
keyboardType: keyboardType,
|
||||
controller: widget.controller,
|
||||
obscureText: widget.obscureText && _isObscured,
|
||||
keyboardType: widget.keyboardType,
|
||||
decoration: InputDecoration(
|
||||
labelText: labelText,
|
||||
hintText: hintText,
|
||||
labelText: widget.labelText,
|
||||
hintText: widget.hintText,
|
||||
labelStyle: const TextStyle(
|
||||
color: Color(0xFF000000),
|
||||
),
|
||||
|
||||
enabledBorder: const OutlineInputBorder(
|
||||
borderSide: BorderSide(color: Colors.grey),
|
||||
borderRadius: BorderRadius.all(Radius.circular(8)),
|
||||
@ -45,7 +55,21 @@ class InputField extends StatelessWidget {
|
||||
const EdgeInsets.symmetric(vertical: 10, horizontal: 16),
|
||||
fillColor: Colors.white,
|
||||
filled: true,
|
||||
// suffixIcon: widget.obscureText
|
||||
// ? IconButton(
|
||||
// icon: Icon(
|
||||
// _isObscured ? Icons.visibility : Icons.visibility_off,
|
||||
// color: Colors.grey,
|
||||
// ),
|
||||
// onPressed: () {
|
||||
// setState(() {
|
||||
// _isObscured = !_isObscured;
|
||||
// });
|
||||
// },
|
||||
// )
|
||||
// : null,
|
||||
),
|
||||
validator: widget.validator, // Add this for validation
|
||||
),
|
||||
);
|
||||
}
|
||||
|
@ -9,7 +9,6 @@ import 'package:get/get.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
|
||||
import '../models/product_model1.dart';
|
||||
|
||||
import '../utils/show_snackbar.dart';
|
||||
|
||||
class ProductCard extends StatefulWidget {
|
||||
@ -69,7 +68,7 @@ class _ProductCardState extends State<ProductCard> {
|
||||
borderRadius: BorderRadius.circular(15.0),
|
||||
child: Container(
|
||||
height: Get.height * 0.15,
|
||||
width: Get.width * 0.30,
|
||||
width: Get.width * 0.31,
|
||||
decoration: BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: AssetImage("assets/images/product.png"),
|
||||
@ -79,10 +78,10 @@ class _ProductCardState extends State<ProductCard> {
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Column(
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 3.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
@ -106,24 +105,22 @@ class _ProductCardState extends State<ProductCard> {
|
||||
fontWeight: FontWeight.w700,
|
||||
),
|
||||
),
|
||||
showQuantity
|
||||
? Text(
|
||||
if (showQuantity)
|
||||
Text(
|
||||
"Quantity: ${currentQuantity}",
|
||||
style: GoogleFonts.roboto(
|
||||
fontSize: 15,
|
||||
fontWeight: FontWeight.w700,
|
||||
),
|
||||
)
|
||||
: const SizedBox(),
|
||||
widget.isCheckout
|
||||
? const SizedBox()
|
||||
: widget.isInCart
|
||||
),
|
||||
if (!widget.isCheckout)
|
||||
widget.isInCart
|
||||
? Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Container(
|
||||
height: 40,
|
||||
width: 100,
|
||||
height: Get.height * 0.04,
|
||||
width: Get.width * 0.21,
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xFF004791),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
@ -167,8 +164,8 @@ class _ProductCardState extends State<ProductCard> {
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 24,
|
||||
width: 24,
|
||||
height: 22,
|
||||
width: 22,
|
||||
child: ElevatedButton(
|
||||
onPressed: () {
|
||||
_cartController.increaseQuantity(widget.productModel!);
|
||||
@ -198,7 +195,7 @@ class _ProductCardState extends State<ProductCard> {
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 20.0,
|
||||
width: 2.0,
|
||||
),
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
@ -212,7 +209,7 @@ class _ProductCardState extends State<ProductCard> {
|
||||
Icons.delete_outline_rounded,
|
||||
color: Colors.red,
|
||||
),
|
||||
)
|
||||
),
|
||||
],
|
||||
)
|
||||
: ElevatedButton(
|
||||
@ -222,9 +219,6 @@ class _ProductCardState extends State<ProductCard> {
|
||||
} else {
|
||||
_cartController.addToCart(widget.productModel!);
|
||||
showSnackbar("Product successfully added to your cart");
|
||||
// setState(() {
|
||||
// currentQuantity = widget.productModel!.quantity;
|
||||
// });
|
||||
}
|
||||
},
|
||||
style: ElevatedButton.styleFrom(
|
||||
@ -244,7 +238,9 @@ class _ProductCardState extends State<ProductCard> {
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
@ -6,6 +6,14 @@
|
||||
|
||||
#include "generated_plugin_registrant.h"
|
||||
|
||||
#include <file_selector_linux/file_selector_plugin.h>
|
||||
#include <url_launcher_linux/url_launcher_plugin.h>
|
||||
|
||||
void fl_register_plugins(FlPluginRegistry* registry) {
|
||||
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
|
||||
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
|
||||
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
|
||||
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
|
||||
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
|
||||
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
|
||||
}
|
||||
|
@ -3,6 +3,8 @@
|
||||
#
|
||||
|
||||
list(APPEND FLUTTER_PLUGIN_LIST
|
||||
file_selector_linux
|
||||
url_launcher_linux
|
||||
)
|
||||
|
||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||
|
@ -5,10 +5,18 @@
|
||||
import FlutterMacOS
|
||||
import Foundation
|
||||
|
||||
import device_info_plus
|
||||
import file_selector_macos
|
||||
import path_provider_foundation
|
||||
import shared_preferences_foundation
|
||||
import syncfusion_pdfviewer_macos
|
||||
import url_launcher_macos
|
||||
|
||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
|
||||
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
|
||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
||||
SyncfusionFlutterPdfViewerPlugin.register(with: registry.registrar(forPlugin: "SyncfusionFlutterPdfViewerPlugin"))
|
||||
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
||||
}
|
||||
|
352
pubspec.lock
352
pubspec.lock
@ -17,6 +17,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.11.0"
|
||||
auto_size_text:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: auto_size_text
|
||||
sha256: "3f5261cd3fb5f2a9ab4e2fc3fba84fd9fcaac8821f20a1d4e71f557521b22599"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -49,6 +57,22 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.18.0"
|
||||
convert:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: convert
|
||||
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.1"
|
||||
cross_file:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: cross_file
|
||||
sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.3.4+2"
|
||||
crypto:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -57,6 +81,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
csc_picker:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: csc_picker
|
||||
sha256: "7e5d6023a81f53b89a7fb0369953fd4dc676f7ea20e9a0c0707973a5f0aedf14"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.7"
|
||||
cupertino_icons:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -65,6 +97,22 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.8"
|
||||
device_info_plus:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: device_info_plus
|
||||
sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.1.2"
|
||||
device_info_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: device_info_plus_platform_interface
|
||||
sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.1"
|
||||
dio:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -105,6 +153,46 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.0"
|
||||
file_selector_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_linux
|
||||
sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.2+1"
|
||||
file_selector_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_macos
|
||||
sha256: f42eacb83b318e183b1ae24eead1373ab1334084404c8c16e0354f9a3e55d385
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.4"
|
||||
file_selector_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_platform_interface
|
||||
sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.6.2"
|
||||
file_selector_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_windows
|
||||
sha256: "2ad726953f6e8affbc4df8dc78b77c3b4a060967a291e528ef72ae846c60fb69"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.3+2"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fixnum
|
||||
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
@ -118,6 +206,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.2"
|
||||
flutter_plugin_android_lifecycle:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_plugin_android_lifecycle
|
||||
sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.22"
|
||||
flutter_svg:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -160,6 +256,22 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.2.1"
|
||||
hive:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: hive
|
||||
sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.3"
|
||||
hive_flutter:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: hive_flutter
|
||||
sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
http:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -176,6 +288,70 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.2"
|
||||
image_picker:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: image_picker
|
||||
sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
image_picker_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: image_picker_android
|
||||
sha256: "8c5abf0dcc24fe6e8e0b4a5c0b51a5cf30cefdf6407a3213dae61edc75a70f56"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.12+12"
|
||||
image_picker_for_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: image_picker_for_web
|
||||
sha256: "65d94623e15372c5c51bebbcb820848d7bcb323836e12dfdba60b5d3a8b39e50"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.5"
|
||||
image_picker_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: image_picker_ios
|
||||
sha256: "6703696ad49f5c3c8356d576d7ace84d1faf459afb07accbb0fae780753ff447"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.12"
|
||||
image_picker_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: image_picker_linux
|
||||
sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.1+1"
|
||||
image_picker_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: image_picker_macos
|
||||
sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.1+1"
|
||||
image_picker_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: image_picker_platform_interface
|
||||
sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.10.0"
|
||||
image_picker_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: image_picker_windows
|
||||
sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.1+1"
|
||||
intl:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -184,6 +360,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.19.0"
|
||||
js:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: js
|
||||
sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.1"
|
||||
leak_tracker:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -248,6 +432,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.12.0"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mime
|
||||
sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.6"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -413,6 +605,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.10.0"
|
||||
sprintf:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sprintf
|
||||
sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.0"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -437,6 +637,70 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
syncfusion_flutter_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: syncfusion_flutter_core
|
||||
sha256: "6e67726b85812afc7105725a23620b876ab7f6b04b8410e211330ffb8c2cdbe8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "26.2.14"
|
||||
syncfusion_flutter_pdf:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: syncfusion_flutter_pdf
|
||||
sha256: "59a1173dc34a1fac0a41aff7a2bb6f3c1578f1bfd749ea8b24379018434ba5a5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "26.2.14"
|
||||
syncfusion_flutter_pdfviewer:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: syncfusion_flutter_pdfviewer
|
||||
sha256: b54ffe621a0e2155cfc913ee55efcd160e2dc8d21c2b9185f4a9996e0ccc9424
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "26.2.14"
|
||||
syncfusion_flutter_signaturepad:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: syncfusion_flutter_signaturepad
|
||||
sha256: "5f8955d4ee64f342b389928111ebfad041e75003415eedee802f3af1d4ce7036"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "26.2.14"
|
||||
syncfusion_pdfviewer_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: syncfusion_pdfviewer_macos
|
||||
sha256: "1eec60fe44cc357072a0b872e4b0a82edef741463fda2b3a95a6973d7a615ec1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "26.2.14"
|
||||
syncfusion_pdfviewer_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: syncfusion_pdfviewer_platform_interface
|
||||
sha256: e128a2875226dc1d922ac0366d0804aa0ee7a52be23799cc6d84d78fd32ce092
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "26.2.14"
|
||||
syncfusion_pdfviewer_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: syncfusion_pdfviewer_web
|
||||
sha256: "5625c2e658e5d680ea240ea5f5daedf6a0acd563cec026a38b8cb5643783ce4f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "26.2.14"
|
||||
syncfusion_pdfviewer_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: syncfusion_pdfviewer_windows
|
||||
sha256: f6c56fea4b77ada9d7ddab6ed67a4a25317a2efd1007309e8938c01f1d952b20
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "26.2.14"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -461,6 +725,78 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.2"
|
||||
url_launcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher
|
||||
sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.0"
|
||||
url_launcher_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_android
|
||||
sha256: f0c73347dfcfa5b3db8bc06e1502668265d39c08f310c29bff4e28eea9699f79
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.9"
|
||||
url_launcher_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_ios
|
||||
sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.1"
|
||||
url_launcher_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_linux
|
||||
sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.0"
|
||||
url_launcher_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_macos
|
||||
sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.0"
|
||||
url_launcher_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_platform_interface
|
||||
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
url_launcher_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_web
|
||||
sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.3"
|
||||
url_launcher_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_windows
|
||||
sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.2"
|
||||
uuid:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: uuid
|
||||
sha256: f33d6bb662f0e4f79dcd7ada2e6170f3b3a2530c28fc41f49a411ddedd576a77
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.5.0"
|
||||
vector_graphics:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -509,6 +845,22 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
win32:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: win32
|
||||
sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.5.4"
|
||||
win32_registry:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: win32_registry
|
||||
sha256: "723b7f851e5724c55409bb3d5a32b203b3afe8587eaf5dafb93a5fed8ecda0d6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.4"
|
||||
xdg_directories:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -44,6 +44,11 @@ dependencies:
|
||||
logger: ^2.4.0
|
||||
get_storage: ^2.1.1
|
||||
intl: ^0.19.0
|
||||
hive_flutter: ^1.1.0
|
||||
syncfusion_flutter_pdfviewer: ^26.2.14
|
||||
image_picker: ^1.1.2
|
||||
csc_picker: ^0.2.7
|
||||
auto_size_text: ^3.0.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
@ -6,6 +6,15 @@
|
||||
|
||||
#include "generated_plugin_registrant.h"
|
||||
|
||||
#include <file_selector_windows/file_selector_windows.h>
|
||||
#include <syncfusion_pdfviewer_windows/syncfusion_pdfviewer_windows_plugin.h>
|
||||
#include <url_launcher_windows/url_launcher_windows.h>
|
||||
|
||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||
FileSelectorWindowsRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("FileSelectorWindows"));
|
||||
SyncfusionPdfviewerWindowsPluginRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("SyncfusionPdfviewerWindowsPlugin"));
|
||||
UrlLauncherWindowsRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
|
||||
}
|
||||
|
@ -3,6 +3,9 @@
|
||||
#
|
||||
|
||||
list(APPEND FLUTTER_PLUGIN_LIST
|
||||
file_selector_windows
|
||||
syncfusion_pdfviewer_windows
|
||||
url_launcher_windows
|
||||
)
|
||||
|
||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||
|
Loading…
Reference in New Issue
Block a user