فهرست منبع

P1-7: snelkeuzelijst favoriete gemeenten op SelectStateDropDownComponent

Wrap + Generate Dynamic Children over favorieteGemeentenLijst (Local
Component State Variable, gevuld via de custom action
getFavorieteGemeenten aan het einde van On Initialization). Tik op een
gemeente-chip zet gemeenteSelectId/gemeenteSelectNaam en navigeert
direct naar Home (zelfde patroon als de bestaande Toepassen-knop).

Bevestigd via verse export + flutter analyze (0 errors) + live check
op emulator-5556 (profile mode, lege favorietenlijst crasht niet).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
bob 3 هفته پیش
والد
کامیت
ff75691b78

+ 1 - 1
android/app/build.gradle

@@ -55,7 +55,7 @@ android {
     defaultConfig {
         // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
         applicationId "com.uitgaanskrant.app"
-        minSdkVersion 23
+        minSdkVersion flutter.minSdkVersion
         targetSdkVersion 36
         versionCode flutterVersionCode.toInteger()
         versionName flutterVersionName

+ 2 - 2
android/build.gradle

@@ -43,6 +43,6 @@ subprojects {
     project.evaluationDependsOn(':app')
 }
 
-task clean(type: Delete) {
-    delete rootProject.buildDir
+tasks.register("clean", Delete) {
+    delete rootProject.layout.buildDirectory
 }

+ 4 - 4
ios/Runner.xcodeproj/project.pbxproj

@@ -44,8 +44,8 @@
 		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
-		6436409127A31CD300820AF7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
-		6436409D27A31CD100820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		6436409427A31CDC00820AF7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		6436409A27A31CD700820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -225,8 +225,8 @@
 		6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
 			isa = PBXVariantGroup;
 			children = (
-				6436409127A31CD300820AF7 /* nl */,
-				6436409D27A31CD100820AF7 /* en */,
+				6436409427A31CDC00820AF7 /* nl */,
+				6436409A27A31CD700820AF7 /* en */,
 			);
 			name = InfoPlist.strings;
 			sourceTree = "<group>";

+ 56 - 0
lib/selecteer_plaats/select_state_drop_down_component/select_state_drop_down_component_model.dart

@@ -8,6 +8,7 @@ import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/form_field_controller.dart';
 import 'dart:convert';
 import 'dart:ui';
+import '/custom_code/actions/index.dart' as actions;
 import '/flutter_flow/custom_functions.dart' as functions;
 import '/index.dart';
 import 'select_state_drop_down_component_widget.dart'
@@ -38,6 +39,31 @@ class SelectStateDropDownComponentModel
 
   bool get isLoadingGemeenteDone => _isLoadingGemeenteDone;
 
+  late LoggableList<GemeenteModelStruct> _favorieteGemeentenLijst =
+      LoggableList([]);
+  set favorieteGemeentenLijst(List<GemeenteModelStruct> value) {
+    if (value != null) {
+      _favorieteGemeentenLijst = LoggableList(value);
+    }
+
+    debugLogWidgetClass(this);
+  }
+
+  List<GemeenteModelStruct> get favorieteGemeentenLijst =>
+      _favorieteGemeentenLijst?..logger = () => debugLogWidgetClass(this);
+  void addToFavorieteGemeentenLijst(GemeenteModelStruct item) =>
+      favorieteGemeentenLijst.add(item);
+  void removeFromFavorieteGemeentenLijst(GemeenteModelStruct item) =>
+      favorieteGemeentenLijst.remove(item);
+  void removeAtIndexFromFavorieteGemeentenLijst(int index) =>
+      favorieteGemeentenLijst.removeAt(index);
+  void insertAtIndexInFavorieteGemeentenLijst(
+          int index, GemeenteModelStruct item) =>
+      favorieteGemeentenLijst.insert(index, item);
+  void updateFavorieteGemeentenLijstAtIndex(
+          int index, Function(GemeenteModelStruct) updateFn) =>
+      favorieteGemeentenLijst[index] = updateFn(favorieteGemeentenLijst[index]);
+
   ///  State fields for stateful widgets in this component.
 
   // Stores action output result for [Backend Call - API (provincies)] action in SelectStateDropDownComponent widget.
@@ -59,6 +85,16 @@ class SelectStateDropDownComponentModel
   ApiCallResponse? get apiGemeenteResultInitalize =>
       _apiGemeenteResultInitalize;
 
+  // Stores action output result for [Custom Action - getFavorieteGemeenten] action in SelectStateDropDownComponent widget.
+  List<GemeenteModelStruct>? _favorieteGemeentenResultaat;
+  set favorieteGemeentenResultaat(List<GemeenteModelStruct>? value) {
+    _favorieteGemeentenResultaat = value;
+    debugLogWidgetClass(this);
+  }
+
+  List<GemeenteModelStruct>? get favorieteGemeentenResultaat =>
+      _favorieteGemeentenResultaat;
+
   // State field(s) for DropDownProvincie widget.
   String? _dropDownProvincieValue;
   set dropDownProvincieValue(String? value) {
@@ -120,6 +156,17 @@ class SelectStateDropDownComponentModel
                 'reference=Qi8KHgoVaXNMb2FkaW5nR2VtZWVudGVEb25lEgUzY3BwYioHEgVmYWxzZXIECAUgAVAAWhVpc0xvYWRpbmdHZW1lZW50ZURvbmViHFNlbGVjdFN0YXRlRHJvcERvd25Db21wb25lbnQ=',
             name: 'bool',
             nullable: false,
+          ),
+          'favorieteGemeentenLijst': debugSerializeParam(
+            favorieteGemeentenLijst,
+            ParamType.DataStruct,
+            isList: true,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=SelectStateDropDownComponent',
+            searchReference:
+                'reference=QkIKIAoXZmF2b3JpZXRlR2VtZWVudGVuTGlqc3QSBWZvbnp2ch4SAggUKhgSFgoNR2VtZWVudGVNb2RlbBIFODJ1N3VQAFoXZmF2b3JpZXRlR2VtZWVudGVuTGlqc3RiHFNlbGVjdFN0YXRlRHJvcERvd25Db21wb25lbnQ=',
+            name: 'GemeenteModel',
+            nullable: false,
           )
         }.entries,
         widgetStates: {
@@ -157,6 +204,15 @@ class SelectStateDropDownComponentModel
             name: 'ApiCallResponse',
             nullable: true,
           ),
+          'favorieteGemeentenResultaat': debugSerializeParam(
+            favorieteGemeentenResultaat,
+            ParamType.DataStruct,
+            isList: true,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=SelectStateDropDownComponent',
+            name: 'GemeenteModel',
+            nullable: true,
+          ),
           'apiGemeenteResultbutton': debugSerializeParam(
             apiGemeenteResultbutton,
             ParamType.ApiResponse,

+ 82 - 0
lib/selecteer_plaats/select_state_drop_down_component/select_state_drop_down_component_widget.dart

@@ -8,6 +8,7 @@ import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/form_field_controller.dart';
 import 'dart:convert';
 import 'dart:ui';
+import '/custom_code/actions/index.dart' as actions;
 import '/flutter_flow/custom_functions.dart' as functions;
 import '/index.dart';
 import 'package:flutter/material.dart';
@@ -102,6 +103,13 @@ class _SelectStateDropDownComponentWidgetState
         safeSetState(() {});
       }
       safeSetState(() {});
+      _model.favorieteGemeentenResultaat = await actions.getFavorieteGemeenten(
+        FFAppState().favorieteGemeenteIds.toList(),
+      );
+      _model.favorieteGemeentenLijst = _model.favorieteGemeentenResultaat!
+          .toList()
+          .cast<GemeenteModelStruct>();
+      safeSetState(() {});
     });
   }
 
@@ -343,6 +351,80 @@ class _SelectStateDropDownComponentWidgetState
               borderRadius: BorderRadius.circular(8.0),
             ),
           ),
+          Builder(
+            builder: (context) {
+              final favorieteGemeenteItem =
+                  _model.favorieteGemeentenLijst.toList();
+              _model.debugGeneratorVariables[
+                      'favorieteGemeenteItem${favorieteGemeenteItem.length > 100 ? ' (first 100)' : ''}'] =
+                  debugSerializeParam(
+                favorieteGemeenteItem.take(100),
+                ParamType.DataStruct,
+                isList: true,
+                link:
+                    'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=SelectStateDropDownComponent',
+                name: 'GemeenteModel',
+                nullable: false,
+              );
+              debugLogWidgetClass(_model);
+
+              return Wrap(
+                spacing: 0.0,
+                runSpacing: 0.0,
+                alignment: WrapAlignment.start,
+                crossAxisAlignment: WrapCrossAlignment.start,
+                direction: Axis.horizontal,
+                runAlignment: WrapAlignment.start,
+                verticalDirection: VerticalDirection.down,
+                clipBehavior: Clip.none,
+                children: List.generate(favorieteGemeenteItem.length,
+                    (favorieteGemeenteItemIndex) {
+                  final favorieteGemeenteItemItem =
+                      favorieteGemeenteItem[favorieteGemeenteItemIndex];
+                  return InkWell(
+                    splashColor: Colors.transparent,
+                    focusColor: Colors.transparent,
+                    hoverColor: Colors.transparent,
+                    highlightColor: Colors.transparent,
+                    onTap: () async {
+                      FFAppState().gemeenteSelectId =
+                          favorieteGemeenteItemItem.gemeenteid;
+                      FFAppState().gemeenteSelectNaam =
+                          favorieteGemeenteItemItem.gemeentename;
+                      safeSetState(() {});
+
+                      context.pushNamed(HomeWidget.routeName);
+                    },
+                    child: Container(
+                      decoration: BoxDecoration(
+                        color: FlutterFlowTheme.of(context).secondaryBackground,
+                      ),
+                      child: Text(
+                        favorieteGemeenteItemItem.gemeentename,
+                        style: FlutterFlowTheme.of(context).bodyMedium.override(
+                              font: GoogleFonts.inter(
+                                fontWeight: FlutterFlowTheme.of(context)
+                                    .bodyMedium
+                                    .fontWeight,
+                                fontStyle: FlutterFlowTheme.of(context)
+                                    .bodyMedium
+                                    .fontStyle,
+                              ),
+                              letterSpacing: 0.0,
+                              fontWeight: FlutterFlowTheme.of(context)
+                                  .bodyMedium
+                                  .fontWeight,
+                              fontStyle: FlutterFlowTheme.of(context)
+                                  .bodyMedium
+                                  .fontStyle,
+                            ),
+                      ),
+                    ),
+                  );
+                }),
+              );
+            },
+          ),
         ],
       ),
     );