данные не отображаются в приложении из базы данных, когда я ввожу новые данные и возвращаюсь на эту страницу

#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. да, это так, потому что, если я создаю новые данные, они отражаются, однако, если я редактирую некоторые пользовательские данные, они обновляются в базе данных, но не на экране