Home > front end >  The method 'setState' isn't defined for the type 'NasabahDataTableSource'
The method 'setState' isn't defined for the type 'NasabahDataTableSource'

Time:05-20

I want to use setState method in class "NasabahDataTableSource" but when i use setState in this class cannot work and Error: The method 'setState' isn't defined for the class 'NasabahDataTableSource'.

  • 'NasabahDataTableSource' is from 'package:flutter_auth/screens/Menu/DataNasabah/datanasabah.dart' ('lib/screens/Menu/DataNasabah/datanasabah.dart'). Try correcting the name to the name of an existing method, or defining a method named 'setState'. setState(() { ^^^^^^^^

This is mystatefullwidget.

class DataNasabah extends StatefulWidget {
  @override
  _DataNasabahState createState() => _DataNasabahState();
}

class _DataNasabahState extends State<DataNasabah> {
  String nama_debitur = '';
  List<Nasabah> _nasabah = [];


  @override
  void initState() {
    super.initState();
    _loadUserData();
    _getNasabah();
  }

  _loadUserData() async {
    SharedPreferences localStorage = await SharedPreferences.getInstance();
    var user = jsonDecode(localStorage.getString('user'));

    if (user != null) {
      setState(() {
        nama_debitur = user['nama_debitur'];
      });
    }
  }

  _getNasabah() {
    NasabahService.getUser().then((nasabah) {
      if (mounted) {
        setState(() {
          _nasabah = nasabah;
        });
      }
    });
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: Text('Data Nasabah'),
        backgroundColor: Color(0xff151515),
        // automaticallyImplyLeading: false,
      ),
      body: SingleChildScrollView(
        child: PaginatedDataTable(
          rowsPerPage: 10,
          columns: [
            DataColumn(
              label: Expanded(
                  child: Text(
                'ID Nasabah',
                textAlign: TextAlign.center,
              )),
            ),
            DataColumn(
              label: Expanded(
                  child: Text(
                'Nama Nasabah',
                textAlign: TextAlign.center,
              )),
            ),
            DataColumn(
              label: Expanded(
                  child: Text(
                'Aksi',
                textAlign: TextAlign.center,
              )),
            ),
          ],
          source: NasabahDataTableSource(userData: _nasabah, context: context),
        ),
      ),
    );
  }
}

I want to use setState method in this class.but cann't use.I comment setState place

class NasabahDataTableSource extends DataTableSource {
  BuildContext context;
  NasabahDataTableSource({this.context, this.userData});
  final List<Nasabah> userData;

  @override
  DataRow getRow(int index) {
    return DataRow.byIndex(
      index: index,
      cells: [
        DataCell(Align(
            alignment: Alignment.center,
            child: Text(
              "${userData[index].id}",
            ))),
        DataCell(Align(
          alignment: Alignment.center,
          child: Text("${userData[index].nama_debitur}"),
        )),
        DataCell(
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              IconButton(
                icon: Icon(Icons.navigate_next),
                color: Colors.blueAccent,
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) =>
                          DetailNasabah(
                            nasabah: userData[index],
                          ),
                    ),
                  );
                },
              ),
              IconButton(
                icon: Icon(Icons.delete),
                color: Colors.red,
                onPressed: () {
                  showDialog(
                    context: context,
                    builder: (context) =>
                        AlertDialog(
                          title: Text('Hapus Data Nasabah'),
                          content: Text(
                              'Apakah anda yakin ingin menghapus data nasabah ini?'),
                          actions: [
                            TextButton(
                                child: Text('Yes'),
                                onPressed: () {
                                  NasabahService.deleteUser(userData[index].id);
                                  setState(() {
                                    //Cann't use
                                  });
                                })
                          ],
                        ),
                  );
                },
              )
            ],
          ),
        ),
      ],
    );
  }

i haven't find that solution. Please help.

CodePudding user response:

You can not use setState() without StatefulWidget. I suggest you to use Function to pass your action and notify to rebuild UI using setState(). Need little bit modification on your code.

  1. Add Function parameter to your NasabahDataTableSource.
Function onUserDeleted;
  1. Modify your NasabahDataTableSource constructor.
NasabahDataTableSource({required this.context,required this.userData,required this.onUserDeleted}); // modify your constructor
  1. Replace setState by onUserDeleted inside onPressed.
onUserDeleted(); // call onUserDeleted
//setState(() {
       //Cann't use
//});

NasabahDataTableSource full code.

class NasabahDataTableSource extends DataTableSource {
  BuildContext context;
  Function onUserDeleted; // add onUserDeleted function
  final List<Nasabah> userData;
  NasabahDataTableSource({required this.context,required this.userData,required this.onUserDeleted}); // modify your constructor

  @override
  DataRow getRow(int index) {
    return DataRow.byIndex(
      index: index,
      cells: [
        DataCell(Align(
            alignment: Alignment.center,
            child: Text(
              "${userData[index].id}",
            ))),
        DataCell(Align(
          alignment: Alignment.center,
          child: Text("${userData[index].nama_debitur}"),
        )),
        DataCell(
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              IconButton(
                icon: Icon(Icons.navigate_next),
                color: Colors.blueAccent,
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) =>
                          DetailNasabah(
                            nasabah: userData[index],
                          ),
                    ),
                  );
                },
              ),
              IconButton(
                icon: Icon(Icons.delete),
                color: Colors.red,
                onPressed: () {
                  showDialog(
                    context: context,
                    builder: (context) =>
                        AlertDialog(
                          title: Text('Hapus Data Nasabah'),
                          content: Text(
                              'Apakah anda yakin ingin menghapus data nasabah ini?'),
                          actions: [
                            TextButton(
                                child: Text('Yes'),
                                onPressed: () {
                                  NasabahService.deleteUser(userData[index].id);
                                  onUserDeleted(); // call onUserDeleted
                                  //setState(() {
                                    //Cann't use
                                  //});
                                })
                          ],
                        ),
                  );
                },
              )
            ],
          ),
        ),
      ],
    );
  }
  1. Modify your DataNasabah source by adding onUserDeleted and call setState
source: NasabahDataTableSource(
                    userData: _nasabah,
                    context: context,
                    onUserDeleted:(){
                      setState((){}); // add setState
                    }),

DataNasabah full code.

class DataNasabah extends StatefulWidget {
  @override
  _DataNasabahState createState() => _DataNasabahState();
}

class _DataNasabahState extends State<DataNasabah> {
  String nama_debitur = '';
  List<Nasabah> _nasabah = [];


  @override
  void initState() {
    super.initState();
    _loadUserData();
    _getNasabah();
  }

  _loadUserData() async {
    SharedPreferences localStorage = await SharedPreferences.getInstance();
    var user = jsonDecode(localStorage.getString('user'));

    if (user != null) {
      setState(() {
        nama_debitur = user['nama_debitur'];
      });
    }
  }

  _getNasabah() {
    NasabahService.getUser().then((nasabah) {
      if (mounted) {
        setState(() {
          _nasabah = nasabah;
        });
      }
    });
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: Text('Data Nasabah'),
        backgroundColor: Color(0xff151515),
        // automaticallyImplyLeading: false,
      ),
      body: SingleChildScrollView(
        child: PaginatedDataTable(
          rowsPerPage: 10,
          columns: [
            DataColumn(
              label: Expanded(
                  child: Text(
                'ID Nasabah',
                textAlign: TextAlign.center,
              )),
            ),
            DataColumn(
              label: Expanded(
                  child: Text(
                'Nama Nasabah',
                textAlign: TextAlign.center,
              )),
            ),
            DataColumn(
              label: Expanded(
                  child: Text(
                'Aksi',
                textAlign: TextAlign.center,
              )),
            ),
          ],
          source: NasabahDataTableSource(
                    userData: _nasabah,
                    context: context,
                    onUserDeleted:(){
                      setState((){}); // add setState
                    }),
        ),
      ),
    );
  }
}

CodePudding user response:

you cant setstate in NasabahDataTableSource because not extends StatefulWidget. only stateful who can setstate. but you can change variable without setstate using getx in stateless.

  • Related