flutter-form-builder-ecosystem/flutter_form_builder

State dos not contain all fields

SergeBerwert opened this issue · 1 comments

Is there an existing issue for this?

  • I have searched the existing issues

Package/Plugin version

9.2.0

Platforms

  • Android
  • iOS
  • Linux
  • MacOS
  • Web
  • Windows

Flutter doctor

Flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, 3.16.8, on Microsoft Windows [Version 10.0.22621.3085], locale en-CH)
[√] Windows Version (Installed version of Windows is version 10 or higher)
[√] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[√] Chrome - develop for the web
[√] Visual Studio - develop Windows apps (Visual Studio Professional 2022 17.8.5)
[!] Android Studio (version 2022.3)
    X Unable to determine bundled Java version.
[√] Android Studio (version 2023.1)
[√] VS Code (version 1.85.2)
[√] Connected device (3 available)
[√] Network resources

Minimal code example

Code sample
class SchemaEditBuilder extends StatelessWidget {
  SchemaEditBuilder({required this.binder, required this.onSave, super.key});

  final FormBinder binder;
  final Function(List<UpdateOp> updates) onSave;

  final _formKey = GlobalKey<FormBuilderState>();

  @override
  Widget build(BuildContext context) {
    return FormBuilder(
      key: _formKey,
      child: ListView(
        children: [
          //if (state is UserActions) ContentActions(state: state as UserActions),
          Row(children: [
            ActionButton(
                icon: Icons.save,
                name: "Save",
                onPressed: () {
                  _formKey.currentState?.save();
                  var updates = _formKey.currentState!.updateObject();
                  onSave(updates);
                })
          ]),
          ..._buildSchema(binder)
        ],
      ),
    );
  }

  Iterable<Widget> _buildSchema(FormBinder binder) sync* {
    for (var p in binder.schema.properties.entries) {
      switch (p.value.type) {
        case SchemaType.Dictionary:
          yield* _buildSchema(binder.getChild(p.value, p.key));
          break;

        case SchemaType.Object_:
          var child = binder.getChild(p.value, p.key);
          yield SectionTitleWidget(child.getTitle());
          yield* _buildSchema(child);
          break;

        default:
          var b = binder.getBinder(p.value, p.key);
          yield SectionTitleWidget(b.getTitle());
          yield _buildWidget(b);
      }
    }
  }

  Widget _buildWidget(FormBinder binder) {
    switch (binder.schema.type) {
      case SchemaType.String:
        return FormBuilderTextField(
            key: ValueKey(binder.path),
            name: binder.key,
            initialValue: binder.getStringValue());

      case SchemaType.Boolean:
        return Row(
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            SizedBox(
              width: 200,
              child: FormBuilderSwitch(
                  key: ValueKey(binder.path),
                  name: binder.key,
                  title: Text(binder.getTitle()),
                  initialValue: binder.getBoolValue()),
            ),
          ],
        );

      default:
        return Text("Type: ${binder.schema.type} not supported");
    }
  }
}

Current Behavior

I build a form using Formbuilder the form is generated by a JSON schema-like structure. all expected fields show up in the GUI but the stat fields are missing after saving. Fields are only 7 but values are 11. this is a problem because I use fields to save the values on the server. I check each value if it's dirty

2024-01-30_08-26-39

Expected Behavior

expect that all fields i add are also in the fields collection.

Steps To Reproduce

I don't have a quick way to reproduce it for now.

Aditional information

No response

I had same Problem with FormBuilder and ListView. I switched to SingleChildScrollView
This Problem also affects validation. Fields missing in the state will not validate and appear to be correct.

FormBuilder(
    key: _formKey,
        child: SingleChildScrollView(
            child: Column(
                children: [
                      // FormFields
                ]
           )
       )