Я использую флаттер, в настоящее время я извлекаю данные из моей базы данных, используя PHP. Я использую запрос выбора в PHP, чтобы извлечь все данные из указанной таблицы c, используя идентификатор, который я сохранил из переменной SharedPreference, с которой эта часть работает нормально.
Проблема, с которой я сталкиваюсь сейчас, заключается в том, что когда я загружаю страницу, чтобы она могла извлекать данные прямо при загрузке приложения, я хочу вставить содержимое определенного столбца c, который я получаю из базы данных в карту, которая находится внутри ListView, что делает его списком виджетов карт, при извлечении данных, которые он запрашивает, он возвращает список, но создает внутри карточных виджетов количество карточек, которые повторяют содержимое списка за карту, но многократно, и я не понимаю, почему это происходит. Я хотел бы знать, может ли кто-нибудь помочь мне с этой ошибкой, с которой я столкнулся. Я хочу, чтобы выходные данные содержали содержимое списка, который я объявил в классе Pref (). Выше в строке 106 я разместил оператор печати, когда он показывает, что данные из базы данных передаются и правильно вставляются в список.
Ниже я приложил свой код и снимки экрана с данными о том, сколько раз это извлекается и снимок экрана того, как это выглядит на моем устройстве.
[Скриншот моего устройства.] [1]
import 'package:flutter/material.dart';
import 'package:huna/bookings.dart';
import 'package:huna/dashboard.dart';
import 'package:huna/login.dart';
import 'package:huna/payment.dart';
import 'package:huna/feedback.dart';
import 'package:huna/favorites.dart';
import 'package:huna/messages.dart';
import 'package:huna/secondaryPages/myProfileSettings.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
void main() => runApp(MyProfile());
class MyProfile extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'HUNA',
theme: ThemeData(
primaryColor: Colors.grey.shade900,
primarySwatch: Colors.blueGrey,
),
home: MyProfilePage(),
);
}
}
class MyProfilePage extends StatefulWidget {
@override
_MyProfileState createState() => _MyProfileState();
}
class Pref {
String username;
String fName;
String lName;
String id;
List <String> feedBackMap;
int count;
Pref({this.username, this.id, this.count, this.fName, this.lName, this.feedBackMap});
}
Pref p = new Pref();
final children = <Widget>[];
class _MyProfileState extends State<MyProfilePage> {
@override
void initState() {
getData();
super.initState();
}
SharedPreferences _pref;
void updatedPreferences(SharedPreferences preference){
setState(() {
return this._pref = preference;
});
}
Future<Pref> getPref(Pref p) async{
SharedPreferences preferences = await SharedPreferences.getInstance();
setState(() {
p.id = preferences.getString('id');
p.username = preferences.getString("username");
});
return p;
}
Future getData() async{
getPref(p);
final response = await http.post("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", body: {
"id": p.id
});
if(response.statusCode == 200){
final data = jsonDecode(response.body);
p.count = data.length;
print(p.count.toString());
print(data.length.toString());
p.feedBackMap = new List <String>();
for(int i = 0; i < data.length; i++){
p.feedBackMap.add(data[i]['content']);
}
print(p.feedBackMap);
}
}
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.grey.shade900,
appBar: AppBar(
title: Text('Profile'),
elevation: 0,
actions: <Widget>[
IconButton(
icon: Icon(Icons.settings),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => MyProfileSettings()),
);
},
),
],
),
drawer: Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: <Widget>[
UserAccountsDrawerHeader(
accountName: Text('John Smith'),
accountEmail: Text(p.username), //Use Username Instead
currentAccountPicture: CircleAvatar(
backgroundImage: AssetImage('assets/images/profile.jpg'),
),
onDetailsPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => MyProfile()),
);
},
),
ListTile(
leading: Icon(Icons.home),
title: Text('Dashboard'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Dashboard()),
);
}),
ListTile(
leading: Icon(Icons.date_range),
title: Text('Bookings'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Bookings()),
);
}),
ListTile(
leading: Icon(Icons.question_answer),
title: Text('Messages'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Messages()),
);
}),
ListTile(
leading: Icon(Icons.favorite),
title: Text('Favorites'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Favorites()),
);
}),
ListTile(
leading: Icon(Icons.credit_card),
title: Text('Payment'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Payment()),
);
}),
Divider(),
ListTile(
leading: Icon(Icons.info),
title: Text('About Us'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => FeedbackPage()),
);
}),
ListTile(
leading: Icon(Icons.exit_to_app),
title: Text('Logout'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => LoginPage()),
);
}),
],
),
),
body: StudentProfileWidget(),
);
}
}
class StudentProfileWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
for(int i = 0; i < p.count; i++){
children.add(
Card(
child: ListTile(
contentPadding: EdgeInsets.all(20),
subtitle: Text(
p.feedBackMap[i],
),
isThreeLine: true,
),
),);
}
return Stack(
children: <Widget>[
Container(
margin: EdgeInsets.only(top: 180),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(35),
topRight: Radius.circular(35),
),
),
),
Container(
padding: EdgeInsets.only(),
child: Align(
alignment: Alignment.topCenter,
child: Column(
children: <Widget>[
CircleAvatar(
radius: 40,
backgroundImage: AssetImage('assets/images/profile.jpg'),
),
SizedBox(height: 20),
// Profile Text
Center(
child: Text(
' ',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.white),
),
),
Center(
child: Text(
p.username,
style: TextStyle(color: Colors.white70),
),
),
SizedBox(height: 20),
// Location
Padding(
padding: const EdgeInsets.only(left: 25.0, right: 25.0),
child: Row(
children: <Widget>[
Icon(
Icons.location_on,
color: Colors.white,
size: 15,
),
Text(
' Cebu City, Philippines',
style: TextStyle(color: Colors.white, fontSize: 12),
),
],
),
),
// Reviews and Average Star Ratings
Padding(
padding: const EdgeInsets.only(
left: 25.0, top: 30.0, right: 25.0, bottom: 10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
// Reviews Label
Text(
'Reviews',
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
// Average Star Ratings
Container(
child: Row(
children: <Widget>[
Icon(Icons.star, size: 20),
Icon(Icons.star, size: 20),
Icon(Icons.star, size: 20),
Icon(Icons.star, size: 20),
Icon(Icons.star, size: 20),
],
),
),
],
),
),
Expanded(
child: ListView(
shrinkWrap: true,
padding: EdgeInsets.all(15),
children: children,
),
),
],
),
),
),
],
);
}
}
[1]: https://i.stack.imgur.com/oj4Wp.jpg