با سلام خدمت مهندس حسینی
من یه سروری با node js و دیتابیس mongoDB نوشتم و از طریق postman درخواست post ارسال میکنم و داخل دیتابیس ذخیره میشه ولی نمی دونم چرا از طریق برنامه به آدرس ریکوئست نمی تونه دسترسی پیدا کنه. ممنون میشم راهنماییم کنید
کدهای فایل network.dart:
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:cool_alert/cool_alert.dart';
import 'package:engineering_services_tariff/models/tariff.dart';
import 'package:engineering_services_tariff/utils/constants.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert' as convert;
class Network {
static bool isConnected = false;
static Future<bool> checkInternet(BuildContext context) async {
Connectivity().onConnectivityChanged.listen((status) {
if (status == ConnectivityResult.wifi ||
status == ConnectivityResult.mobile) {
isConnected = true;
} else {
showInternetError(context);
isConnected = false;
}
});
return isConnected;
}
static void showInternetError(BuildContext context) {
CoolAlert.show(
width: 100,
title: "خطا",
confirmBtnText: "باشه",
text: "!شما به اینترنت متصل نیستید",
confirmBtnColor: kBlueColor,
confirmBtnTextStyle: const TextStyle(fontSize: 16, color: Colors.white),
context: context,
type: CoolAlertType.error);
}
static Uri urlGet = Uri.parse("http://localhost:3000/api/tariff-list");
static Uri urlPost = Uri.parse("http://127.0.0.1:8000/api/supervision/add/");
static Uri urlWithId(String id) {
Uri url = Uri.parse("http://localhost:3000/api/tariff-list/$id/");
return url;
}
static List<Tariff> tariffs = [];
static getData() async {
tariffs.clear();
await http.get(Network.urlGet).then((response) {
if (response.statusCode == 200) {
List jsonDecode = convert.jsonDecode(response.body);
for (var json in jsonDecode) {
tariffs.add(Tariff.fromJson(json));
}
}
});
}
static postData({
required String year,
required String field,
required String group,
required String price,
}) async {
Tariff tariff =
Tariff(year: year, field: field, group: group, price: price);
await http.post(Network.urlPost, body: tariff.toJson()).then((response) {});
}
}
کدهای مربوط به add_screen.dart:
import 'package:cool_alert/cool_alert.dart';
import 'package:engineering_services_tariff/screens/calculate_screen.dart';
import 'package:engineering_services_tariff/utils/network.dart';
import 'package:engineering_services_tariff/widgets/my_button_widget.dart';
import 'package:engineering_services_tariff/widgets/my_text_field_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../utils/constants.dart';
class AddScreen extends StatefulWidget {
const AddScreen({Key? key}) : super(key: key);
static TextEditingController priceController = TextEditingController();
@override
State<AddScreen> createState() => _AddScreenState();
}
class _AddScreenState extends State<AddScreen> {
// Initial Selected Value
String fieldsDropdownValue = 'هماهنگ کننده';
// List of items in our dropdown menu
var fieldItems = [
'هماهنگ کننده',
'عمران',
'معماری',
'تأسیسات مکانیکی',
'تأسیسات برقی',
];
String yearDropdownValue = '1401';
// List of items in our dropdown menu
var yearItems = [
'1401',
'1400',
'1399',
'1398',
'1397',
'1396',
'1395',
];
String groupDropdownValue = 'ب';
// List of items in our dropdown menu
var groupItems = [
'الف',
'ب',
'ج',
'د',
];
String cDropdownValue = '6 و 7 طبقه';
// List of items in our dropdown menu
var cItems = [
'6 و 7 طبقه',
'8 تا 10 طبقه',
];
String dDropdownValue = '11 و 12 طبقه';
// List of items in our dropdown menu
var dItems = [
'11 و 12 طبقه',
'13 تا 15 طبقه',
'16 طبقه و بالاتر',
];
@override
Widget build(BuildContext context) {
String group = "";
return Directionality(
textDirection: TextDirection.rtl,
child: Scaffold(
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(22.0),
child: SingleChildScrollView(
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
DropdownButton(
borderRadius: BorderRadius.circular(15.0),
// Initial Value
value: fieldsDropdownValue,
// Down Arrow Icon
icon: const Icon(Icons.keyboard_arrow_down),
// Array list of items
items: fieldItems.map((String items) {
return DropdownMenuItem(
value: items,
child: Text(items),
);
}).toList(),
// After selecting the desired option,it will
// change button value to selected value
onChanged: (String? newValue) {
setState(() {
fieldsDropdownValue = newValue!;
});
},
),
DropdownButton(
borderRadius: BorderRadius.circular(15.0),
// Initial Value
value: yearDropdownValue,
// Down Arrow Icon
icon: const Icon(Icons.keyboard_arrow_down),
// Array list of items
items: yearItems.map((String items) {
return DropdownMenuItem(
value: items,
child: Text(items),
);
}).toList(),
// After selecting the desired option,it will
// change button value to selected value
onChanged: (String? newValue) {
setState(() {
yearDropdownValue = newValue!;
});
},
),
],
),
const SizedBox(height: 22),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
DropdownButton(
borderRadius: BorderRadius.circular(15.0),
// Initial Value
value: groupDropdownValue,
// Down Arrow Icon
icon: const Icon(Icons.keyboard_arrow_down),
// Array list of items
items: groupItems.map((String items) {
return DropdownMenuItem(
value: items,
child: Text(items),
);
}).toList(),
// After selecting the desired option,it will
// change button value to selected value
onChanged: (String? newValue) {
setState(() {
groupDropdownValue = newValue!;
});
},
),
DropdownButton(
borderRadius: BorderRadius.circular(15.0),
// Initial Value
value: cDropdownValue,
// Down Arrow Icon
icon: const Icon(Icons.keyboard_arrow_down),
// Array list of items
items: cItems.map((String items) {
return DropdownMenuItem(
value: items,
child: Text(items),
);
}).toList(),
// After selecting the desired option,it will
// change button value to selected value
onChanged: (String? newValue) {
setState(() {
cDropdownValue = newValue!;
});
},
),
DropdownButton(
borderRadius: BorderRadius.circular(15.0),
// Initial Value
value: dDropdownValue,
// Down Arrow Icon
icon: const Icon(Icons.keyboard_arrow_down),
// Array list of items
items: dItems.map((String items) {
return DropdownMenuItem(
value: items,
child: Text(items),
);
}).toList(),
// After selecting the desired option,it will
// change button value to selected value
onChanged: (String? newValue) {
setState(() {
dDropdownValue = newValue!;
});
},
)
],
),
const SizedBox(height: 22),
MyTextField(
controller: AddScreen.priceController,
errorText: "لطفا مبلغ تعرفه را وارد کنید",
hintText: "مبلغ تعرفه خدمات مهندسی (ریال)",
inputType: TextInputType.number,
),
const SizedBox(height: 22),
MyButton(
child: const Text("اضافه کردن"),
width: double.infinity,
onPressed: () {
Network.checkInternet(context);
Future.delayed(const Duration(seconds: 3)).then(
(value) {
if (Network.isConnected) {
if (groupDropdownValue == "الف") {
group = "a";
} else if (groupDropdownValue == "ب") {
group = "b";
} else if (groupDropdownValue == "ج") {
if (cDropdownValue == "6 و 7 طبقه") {
group = "c1";
} else {
group = "c2";
}
} else if (groupDropdownValue == "د") {
if (dDropdownValue == "11 و 12 طبقه") {
group = "d1";
} else if (dDropdownValue == "13 تا 15 طبقه") {
group = "d2";
} else {
group = "d3";
}
}
Network.postData(
year: yearDropdownValue,
field: fieldsDropdownValue,
group: group,
price: AddScreen.priceController.text);
CoolAlert.show(
width: 100,
title: "موفق",
confirmBtnText: "باشه",
text: group + " " + AddScreen.priceController.text,
confirmBtnColor: kBlueColor,
confirmBtnTextStyle: const TextStyle(
fontSize: 16, color: Colors.white),
context: context,
type: CoolAlertType.success);
// Navigator.pop(context);
} else {
Network.showInternetError(context);
}
},
);
})
],
),
),
),
),
),
);
}
}
و البته اینم از درخواست post ارسالی از طریق postman که به درستی کار میکنه:

جناب مهندس حسینی با عرض سلام، من در فایل network.dart از آدرس آیپی سیستم استفاده کردم و تغییری که حاصل شد این بود که الان درخواست post به سرور ارسال میشه ولی نمی دونم چرا اطلاعات body رو ذخیره نمیکنه و فقط با هر بار کلیک روی دکمه اضافه کردن، یک رکورد جدید که فقط شامل آیدی باشه به دیتابیس اضافه میشه.

در حالیکه هنگام ارسال اطلاعات از طریق postman بدرستی همه اطلاعات ارسالی در دیتابیس ذخیره میشه و یه چیز دیگه اینکه اطلاعات مقادیر فیلدها تا آخرین لحظه و تا تکه کد زیر در همان فایل network.dart به درستی مقدار دهی و ارسال میشه ولی توو دیتابیس نمی دونم چرا ذخیره نمیشه. ممنون میشم راهنماییم کنید
static postData({
required String year,
required String field,
required String group,
required String price,
}) async {
Tariff tariff =
Tariff(year: year, field: field, group: group, price: price);
await http.post(Network.urlPost, body: tariff.toJson()).then((response) {});
}سلام به شما دوست عزیزم ، ببین اول از همه اینو بدون که شبیه ساز اندروید نمیتونه به localhost دسترسی داشته باشه و حتما باید از IP استفاده کنی ، بعد اینکه احتمالا اطلاعات رو اشتباه ارسال میکنی ! پیشنهاد میکنم یک بار با postman اطلاعات رو بگیری به صورت json و بعد تبدیل کنی به دارت ، یک jsonToDart null safety بزن داخل گوگل کلی سایت برات میاره و بعدش که کد های دارت رو گرفتی یک model بساز و کد هارو paste کن اونجا و در آخر ازشون استفاده کن !
اگر header هم نیاز بود به برنامه بده !
موفق باشی !