Home > other >  Switch Button not toggle flutter
Switch Button not toggle flutter

Time:09-21

hope all are doing well
i use a Switch Button in popup Form when pressing the floating action Button but its not working or the UI not updated when i pressed the Switch Button

I used it in a StatefulWidget but its not toggle until i press hot reload,if there any Suggestion please

here where i use the Switch :

void _openAlbumsDialog() {
    showDialog(
        context: context,
        builder: (ctx) => AlertDialog(
              title: const Text('Add an Album'),
              content: Padding(
                padding: const EdgeInsets.all(8.0),
                child: Form(
                  key: _form,
                  child: Column(
                    mainAxisSize: MainAxisSize.min,
                    children: [
                      TextFormField(
                        initialValue: _albumInitValues['name'],
                        decoration: InputDecoration(
                          helperText: 'Album Name',
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(15),
                          ),
                        ),
                        textInputAction: TextInputAction.next,
                        onSaved: ((newValue) {
                          _editedALbum = Album(
                            albumId: DateTime.now().toString(),
                            albumName: newValue!,
                            albumLinks: _editedALbum.albumLinks,
                          );
                        }),
                        validator: (value) {
                          if (value!.isEmpty) {
                            return 'Please insert a Value';
                          } else {
                            return null;
                          }
                        },
                      ),
                      const SizedBox(
                        height: 10,
                      ),
                      Row(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: [
                          const Text('Private'),

                          Consumer<Album>(
                            builder: (context, value, child) => Switch.adaptive(
                              mouseCursor: MouseCursor.uncontrolled,
                              value: _isPrivate,
                              onChanged: (value) {
                                final albumProvider =
                                    Provider.of<Album>(context, listen: false);

                                albumProvider.togglePrivateAlbum();

                                setState(() {
                                  _isPrivate = value;
                                });
                              },
                            ),
                          ),
              actions: [
                TextButton(
                    onPressed: () {
                      FocusScope.of(context).unfocus();
                      _isLoading
                          ? const Center(
                              child: CircularProgressIndicator(),
                            )
                          : _saveAlbumFOrm();
                    },
                    child: const Text('Save'))
              ],
            ));
  }

  @override
  Widget build(BuildContext context) {
    return SpeedDial(
      children: [
        SpeedDialChild(
          child: const Icon(Icons.folder),
          backgroundColor: Colors.green,
          foregroundColor: Colors.white,
          label: 'Add a new Album',
          labelStyle: const TextStyle(fontSize: 12.0),
          onTap: _openAlbumsDialog,
        ),
       
      ],
    );
  }
}

void togglePrivate in Album Provider:

 void togglePrivateAlbum() {
    isPrivate = !isPrivate;
  }

CodePudding user response:

It happens so because you have to recreate your own StatefulBuilder(), so wrap your showDialog() with a StatefulBuilder() wich will then have the targeted state

StatefulBuilder(
builder:(context, StateSetter innerSetter){
   ....
    //use the setter now
     innerSetter(() {                          
         _isPrivate = value;
           });
    ....
})
  • Related