#mysql #flutter #dart
Вопрос:
Данные с сервера mysql не отображаются автоматически в моем приложении, когда я заполняю форму для ввода данных из своего приложения и возвращаюсь на страницу… Но если я снова войду в систему или выполню горячую перезагрузку, данные будут отражены, и я не уверен, где добавить setState({}) и что в нем написать, поэтому, пожалуйста, скажите мне, как автоматически обновить мой список………
import 'dart:convert';
import 'package:finance_returns/Screens/Admin/AdminLogin.dart';
import 'package:finance_returns/Screens/Admin/CreateUser.dart';
import 'package:finance_returns/constants.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:http/http.dart' as http;
class AdminDashboard extends StatefulWidget {
@override
_AdminDashboardState createState() => _AdminDashboardState();
}
class _AdminDashboardState extends State<AdminDashboard> {
Future getData() async {
var url = Uri.parse('http://$ip/EmployeesDB/admin/read.php');
var response = await http.get(url);
return json.decode(response.body);
}
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Dashboard'),
actions: <Widget>[
IconButton(
icon: Icon(FontAwesomeIcons.signOutAlt),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AdminLogin(),
),
);
})
],
),
floatingActionButton: Container(
margin: EdgeInsets.only(bottom: 10),
child: FloatingActionButton.extended(
backgroundColor: kPrimaryColor,
onPressed: () {
Navigator.push( context, MaterialPageRoute( builder: (context) => Register()), ).then((list) => setState);
},
icon: Icon(
Icons.add,
),
label: Text("User"))),
body: FutureBuilder(
future: getData(),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
return snapshot.hasData
? ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
List list = snapshot.data;
return ListTile(
//leading: GestureDetector(
//child: Icon(Icons.mode_edit_outline),
onTap: () {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => Register(
list: list,
index: index,
),
),
);
debugPrint('Edit Clicked');
},
//),
title: Text(list[index]['username']),
subtitle: Text(list[index]['level']),
trailing: GestureDetector(
child: Icon(Icons.delete),
onTap: () {
setState(() {
var url =
Uri.parse('http://$ip/EmployeesDB/admin/delete.php');
http.post(url, body: {
'id': list[index]['id'],
});
});
debugPrint('delete Clicked');
},
),
);
})
: CircularProgressIndicator();
},
)
);
}
}
Это страница регистрации:
import 'dart:convert';
import 'package:finance_returns/Screens/Admin/AdminDashboard.dart';
import 'package:finance_returns/components/text_field_container.dart';
import 'package:finance_returns/constants.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http;
class Register extends StatefulWidget {
final List list;
final int index;
Register({this.list, this.index});
@override
_RegisterState createState() => _RegisterState();
}
class _RegisterState extends State<Register> {
TextEditingController name = TextEditingController();
TextEditingController user = TextEditingController();
TextEditingController pass = TextEditingController();
TextEditingController level = TextEditingController();
bool editMode = false;
Future addUpdateData() async {
if (editMode) {
var url = Uri.parse("http://$ip/EmployeesDB/admin/edit.php");
http.post(url, body: {
'id': widget.list[widget.index]['id'],
"name": name.text,
"username": user.text,
"password": pass.text,
"level": level.text,
});
} else {
var url = Uri.parse("http://$ip/EmployeesDB/admin/user_register.php");
var response = await http.post(url, body: {
"name": name.text,
"username": user.text,
"password": pass.text,
"level": level.text,
});
var data = json.decode(response.body);
if (data == "Error") {
Fluttertoast.showToast(
msg: "This user already exists!",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIosWeb: 1,
backgroundColor: Colors.red,
textColor: Colors.white,
fontSize: 16.0);
} else {
Fluttertoast.showToast(
msg: "Successfully registered",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIosWeb: 1,
backgroundColor: Colors.green,
textColor: Colors.white,
fontSize: 16.0);
// Navigator.pop(
// context,
// MaterialPageRoute(
// builder: (context) => AdminDashboard(),
// ),
// );
}
}
}
@override
void initState() {
super.initState();
if (widget.index != null) {
editMode = true;
name.text = widget.list[widget.index]['name'];
user.text = widget.list[widget.index]['username'];
pass.text = widget.list[widget.index]['password'];
level.text = widget.list[widget.index]['level'];
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
'Create/Update Users',
style: TextStyle(fontWeight: FontWeight.bold),
),
),
body: SingleChildScrollView(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextFieldContainer(
child: TextField(
decoration: InputDecoration(
labelText: 'Name',
icon: Icon(
Icons.person,
color: kPrimaryColor,
),
border: InputBorder.none,
),
controller: name,
),
),
TextFieldContainer(
child: TextField(
decoration: InputDecoration(
labelText: 'Email id',
icon: Icon(
Icons.person,
color: kPrimaryColor,
),
border: InputBorder.none,
),
controller: user,
),
),
TextFieldContainer(
child: TextField(
obscureText: true,
decoration: InputDecoration(
labelText: 'Password',
icon: Icon(
Icons.lock,
color: kPrimaryColor,
),
border: InputBorder.none,
),
controller: pass,
),
),
TextFieldContainer(
child: TextField(
decoration: InputDecoration(
labelText: 'level (eg:member,admin,HR)',
icon: Icon(
Icons.person,
color: kPrimaryColor,
),
border: InputBorder.none,
),
controller: level,
),
),
MaterialButton(
color: kPrimaryColor,
child: Text(editMode ? 'Update' : 'Create',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.white)),
onPressed: () {
setState(() {
addUpdateData();
});
Navigator.pop(
context,
MaterialPageRoute(
builder: (context) => AdminDashboard(),
),
);
debugPrint('Clicked Button Button');
},
),
],
),
),
),
);
}
}
Ответ №1:
Я думаю, что вы выполняете навигацию перед получением данных, и это состояние setState обновляет состояние текущей страницы, а не предыдущей. Попробуйте это:
onPressed: () async {
await addUpdateData();
}
и на первой странице:
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Register(
list: list,
index: index,
),
),
).then((_) => setState(() {});
Комментарии:
1. Спасибо, я попробую это сделать
2. Спасибо, парень,ваше решение сработало,и нового созданного пользователя можно увидеть, но есть еще одна проблема, но на моей странице панели мониторинга я отображаю уровень пользователя, например, HR, администратор и т. Д. Внутри подзаголовка, Но если я отредактирую это через приложение, это не будет отражено на странице панели мониторинга
3. да, это так, потому что, если я создаю новые данные, они отражаются, однако, если я редактирую некоторые пользовательские данные, они обновляются в базе данных, но не на экране