flutter text field value from API resetting on keyboard close

Viewed 550

I have implemented BLOC architecture for a user profile edit for a logged in user in flutter. The inputs are filled with user's existing info which I got from the API. But whenever input is focused and keyboard closes the entered value gets replaced with the initial value which I got from the API response.

This is my View profile UI

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:payd/services/profile_service.dart';
import 'package:payd/bloc/profile_bloc.dart';
import 'package:payd/model/profile_model.dart';

void main() {
  runApp(EditProfile());
}

class EditProfile extends StatefulWidget {
  @override
  _EditProfilesState createState() => _EditProfilesState();
}

class _EditProfilesState extends State<EditProfile>
    with AutomaticKeepAliveClientMixin {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: false,
      appBar: AppBar(
        title: Image.asset('assets/logo.png', fit: BoxFit.cover),
        actions: [
          IconButton(
            onPressed: () {},
            icon: Image.asset('assets/Icon feather-bell.png'),
            iconSize: 30,
          ),
        ],
        elevation: 5,
      ),
      backgroundColor: Color(0xFF33138C),
      body: BlocProvider(
        create: (context) => ProfileBloc(ProfileService()),
        child: Body(),
      ),
    );
  }

  @override
  // TODO: implement wantKeepAlive
  bool get wantKeepAlive => true;
}

class Body extends StatelessWidget {
  static final _formKey = GlobalKey<FormState>();

  void _submit() {
    final isValid = _formKey.currentState.validate();
    if (!isValid) {
      return;
    }
    _formKey.currentState.save();
  }
  @override
  Widget build(BuildContext context) {
    final textFieldFocusNode = FocusNode();
    final profileBloc = BlocProvider.of<ProfileBloc>(context);
    var userSlug = '52q6x93k4y';
    profileBloc.add(FetchProfile(userSlug));
    Size size = MediaQuery.of(context).size;
    return Container(
      constraints: BoxConstraints.expand(),
      decoration: BoxDecoration(
          image: DecorationImage(
              image: new ExactAssetImage('assets/app-background.png'),
              fit: BoxFit.cover)),
      child: Padding(
        padding: const EdgeInsets.all(0),
        child: SingleChildScrollView(
          physics: NeverScrollableScrollPhysics(),
          child: Column(
            children: <Widget>[
              SizedBox(
                  height: size.height,
                  child: Stack(
                    children: <Widget>[
                      Container(
                          margin: EdgeInsets.only(top: size.height * 0.04),
                          // height: 400,
                          decoration: BoxDecoration(
                            color: Colors.white,
                            borderRadius: BorderRadius.only(
                              topLeft: Radius.circular(40.0),
                              topRight: Radius.circular(40.0),
                            ),
                          ),
                          child: Column(
                            children: <Widget>[
                              Row(
                                children: <Widget>[
                                  Column(
                                    children: [
                                      Container(
                                        padding: EdgeInsets.only(
                                            top: 30.0,
                                            left: 20.0, bottom: 25.0),
                                        alignment: Alignment.centerLeft,
                                        child: IconButton(
                                          onPressed: () {
                                            Navigator.pop(context);
                                          },
                                          icon: Icon(Icons.keyboard_arrow_left),
                                          iconSize: 30,
                                        ),
                                      ),
                                    ],
                                  ),
                                  Column(
                                    children: [
                                      Container(
                                        padding: EdgeInsets.only(
                                            top: 30.0,
                                            right: 30.0, bottom: 25.0),
                                        alignment: Alignment.centerLeft,
                                        child: Text(
                                          'Edit Account',
                                          style: const TextStyle(
                                              fontSize: 17.0,
                                              fontWeight: FontWeight.w600,
                                              color: Colors.black54),
                                        ),
                                      ),
                                    ],
                                  ),
                                ],
                              ),
                              BlocBuilder<ProfileBloc, ProfileState>(
                                  builder: (context, state) {
                                  print(state);
                                  if (state is ProfileIsLoaded) {
                                    return Container(
                                      child: Flexible(
                                        child: SingleChildScrollView(
                                          reverse: true,
                                          padding:
                                          EdgeInsets.only(left: 16, right: 16),
                                          child: Column(
                                            children: <Widget>[
                                              Container(
                                                margin: EdgeInsets.only(
                                                    bottom:
                                                    size.height > 700
                                                        ? 20
                                                        : 15),
                                                padding: EdgeInsets.only(
                                                    left: 20.0,
                                                    right: 20.0,
                                                    bottom: 25.0),
                                                child: Form(
                                                  key: _formKey,
                                                  child: Column(
                                                    children: <Widget>[
                                                      TextFormField(
                                                        controller: TextEditingController(
                                                            text: state.getProfile.firstName),
                                                        decoration: InputDecoration(
                                                            labelText: 'First Name'),
                                                        keyboardType: TextInputType
                                                            .name,
                                                        onFieldSubmitted: (
                                                            value) {
                                                          //Validator
                                                        },
                                                        validator: (value) {
                                                          if (value.isEmpty) {
                                                            return 'Required';
                                                          }
                                                          return null;
                                                        },
                                                      ),
                                                      //box styling
                                                      SizedBox(
                                                        height: MediaQuery
                                                            .of(context)
                                                            .size
                                                            .width *
                                                            0.1,
                                                      ),
                                                      TextFormField(
                                                        controller: TextEditingController(
                                                            text: state.getProfile.lastName),
                                                        decoration: InputDecoration(
                                                            labelText: 'Last Name'),
                                                        keyboardType: TextInputType
                                                            .name,
                                                        onFieldSubmitted: (
                                                            value) {
                                                          //Validator
                                                        },
                                                        validator: (value) {
                                                          if (value.isEmpty) {
                                                            return 'Required';
                                                          }
                                                          return null;
                                                        },
                                                      ),
                                                      //box styling
                                                      SizedBox(
                                                        height: MediaQuery
                                                            .of(context)
                                                            .size
                                                            .width *
                                                            0.1,
                                                      ),
                                                      SizedBox(
                                                        width: double.infinity,
                                                        child: TextButton(
                                                          style: ButtonStyle(
                                                            padding: MaterialStateProperty
                                                                .all(
                                                              EdgeInsets.only(
                                                                  top: 16.0,
                                                                  bottom: 16.0),),
                                                            foregroundColor:
                                                            MaterialStateProperty
                                                                .all<Color>(
                                                                Colors.white),
                                                            backgroundColor: MaterialStateProperty
                                                                .all<Color>(
                                                                Color(
                                                                    0xFF33138C)),
                                                            shape: MaterialStateProperty
                                                                .all<
                                                                RoundedRectangleBorder>(
                                                                RoundedRectangleBorder(
                                                                    borderRadius: BorderRadius
                                                                        .circular(
                                                                        25.0),
                                                                    side: BorderSide(
                                                                        color: Color(
                                                                            0xFF33138C)))),),
                                                          onPressed: () =>
                                                              _submit(),
                                                          child: Text('Save',
                                                            style: TextStyle(
                                                                fontSize: 16.0
                                                            ),),
                                                        ),
                                                      ),
                                                    ],
                                                  ),
                                                ),
                                              ),
                                            ],
                                          ),
                                        ),
                                      ),
                                    );
                                  } else {
                                    return Center(child : CircularProgressIndicator());
                                  }
                                }
                              ),
                              SizedBox(height: 150),
                            ],
                          )),
                    ],
                  ))
            ],
          ),
        ),
      ),
    );
  }
}

class ProfileError extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[Image.asset('assets/empty-list.png')],
          ),
          Text(
            'Error',
            style: const TextStyle(
                fontSize: 16.0,
                fontWeight: FontWeight.w600,
                color: Colors.black87),
          ),
          Padding(
            padding: EdgeInsets.only(left: 30.0, right: 30.0),
            child: Text(
              'After your first order you\'ll be able to view it here',
              style: const TextStyle(
                fontSize: 15.0,
                fontWeight: FontWeight.w600,
                color: Colors.grey,
              ),
              textAlign: TextAlign.center,
            ),
          ),
        ],
      ),
    );
  }
}
0 Answers
Related