Display JSON data in Flutter - node.js

I want to display some data I am receiving from an API, this is the data I am receiving from my Node JS server:
[
{
"NAME": "Matematicas"
},
{
"NAME": "Naturales"
},
{
"NAME": "Ciencias Sociales"
},
{
"NAME": "Lenguaje"
},
{
"NAME": "Religion"
}
]
This is how I am receiving the data in my front end (UPDATED WITH #Mofidul Islam):
Future<List<Subject>> fetchSubject() async {
var url = Uri.http('localhost:8000', "/subjects");
var prefs = await SharedPreferences.getInstance();
var token = prefs.getString('token');
final response = await http.get(
Uri.parse('http://localhost:8000/subjects'),
headers: {'x-access-token': token!});
print(response.body);
List<dynamic> list = "[" + response.body + "]" as List<dynamic>;
List<Subject> subjectList = [];
list.forEach((element) {
subjectList.add(Subject.fromJson(element));
});
return subjectList;
}
This is the class to handle the incoming data (UPDATED WITH #Mofidul Islam):
class Subject {
final String name;
Subject({
required this.name,
});
factory Subject.fromJson(Map<String, dynamic> json) {
return Subject(name: json['NAME'] as String);
}
parseJson(String responseBody) {
final parsed = jsonDecode(responseBody).cast<Map<String, dynamic>>();
return parsed.map<Subject>((json) => Subject.fromJson(json)).toList();
}
}
This is my init state:
void initState() {
super.initState();
futureSubject = fetchSubject();
}
This is how I am trying to display the data:
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Materias',
theme: ThemeData(
primarySwatch: Colors.green,
),
home: Scaffold(
appBar: AppBar(
title: const Text('Materias'),
),
body: Center(
child: FutureBuilder<List<Subject>>(
future: futureSubject,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Column(
children: snapshot.data!
.map((subject) => Text(subject.name))
.toList(),
);
} else if (snapshot.hasError) {
return Text('${snapshot.error}');
}
return const CircularProgressIndicator();
},
),
),
),
);
}
However, the only thing being displayed when the page loads is:
Matematicas
I am trying to achieve 2 things:
Display the data in a list fashion like:
Subject Name
Matematicas
Naturales
Ciencias Sociales
Lenguaje Religion
Be able to use them as a link to another page when clicked
PD: If I remove the index access [0] on return Subject.fromJson(jsonDecode(response.body)[0]);
I get Expected a value of type Map<String, dynamic> but got one of type List<dynamic>
Any recommendations or guide on how to go through this?
Thank you for your time

You need to loop it
parseJson(String responseBody) {
final parsed = jsonDecode(responseBody).cast<Map<String, dynamic>>();
return parsed
.map<Subject>((json) => Subject.fromJson(json))
.toList();
}
and change your api call to this
Future<List<Subject>> fetchSubject() async {
.....
return parseJson(json.encode(response.body));
}
sorry for my english.

Please try this one and return List from api method
Future<List<Subject>> fetchSubject() async {
var url = Uri.http('localhost:8000', "/subjects");
var prefs = await SharedPreferences.getInstance();
var token = prefs.getString('token');
final response = await http.get(Uri.parse('http://localhost:8000/subjects'),
headers: {'x-access-token': token!});
List<dynamic>list=response.body as List<dynamic>;
List<Subject>subjectList=[];
list.forEach((element){
subjectList.add(Subject.fromJson(element));
});
return subjectList;
}
refactor UI like this
Center(
child: FutureBuilder<List<Subject>>(
future: futureSubject,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Column(children: snapshot.data.map((subject)=>Text(subject.name)).toList(),);
} else if (snapshot.hasError) {
return Text('${snapshot.error}');
}
return const CircularProgressIndicator();
},
),
)

Related

"There should be exactly one item with [DropdownButton]'s value: 1. \nEither zero or 2 or more [DropdownMenuItem]s were detected with the same value"

I have this code:
import 'dart:convert';
import 'package:hr_jobform/customColors.dart';
import 'package:http/http.dart' as http;
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class CitiesStateDropdownButton extends StatefulWidget {
const CitiesStateDropdownButton({super.key});
#override
State<CitiesStateDropdownButton> createState() =>
CitiesStateDropdownButtonState();
}
class CitiesStateDropdownButtonState
extends State<CitiesStateDropdownButton> {
#override
void initState() {
_getStatesList();
super.initState();
}
#override
Widget build(BuildContext context) {
return Wrap(children: <Widget>[
Padding(
padding: const EdgeInsets.fromLTRB(8, 15, 8, 8),
child: ConstrainedBox(
constraints: BoxConstraints.tight(const Size(219, 50)),
child: DropdownButton<String>(
value: _state,
iconSize: 30,
icon: (null),
style: TextStyle(
color: Palette.customColors,
fontSize: 16,
),
hint: Text('Select State'),
onChanged: (String? newValue) {
setState(() {
_state = newValue!;
_getCitiesList();
print(_state);
});
},
items: states?.map((item) {
return new DropdownMenuItem(
child: new Text(item['name']),
value: item['id'].toString(),
);
})?.toList() ??
[],
),
),
),
//======================================================== City
Wrap(
children: <Widget>[
Padding(
padding: const EdgeInsets.fromLTRB(8, 15, 8, 8),
child: ConstrainedBox(
constraints: BoxConstraints.tight(const Size(187, 50)),
child: DropdownButton<String>(
value: _city,
iconSize: 30,
icon: (null),
style: TextStyle(
color: Palette.customColors,
fontSize: 16,
),
hint: Text('Select City'),
onChanged: (String? newValue) {
setState(() {
_city = newValue!;
print(_city);
});
},
items: cities?.map((item) {
return new DropdownMenuItem(
child: new Text(item['name']),
value: item['id'].toString(),
);
})?.toList() ??
[],
),
),
),
],
),
]);
}
//=============================================================================== Api Calling here
//CALLING State API HERE
// Get Departamento information by API
late List states = [];
late String _state = '1';
String statesUrl =
"http://localhost:3000/states/getAllStates";
_getStatesList() async {
try {
http.Response response = await http.get(Uri.parse(statesUrl));
if (response.statusCode == 200) {
print(response.body);
var data = jsonDecode(response.body);
setState(() {
states = data['state'];
});
return jsonDecode(response.body);
} else {
return ("Server Error");
}
} catch (e) {
return print(e);
}
}
// Get Cities information by API
late List cities = [];
late String _city = '1';
_getCitiesList() async {
try {
http.Response response = await http.get(Uri.parse("http://localhost:3000/cities/getAllCities?id=$_state"));
if (response.statusCode == 200) {
print(response.body);
var data = jsonDecode(response.body);
setState(() {
cities = data['City'];
print(cities);
});
return jsonDecode(response.body);
} else {
return ("Server Error");
}
} catch (e) {
return print(e);
}
}
}
It runs well, but when i select one of the States on my dropdown list, the cities api call is successful as it appears on console, but the cities dropdown gives me this error:
Assertion failed:
items == null || items.isEmpty || value == null ||
items.where((DropdownMenuItem<T> item) {
return item.value == value;
}).length == 1
"There should be exactly one item with [DropdownButton]'s value: 1. \nEither zero or 2 or more [DropdownMenuItem]s were detected with the same value"
Please I've been struggling with this error for a couple of days now, I would appreciate if you can help me.
While using with future items from dropDown, use nullable value for DropdownButton.
String? _state;
String? _city;
And set Value on successful response only, otherwise set _city=null and _state = null
setState(() {
final List<String> items = data['City'].toList().toSet(); // trying to get unique value set
cities = items.toList();
_city = cities.first;
print(cities);
});
Do the same for others

Bug when trying to fetch data from node.js api to flutter

I have searched for a solution but couldn't find any, basically when I search for an account inside the app it shows up and looking fine but when I press it to get to the profile details screen it keeps loading and it seems to never get the data.
Below is the code for the response
import 'dart:convert';
ResponseUserSearch responseUserSearchFromJson(String str) => ResponseUserSearch.fromJson(json.decode(str));
String responseUserSearchToJson(ResponseUserSearch data) => json.encode(data.toJson());
class ResponseUserSearch {
ResponseUserSearch({
required this.resp,
required this.message,
required this.anotherUser,
required this.analytics,
required this.postsUser,
required this.isFriend,
required this.isPendingFollowers
});
bool resp;
String message;
AnotherUser anotherUser;
Analytics analytics;
List<PostsUser> postsUser;
int isFriend;
int isPendingFollowers;
factory ResponseUserSearch.fromJson(Map<String, dynamic> json) => ResponseUserSearch(
resp: json["resp"],
message: json["message"],
anotherUser: AnotherUser.fromJson(json["anotherUser"]),
analytics: Analytics.fromJson(json["analytics"]),
postsUser: List<PostsUser>.from(json["postsUser"].map((x) => PostsUser.fromJson(x))),
isFriend: json["is_friend"],
isPendingFollowers: json["isPendingFollowers"]
);
Map<String, dynamic> toJson() => {
"resp": resp,
"message": message,
"anotherUser": anotherUser.toJson(),
"analytics": analytics.toJson(),
"postsUser": List<dynamic>.from(postsUser.map((x) => x.toJson())),
"is_friend": isFriend,
"isPendingFollowers": isPendingFollowers
};
}
class Analytics {
Analytics({
required this.posters,
required this.friends,
required this.followers,
});
int posters;
int friends;
int followers;
factory Analytics.fromJson(Map<String, dynamic> json) => Analytics(
posters: json["posters"],
friends: json["friends"],
followers: json["followers"],
);
Map<String, dynamic> toJson() => {
"posters": posters,
"friends": friends,
"followers": followers,
};
}
class AnotherUser {
AnotherUser({
required this.uid,
required this.fullname,
required this.phone,
required this.image,
required this.cover,
required this.birthdayDate,
required this.createdAt,
required this.username,
required this.description,
required this.isPrivate,
required this.email,
});
String uid;
String fullname;
String phone;
String image;
String cover;
dynamic birthdayDate;
DateTime createdAt;
String username;
String description;
int isPrivate;
String email;
factory AnotherUser.fromJson(Map<String, dynamic> json) => AnotherUser(
uid: json["uid"],
fullname: json["fullname"],
phone: json["phone"] ?? '',
image: json["image"] ?? '',
cover: json["cover"] ?? '',
birthdayDate: DateTime.parse(json["birthday_date"] ?? '2021-10-22T20:17:53'),
createdAt: DateTime.parse(json["created_at"] ?? '2021-10-22T20:17:53'),
username: json["username"],
description: json["description"] ?? '',
isPrivate: json["is_private"],
email: json["email"],
);
Map<String, dynamic> toJson() => {
"uid": uid,
"fullname": fullname,
"phone": phone,
"image": image,
"cover": cover,
"birthday_date": birthdayDate,
"created_at": createdAt.toIso8601String(),
"username": username,
"description": description,
"is_private": isPrivate,
"email": email,
};
}
class PostsUser {
PostsUser({
required this.postUid,
required this.isComment,
required this.typePrivacy,
required this.createdAt,
required this.images
});
String postUid;
int isComment;
String typePrivacy;
DateTime createdAt;
String images;
factory PostsUser.fromJson(Map<String, dynamic> json) => PostsUser(
postUid: json["post_uid"],
isComment: json["is_comment"],
typePrivacy: json["type_privacy"],
createdAt: DateTime.parse(json["created_at"]),
images: json["images"],
);
Map<String, dynamic> toJson() => {
"post_uid": postUid,
"is_comment": isComment,
"type_privacy": typePrivacy,
"created_at": createdAt.toIso8601String(),
"images": images,
};
}
below is the profile page where I call that data
class ProfileAnotherUserPage extends StatefulWidget {
final String idUser;
const ProfileAnotherUserPage({Key? key, required this.idUser}) : super(key: key);
#override
State<ProfileAnotherUserPage> createState() => _ProfileAnotherUserPageState();
}
class _ProfileAnotherUserPageState extends State<ProfileAnotherUserPage> {
#override
Widget build(BuildContext context) {
return BlocListener<UserBloc, UserState>(
listener: (context, state) {
if( state is LoadingFollowingUser ){
modalLoading(context, 'Duke u ngarkuar...');
}else if( state is FailureUserState ){
Navigator.pop(context);
errorMessageSnack(context, state.error);
}else if( state is SuccessFollowingUser ){
Navigator.pop(context);
setState(() {});
}
},
child: Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
child: FutureBuilder<ResponseUserSearch>(
future: userService.getAnotherUserById(widget.idUser),
builder: (context, snapshot) {
return !snapshot.hasData
? const _LoadingDataUser()
: _BodyUser(responseUserSearch: snapshot.data!);
},
),
),
),
);
}
}
class _BodyUser extends StatelessWidget {
final ResponseUserSearch responseUserSearch;
const _BodyUser({ Key? key, required this.responseUserSearch }) : super(key: key);
#override
Widget build(BuildContext context) {
return ListView(
physics: const BouncingScrollPhysics(),
children: [
_CoverAndProfile(user: responseUserSearch.anotherUser),
const SizedBox(height: 10.0),
_UsernameAndDescription(user: responseUserSearch.anotherUser),
const SizedBox(height: 30.0),
_PostAndFollowingAndFollowers(analytics: responseUserSearch.analytics),
const SizedBox(height: 30.0),
_BtnFollowAndMessage(
isFriend: responseUserSearch.isFriend,
uidUser: responseUserSearch.anotherUser.uid,
isPendingFollowers: responseUserSearch.isPendingFollowers,
username: responseUserSearch.anotherUser.username,
avatar: responseUserSearch.anotherUser.image,
),
const SizedBox(height: 20.0),
Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
height: 46,
child: Column(
children: [
const Icon(Icons.grid_on_rounded, size: 30),
const SizedBox(height: 5.0),
Container(
height: 1,
color: Colors.grey[300],
)
],
),
),
const SizedBox(height: 5.0),
_ListFotosAnotherProfile(
posts: responseUserSearch.postsUser,
isPrivate: responseUserSearch.anotherUser.isPrivate,
isFriend: responseUserSearch.isFriend,
),
],
);
}
}
below is the backend code for this particular problem
export const getAnotherUserById = async (req: Request, res: Response): Promise<Response> => {
try {
const conn = await connect();
const [ userdb ] = await conn.query<RowDataPacket[]>(`CALL SP_GET_USER_BY_ID(?);`, [ req.params.idUser ]);
const posters = await conn.query<RowDataPacket[]>(' SELECT COUNT(person_uid) AS posters FROM posts WHERE person_uid = ?', [req.params.idUser]);
const friends = await conn.query<RowDataPacket[]>('SELECT COUNT(person_uid) AS friends FROM friends WHERE person_uid = ?', [req.params.idUser]);
const followers = await conn.query<RowDataPacket[]>('SELECT COUNT(person_uid) AS followers FROM followers WHERE person_uid = ?', [req.params.idUser]);
const posts = await conn.query<RowDataPacket[]>(`CALL SP_GET_POST_BY_IDPERSON(?);`, [req.params.idUser]);
const isFollowing = await conn.query<RowDataPacket[]>('CALL SP_IS_FRIEND(?,?);', [req.idPerson, req.params.idUser]);
const isPendingFollowers = await conn.query<RowDataPacket[]>(`CALL SP_IS_PENDING_FOLLOWER(?,?)`, [ req.params.idUser, req.idPerson ]);
conn.end();
return res.json({
resp: true,
message: 'Get Another User by id',
anotherUser: userdb[0][0],
analytics: {
'posters' : posters[0][0].posters,
'friends' : friends[0][0].friends,
'followers': followers[0][0].followers
},
postsUser: posts[0][0],
is_friend: isFollowing[0][0][0].is_friend,
isPendingFollowers: isPendingFollowers[0][0][0].is_pending_follower
});
} catch(err) {
return res.status(500).json({
resp: false,
message: err
});
}
}
This is the getAnotherUserById function
Future<ResponseUserSearch> getAnotherUserById(String idUser) async {
final token = await secureStorage.readToken();
final resp = await http.get(Uri.parse('${URLS.urlApi}/user/get-another-user-by-id/'+ idUser),
headers: { 'Accept': 'application/json', 'xxx-token': token! }
);
return ResponseUserSearch.fromJson(jsonDecode(resp.body));
}

How to send a notification for a specific token, flutter, firebase messaging and node.js

I am designing an application and in it I will have a notification system between clients after an onCreate event.
Here is my index.js code
const functions= require("firebase-functions");
const admin =require("firebase-admin");
admin.initializeApp();
var fcm = admin.messaging();
// Node.js e.g via a Firebase Cloud Function
exports.sendPush = functions.firestore.document('notifications/{notificationId}').onCreate((change, context)=>{
const chauffeur = change.after.data().chauffeur;
const date_reception = change.after.data().date_reception;
const send_name = change.after.data().send_name;
const token = change.after.data().token;
console.log('chauffeur' + chauffeur);
console.log('date_reception' + date_reception);
console.log('send_name' + send_name);
console.log('token' + token);
const payload = {
notification:{
title: 'New message',
body: 'Message reçu de' + chauffeur,
sound: "default",
},
data:{
'chauffeur':chauffeur,
'date_reception': date_reception,
'send_name': send_name,
},
}
return admin.messaging().sendToDevice(token, payload);
});
et mon code dart&flutter
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
Future<void> _messageHandler(RemoteMessage message) async {
print('background message ${message.notification!.body}');
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseMessaging.onBackgroundMessage(_messageHandler);
runApp(MessagingTutorial());
}
class MessagingTutorial extends StatelessWidget {
static const String idScreen = "note";
#override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Firebase Messaging',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Firebase Messaging'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, this.title}) : super(key: key);
final String? title;
#override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late FirebaseMessaging messaging;
String? notificationText;
#override
void initState() {
super.initState();
messaging = FirebaseMessaging.instance;
messaging.getToken().then((value) {
print(value);
});
FirebaseMessaging.onMessage.listen((RemoteMessage event) {
RemoteNotification? notification = event.notification;
AndroidNotification? androidNotification = event.notification!.android;
print("message recieved");
print(event.notification!.body);
print(event.data.values);
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("Notification ${event.data['title']}"),
content: Text(event.notification!.body!),
actions: [
Row(children: [
TextButton(
child: Text("Annuler"),
onPressed: () {
Navigator.of(context).pop();
},
),
TextButton(
child: Text("Ok"),
onPressed: () {
Navigator.of(context).pop();
},
)
])
],
);
});
});
FirebaseMessaging.onMessageOpenedApp.listen((message) {
print('Message clicked!');
});
}
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title!),
),
body: Center(child: Text("Messaging Tutorial")),
);
}
}
The problem is, when I save in my "notifications" collection, the notification doesn't show even in the background, not even in forground.
After saving in the collection, the number of uses of the function increases but no effect in the application.
usage for the function
When I send the test message from firebase cloud messaging, everything is working fine
Cloud messaging test
I don't know how to fix this, if anyone can help me i would be very happy.
Thank you
There could be a lot of points that fail here. The cold start could cause that you don't wait enought for the notification. When your App is open it won't show anything if you havend written code for it to handle messages while in focus. You could have an outdated notification token. Do you update it on your database?
Can you try it with this shema of the payload to:
const payload = {
notification: {
title: "title",
body: "body",
},
webpush: {
notification: {
title: "title",
body: "body",
},
},
data: {
test: 'test',
},
}

How to update the values using NodeJS API

I created a user profile screen, where user can also edit the fields by clicking on edit button, it will appear a popup dialogue where i display the fields which are allowed to edit. And I am using API which i create it using NodeJS to update that fields, it is working, values are updating.
Problem:
There are 5 fields in edit dialogue box (email, phoneNo, address, education and martialstatus), but if user only want to edit the education field, and want rest field remain same, and when user click on update change button where i call the api, it only update the that field which is edited and update the other field to null, because it gets null value from the field controller (i am passing the textfield controller to api body parameter).
Solution which i think:
It can be done using conditions (if-else) to handle the null value, by passing the old values which i am getting using shared preference, but it will be not efficient, because there are 5 fields yet, but if in future if edit fields number increase, then more condition (checks) will be needed.
here is backend api code:
updateprofile = (req,res)=>{
jwt.verify(req.body.token, 'secret' , function(err, decoded) {
if(err) {
err["expiredAt"] = err["expiredAt"].toLocaleString();
res.status(300).json(err)
}
else
{
User.find({"username":req.body.username,_id: req.body.id},function(err,data){
console.log(req.body)
User.updateOne({"username":req.body.username, _id: req.body.id}, {"email":req.body.email,"education":req.body.education,"PhoneNo":req.body.PhoneNo,"address":req.body.address,"martialstatus":req.body.martialstatus},function(err,dat){
if(err)
res.json("You Last login Yesterday");
else
{
var token = jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: "30 minute"})
res.status(200).json({auth: true, AccessToken: token,email:req.body.email,education:req.body.education,phone:req.body.PhoneNo,address:req.body.address,martialstatus:req.body.martialstatus})
}
})})
}})}
here is edit dialogue and shared preference code:
String getname="";
String getemail="";
String getdesignation="";
String getType="";
String getId="";
String getToken="";
String getEducation="";
String getPhone="";
String getMartialStatus="";
String getAddress="";
String getDob="";
_userDetails() async{
SharedPreferences myPrefs=await SharedPreferences.getInstance();
setState(() {
getname=myPrefs.getString('name');
getemail=myPrefs.getString('email');
getdesignation=myPrefs.getString('designation');
getType=myPrefs.getString('type');
getId=myPrefs.getString('UserId');
getToken=myPrefs.getString('accesstoken');
getPhone=myPrefs.getString('phone');
getEducation=myPrefs.getString('education');
getMartialStatus=myPrefs.getString('martialstatus');
getAddress=myPrefs.get('address');
getDob=myPrefs.get('DOB');
});
}
_displayTextInputDialog(BuildContext context) {
return showDialog(
context: context,
builder: (context) {
return
Center(child:
Column(children: <Widget>[
AlertDialog(
title: Text('Profile Edit'),
content: Column(children: <Widget>[
TextField(
onChanged: (value) {
setState(() {
valueText = value;
});
},
controller: email,
decoration: InputDecoration(hintText: getemail,icon: Icon(Icons.email)),
),
TextField(
onChanged: (value) {
setState(() {
valueText = value;
});
},
controller: phone,
decoration: InputDecoration(hintText: getPhone,icon: Icon(Icons.phone)),
),
TextField(
onChanged: (value) {
setState(() {
valueText = value;
});
},
controller: address,
decoration: InputDecoration(hintText: getAddress,icon: Icon(Icons.location_on)),
),
TextField(
onChanged: (value) {
setState(() {
valueText = value;
});
},
controller: education,
decoration: InputDecoration(hintText: getEducation,icon: Icon(Icons.library_books)),
),
TextField(
onChanged: (value) {
setState(() {
valueText = value;
});
},
controller: martialstatus,
decoration: InputDecoration(hintText: getMartialStatus,icon: Icon(Icons.group)
),
)],),
actions: <Widget>[
FlatButton(
color: Colors.green,
textColor: Colors.white,
child: Text('Update Changes'),
onPressed: () {
setState(() {
valuebutton = valueText;
updateProfile(); //here calling the api function to udpate the values
Navigator.pop(context);
});
},
),
],)
],
));
});
}
here i'm using api and calling the function on update changes button
Dio dio = new Dio();
var data={};
Future updateProfile() async {
try{
var data={
"username":getname,
"id":getId,
"token":getToken,
"email":email.text,
"PhoneNo":phone.text,
"martialstatus":martialstatus.text,
"address":address.text,
"education":education.text
}; dio
.post(localHostUrlUpdateProfile, data: json.encode(data))
.then((onResponse) async {
showDialog(context: context,
builder: (BuildContext context){
return AdvanceCustomAlert(
title: "Profile Updated",
descriptions:"Profile is updated successfully!",icon: Icons.check,
bgcolor: Colors.green,
fgcolor: Colors.green,);
}
);
});}
catch (e) {
print("error");
bool checkStatus =
OSError.noErrorCode == 113 || OSError.noErrorCode == 101;
print(checkStatus);
print(OSError.noErrorCode == 113);
if (e is DioError) {
print(e.response);
}
if (checkStatus == false) {
print("con er");
showDialog(
context: context,
builder: (BuildContext context) {
return AdvanceCustomAlert(
title: "Connection Error",
descriptions: "An unknown network error occured.",
icon: Icons.error,
bgcolor: Colors.red,
fgcolor: Colors.red,
);
});
}
}
}
hope all clear, please help if anyone know how to do this.
i just reduced the condition logic to this
if(email.text==""){
email.text=getemail;
}
if(phone.text==""){
phone.text=getPhone;
}
education.text=getEducation;
}
if(address.text==""){
address.text=getAddress;
}
if(martialstatus.text==""){
martialstatus.text=getMartialStatus;
}
it is working, would appreciate if someone know the better solution than this.

Flutter JSON data issue

I'm facing issue to fetch json data from Flutter mobile app.
Code as follow:
import 'package:flutter/material.dart';
import 'package:flutter_app/pages/main_page.dart';
class App extends StatelessWidget
{
#override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: "Flutter NodeJS",
home: MainPage(),
);
}
}
void main(){
runApp(App());
}
main_page.dart
import 'package:flutter/material.dart';
import 'package:flutter_app/modules/http.dart';
import 'package:flutter_app/pages/add_user_page.dart';
class MainPage extends StatefulWidget
{
#override
State<StatefulWidget> createState() {
return MainPageState();
}
}
class User
{
String id;
String first_name,email;
User(this.id, this.first_name,this.email);
}
class MainPageState extends State<MainPage>
{
List<User> users = [];
Future<void> refreshUsers()async{
var result = await http_get('users');
if(result.ok)
{
setState(() {
users.clear();
var in_users = result.data as List<dynamic>;
in_users.forEach((in_user){
users.add(User(
in_user['id'].toString(),
in_user['first_name'],
in_user['email']
));
});
});
}
}
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Users"),
//email: Text("Email"),
actions: <Widget>[
IconButton(
icon: Icon(Icons.add),
onPressed: (){
Navigator.of(context).push(MaterialPageRoute(
builder: (context){
return AddUserPage();
}
));
},
)
],
),
body: RefreshIndicator(
onRefresh: refreshUsers,
child: ListView.separated(
itemCount: users.length,
itemBuilder: (context, i) => ListTile(
leading: Icon(Icons.person),
title: Text(users[i].first_name+"\n" + users[i].email),
//email: Text(users[i].email),
),
separatorBuilder: (context, i) => Divider(),
),
),
);
}
}
http.dart
import 'dart:convert';
import "package:http/http.dart" as http;
class RequestResult
{
bool ok;
dynamic data;
RequestResult(this.ok, this.data);
}
//'https://jsonplaceholder.typicode.com/users/1
//http://192.168.183.179:8081/api/users/
const PROTOCOL = "http";
const DOMAIN = "https://jsonplaceholder.typicode.com/users/1";
Future<RequestResult> http_get(String route, [dynamic data]) async
{
var dataStr = jsonEncode(data);
var url = "$PROTOCOL://$DOMAIN/$route?data=$dataStr";
var result = await http.get(url);
return RequestResult(true, jsonDecode(result.body));
}
Future<RequestResult> http_post(String route, [dynamic data]) async
{
var url = "$PROTOCOL://$DOMAIN/$route";
var dataStr = jsonEncode(data);
var result = await http.post(url, body: dataStr, headers:{"Content-Type":"application/json"});
return RequestResult(true, jsonDecode(result.body));
}
When I'm fetch json data from "https://jsonplaceholder.typicode.com/users/1". Its working fine.
enter image description here
When I try to fetch json data from "https://192.168.183.179:8081/api/users". Its give error:
at Object.createErrorWithStack (http://localhost:15340/dart_sdk.js:4348:12)
at Object._rethrow (http://localhost:15340/dart_sdk.js:37892:16)
at async._AsyncCallbackEntry.new.callback (http://localhost:15340/dart_sdk.js:37886:13)
at Object._microtaskLoop (http://localhost:15340/dart_sdk.js:37718:13)
at _startMicrotaskLoop (http://localhost:15340/dart_sdk.js:37724:13)
at http://localhost:15340/dart_sdk.js:33243:9
What I'm doing wrong
Regards,
SAO
Check in Postman whether the ip address is returning data.
Another case would be the data obtained, could not be transffered correctly to the app. Check the variables and types where the data is stored.

Resources