瀏覽代碼

Add naam-lookup custom functions; sync FlutterFlow platform update

- New custom functions provincieNaamById/gemeenteNaamById to resolve a
  selected ID back to its display name from the already-loaded
  provincie-/gemeentelijst. Not yet wired into any widget binding (the
  builder's List<DataType> argument picker proved unreliable via
  automation - see feedback_flutterflow_setvariable_listtype_bug memory).
- FlutterFlow platform update adds fetch_api/fetch_client deps and a new
  streaming API layer (api_streaming.dart, get_streamed_response_*.dart).
- Assorted regenerated pages (login, wachtwoord vergeten, select state
  dropdown, horeca sort page) from concurrent builder sync.
bob 1 月之前
父節點
當前提交
8251083eb3

+ 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>"; };
 		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>"; };
 		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>"; };
 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
-		6436409C27A31CD300820AF7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
-		6436409527A31CD200820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		6436409D27A31CD000820AF7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		6436409427A31CD400820AF7 /* 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>"; };
 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 /* End PBXFileReference section */
 
 
@@ -225,8 +225,8 @@
 		6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
 		6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
 			isa = PBXVariantGroup;
 			isa = PBXVariantGroup;
 			children = (
 			children = (
-				6436409C27A31CD300820AF7 /* nl */,
-				6436409527A31CD200820AF7 /* en */,
+				6436409D27A31CD000820AF7 /* nl */,
+				6436409427A31CD400820AF7 /* en */,
 			);
 			);
 			name = InfoPlist.strings;
 			name = InfoPlist.strings;
 			sourceTree = "<group>";
 			sourceTree = "<group>";

+ 27 - 0
lib/app_state.dart

@@ -93,6 +93,11 @@ class FFAppState extends ChangeNotifier {
           await secureStorage.getString('ff_gemeenteSelectNaam') ??
           await secureStorage.getString('ff_gemeenteSelectNaam') ??
               _gemeenteSelectNaam;
               _gemeenteSelectNaam;
     });
     });
+    await _safeInitAsync(() async {
+      _provincieSelectName =
+          await secureStorage.getString('ff_provincieSelectName') ??
+              _provincieSelectName;
+    });
   }
   }
 
 
   void update(VoidCallback callback) {
   void update(VoidCallback callback) {
@@ -441,6 +446,18 @@ class FFAppState extends ChangeNotifier {
     debugLogAppState(this);
     debugLogAppState(this);
   }
   }
 
 
+  String _provincieSelectName = '';
+  String get provincieSelectName => _provincieSelectName;
+  set provincieSelectName(String value) {
+    _provincieSelectName = value;
+    secureStorage.setString('ff_provincieSelectName', value);
+    debugLogAppState(this);
+  }
+
+  void deleteProvincieSelectName() {
+    secureStorage.delete(key: 'ff_provincieSelectName');
+  }
+
   Map<String, DebugDataField> toDebugSerializableMap() => {
   Map<String, DebugDataField> toDebugSerializableMap() => {
         'userCsrftoken': debugSerializeParam(
         'userCsrftoken': debugSerializeParam(
           userCsrftoken,
           userCsrftoken,
@@ -616,6 +633,16 @@ class FFAppState extends ChangeNotifier {
               'reference=Ch0KFQoJaXNMb2FkaW5nEgg4eWlsMnFua3ICCAV6AFoJaXNMb2FkaW5n',
               'reference=Ch0KFQoJaXNMb2FkaW5nEgg4eWlsMnFua3ICCAV6AFoJaXNMb2FkaW5n',
           name: 'bool',
           name: 'bool',
           nullable: false,
           nullable: false,
+        ),
+        'provincieSelectName': debugSerializeParam(
+          provincieSelectName,
+          ParamType.String,
+          link:
+              'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=appValues&appValuesTab=state',
+          searchReference:
+              'reference=CicKHwoTcHJvdmluY2llU2VsZWN0TmFtZRIIcHMxY2N5Ym9yAggDegBaE3Byb3ZpbmNpZVNlbGVjdE5hbWU=',
+          name: 'String',
+          nullable: false,
         )
         )
       };
       };
 }
 }

+ 15 - 27
lib/backend/api_requests/api_calls.dart

@@ -145,26 +145,26 @@ class ZZUserEstablishmentsTESTCall {
 }
 }
 
 
 class FavorietenAgendaCall {
 class FavorietenAgendaCall {
-  static Future<ApiCallResponse> call({
-    String? sessionname = '',
-    String? sessionid = '',
-  }) async {
+  static Future<ApiCallResponse> call() async {
     return ApiManager.instance.makeApiCall(
     return ApiManager.instance.makeApiCall(
       callName: 'FavorietenAgenda',
       callName: 'FavorietenAgenda',
       apiUrl:
       apiUrl:
           'https://uitgaanskrant.com/nl/flutterdrup/views/flutterfavorietenagenda.json?display_id=services_1',
           'https://uitgaanskrant.com/nl/flutterdrup/views/flutterfavorietenagenda.json?display_id=services_1',
       callType: ApiCallType.GET,
       callType: ApiCallType.GET,
       headers: {
       headers: {
-        'Cookie': '${sessionname}=${sessionid}',
+        'Cookie':
+            'SSESSfb38a72b665678c06dea69b92d0e88c6=NPHBx1J_vK03xg3ysN3SjaPj3iWjefsIBXxxTWipEtI',
         'Content-Type': 'application/json',
         'Content-Type': 'application/json',
         'Accept': 'application/json',
         'Accept': 'application/json',
+        'X-CSRF-Token': 'I5pbUCTynNGlUObMFNzlXR0l6TM9bEGW51Fhxan44PY',
+        'X-Requested-With': 'XMLHttpRequest',
       },
       },
       params: {},
       params: {},
       returnBody: true,
       returnBody: true,
       encodeBodyUtf8: false,
       encodeBodyUtf8: false,
       decodeUtf8: false,
       decodeUtf8: false,
       cache: false,
       cache: false,
-      isStreamingApi: false,
+      isStreamingApi: true,
       alwaysAllowBody: false,
       alwaysAllowBody: false,
     );
     );
   }
   }
@@ -187,33 +187,21 @@ class FavorietenAgendaCall {
         response,
         response,
         r'''$.user.uid''',
         r'''$.user.uid''',
       ));
       ));
-  static List<String>? establishmentTitle(dynamic response) => (getJsonField(
+  static String? establishmentTitle(dynamic response) =>
+      castToType<String>(getJsonField(
         response,
         response,
         r'''$[:].node_title''',
         r'''$[:].node_title''',
-        true,
-      ) as List?)
-          ?.withoutNulls
-          .map((x) => castToType<String>(x))
-          .withoutNulls
-          .toList();
-  static List<String>? establishmentLogo(dynamic response) => (getJsonField(
+      ));
+  static String? establishmentLogo(dynamic response) =>
+      castToType<String>(getJsonField(
         response,
         response,
         r'''$[:].logohoreca''',
         r'''$[:].logohoreca''',
-        true,
-      ) as List?)
-          ?.withoutNulls
-          .map((x) => castToType<String>(x))
-          .withoutNulls
-          .toList();
-  static List<String>? establishmentNid(dynamic response) => (getJsonField(
+      ));
+  static String? establishmentNid(dynamic response) =>
+      castToType<String>(getJsonField(
         response,
         response,
         r'''$[:].nid''',
         r'''$[:].nid''',
-        true,
-      ) as List?)
-          ?.withoutNulls
-          .map((x) => castToType<String>(x))
-          .withoutNulls
-          .toList();
+      ));
 }
 }
 
 
 class GetcsrfCall {
 class GetcsrfCall {

+ 33 - 0
lib/backend/api_requests/api_manager.dart

@@ -16,6 +16,7 @@ import 'package:http/browser_client.dart'
     if (dart.library.io) 'browser_client_stub.dart';
     if (dart.library.io) 'browser_client_stub.dart';
 
 
 import '/flutter_flow/uploaded_file.dart';
 import '/flutter_flow/uploaded_file.dart';
+import '/backend/api_requests/api_streaming.dart';
 
 
 import 'get_streamed_response.dart';
 import 'get_streamed_response.dart';
 
 
@@ -262,6 +263,38 @@ class ApiManager {
   // If your API calls need authentication, populate this field once
   // If your API calls need authentication, populate this field once
   // the user has authenticated. Alter this as needed.
   // the user has authenticated. Alter this as needed.
   static String? _accessToken;
   static String? _accessToken;
+  // Map of active streaming response subscriptions
+  // Key is a unique identifier for the subscription
+  // Value is the stream subscription
+  final Map<String, StreamSubscription<ResponseStreamMessage>>
+      _activeStreamingResponseSubscriptions = {};
+
+  // Add a new active streaming response subscription
+  void addActiveStreamingResponseSubscription(
+    String subscriptionKey,
+    StreamSubscription<ResponseStreamMessage>? subscription,
+  ) {
+    // Check if the subscription key is empty or if the subscription is null
+    if (subscriptionKey.isEmpty || subscription == null) {
+      return;
+    }
+    // Add the subscription to the map
+    _activeStreamingResponseSubscriptions[subscriptionKey] = subscription;
+  }
+
+  // Cancel an active streaming response subscription
+  Future<void> cancelActiveStreamingResponseSubscription(
+    String subscriptionKey,
+  ) async {
+    // Check if the subscription key is in the map
+    if (_activeStreamingResponseSubscriptions.containsKey(subscriptionKey)) {
+      // Cancel the subscription
+      await _activeStreamingResponseSubscriptions[subscriptionKey]!.cancel();
+    }
+    // Remove the subscription from the map
+    _activeStreamingResponseSubscriptions.remove(subscriptionKey);
+  }
+
   // You may want to call this if, for example, you make a change to the
   // You may want to call this if, for example, you make a change to the
   // database and no longer want the cached result of a call that may
   // database and no longer want the cached result of a call that may
   // have changed.
   // have changed.

+ 112 - 0
lib/backend/api_requests/api_streaming.dart

@@ -0,0 +1,112 @@
+import 'dart:async';
+import 'dart:convert';
+
+class ServerSentEvent {
+  final String id;
+  final String event;
+  final String data;
+  late final dynamic _jsonData = _tryJsonDecode(data);
+  final int? retry;
+
+  dynamic get jsonData {
+    return _jsonData;
+  }
+
+  dynamic _tryJsonDecode(String dataString) {
+    try {
+      return jsonDecode(dataString);
+    } catch (_) {
+      return null;
+    }
+  }
+
+  ServerSentEvent({
+    required this.id,
+    required this.event,
+    required this.data,
+    this.retry,
+  });
+}
+
+class ResponseStreamMessage {
+  final String message;
+  late final ServerSentEvent _serverSentEvent = _parseSseString(message);
+
+  ServerSentEvent get serverSentEvent {
+    return _serverSentEvent;
+  }
+
+  ResponseStreamMessage({
+    required this.message,
+  });
+  ServerSentEvent _parseSseString(String sseString) {
+    String id = '';
+    String event = '';
+    String data = '';
+    int? retry;
+
+    // Split the input string by lines
+    final lines = sseString.split('\n');
+
+    for (var line in lines) {
+      if (line.startsWith('id:')) {
+        id = line.substring(3).trim();
+      } else if (line.startsWith('event:')) {
+        event = line.substring(6).trim();
+      } else if (line.startsWith('data:')) {
+        data += line.substring(5).trim() + '\n';
+      } else if (line.startsWith('retry:')) {
+        retry = int.tryParse(line.substring(6).trim());
+      }
+    }
+
+    // Remove the trailing newline character from data
+    if (data.endsWith('\n')) {
+      data = data.substring(0, data.length - 1);
+    }
+
+    return ServerSentEvent(id: id, event: event, data: data, retry: retry);
+  }
+}
+
+class ServerSentEventLineTransformer
+    extends StreamTransformerBase<String, String> {
+  @override
+  Stream<String> bind(Stream<String> stream) {
+    return Stream<String>.eventTransformed(
+      stream,
+      (EventSink<String> sink) => _NewlineEventSink(sink),
+    );
+  }
+}
+
+class _NewlineEventSink implements EventSink<String> {
+  final EventSink<String> _sink;
+  String _buffer = '';
+
+  _NewlineEventSink(this._sink);
+
+  @override
+  void add(String data) {
+    if (data.isEmpty) {
+      _sink.add(_buffer);
+      _buffer = '';
+    } else {
+      _buffer += (_buffer.isNotEmpty ? '\n' : '') + data;
+    }
+  }
+
+  @override
+  void addError(Object error, [StackTrace? stackTrace]) {
+    _sink.addError(error, stackTrace);
+  }
+
+  @override
+  void close() {
+    if (_buffer.isNotEmpty) {
+      _sink.add(_buffer);
+      _buffer = '';
+    }
+    _sink.close();
+  }
+}

+ 3 - 4
lib/backend/api_requests/get_streamed_response.dart

@@ -1,4 +1,3 @@
-import 'package:http/http.dart';
-
-Future<StreamedResponse> getStreamedResponse(Request request) =>
-    Client().send(request);
+export 'get_streamed_response_http.dart'
+    if (dart.library.js) 'get_streamed_response_web.dart'
+    if (dart.library.js_interop) 'get_streamed_response_web.dart';

+ 4 - 0
lib/backend/api_requests/get_streamed_response_http.dart

@@ -0,0 +1,4 @@
+import 'package:http/http.dart';
+
+Future<StreamedResponse> getStreamedResponse(Request request) =>
+    Client().send(request);

+ 8 - 0
lib/backend/api_requests/get_streamed_response_web.dart

@@ -0,0 +1,8 @@
+import 'package:fetch_client/fetch_client.dart';
+import 'package:http/http.dart';
+
+Future<StreamedResponse> getStreamedResponse(Request request) async {
+  final FetchClient fetchClient = FetchClient(mode: RequestMode.cors);
+  final FetchResponse response = await fetchClient.send(request);
+  return response;
+}

+ 21 - 0
lib/flutter_flow/custom_functions.dart

@@ -81,3 +81,24 @@ String? kortDatum(String? rawDatum) {
       ? '$weekdag $dag $maand $tijd'
       ? '$weekdag $dag $maand $tijd'
       : '$weekdag $dag $maand';
       : '$weekdag $dag $maand';
 }
 }
+
+String? provincieNaamById(
+  List<ProvincieModelStruct>? lijst,
+  String? id,
+) {
+  return lijst
+      ?.firstWhere((e) => e.provincieid == id,
+          orElse: () => ProvincieModelStruct())
+      .provinciename;
+}
+
+/// id
+String? gemeenteNaamById(
+  List<GemeenteModelStruct>? lijst,
+  String? id,
+) {
+  return lijst
+      ?.firstWhere((e) => e.gemeenteid == id,
+          orElse: () => GemeenteModelStruct())
+      .gemeentename;
+}

+ 2 - 0
lib/horecagelegenhedenoverzicht/horecagelegenheden_overzicht_sort_page/horecagelegenheden_overzicht_sort_page_model.dart

@@ -1,4 +1,5 @@
 import '/backend/api_requests/api_calls.dart';
 import '/backend/api_requests/api_calls.dart';
+import '/backend/api_requests/api_streaming.dart';
 import '/components/header_buttons_component_widget.dart';
 import '/components/header_buttons_component_widget.dart';
 import '/flutter_flow/flutter_flow_drop_down.dart';
 import '/flutter_flow/flutter_flow_drop_down.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
@@ -7,6 +8,7 @@ import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/form_field_controller.dart';
 import '/flutter_flow/form_field_controller.dart';
 import '/horecagelegenhedenoverzicht/horecagelegenheidoverzicht_kaart/horecagelegenheidoverzicht_kaart_widget.dart';
 import '/horecagelegenhedenoverzicht/horecagelegenheidoverzicht_kaart/horecagelegenheidoverzicht_kaart_widget.dart';
 import '/shared/drawer_component/drawer_component_widget.dart';
 import '/shared/drawer_component/drawer_component_widget.dart';
+import 'dart:convert';
 import 'dart:ui';
 import 'dart:ui';
 import '/backend/schema/structs/index.dart';
 import '/backend/schema/structs/index.dart';
 import '/index.dart';
 import '/index.dart';

+ 2 - 0
lib/horecagelegenhedenoverzicht/horecagelegenheden_overzicht_sort_page/horecagelegenheden_overzicht_sort_page_widget.dart

@@ -1,4 +1,5 @@
 import '/backend/api_requests/api_calls.dart';
 import '/backend/api_requests/api_calls.dart';
+import '/backend/api_requests/api_streaming.dart';
 import '/components/header_buttons_component_widget.dart';
 import '/components/header_buttons_component_widget.dart';
 import '/flutter_flow/flutter_flow_drop_down.dart';
 import '/flutter_flow/flutter_flow_drop_down.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
@@ -7,6 +8,7 @@ import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/form_field_controller.dart';
 import '/flutter_flow/form_field_controller.dart';
 import '/horecagelegenhedenoverzicht/horecagelegenheidoverzicht_kaart/horecagelegenheidoverzicht_kaart_widget.dart';
 import '/horecagelegenhedenoverzicht/horecagelegenheidoverzicht_kaart/horecagelegenheidoverzicht_kaart_widget.dart';
 import '/shared/drawer_component/drawer_component_widget.dart';
 import '/shared/drawer_component/drawer_component_widget.dart';
+import 'dart:convert';
 import 'dart:ui';
 import 'dart:ui';
 import '/backend/schema/structs/index.dart';
 import '/backend/schema/structs/index.dart';
 import '/index.dart';
 import '/index.dart';

+ 2 - 0
lib/login/login/login_model.dart

@@ -1,10 +1,12 @@
 import '/auth/custom_auth/auth_util.dart';
 import '/auth/custom_auth/auth_util.dart';
 import '/backend/api_requests/api_calls.dart';
 import '/backend/api_requests/api_calls.dart';
+import '/backend/api_requests/api_streaming.dart';
 import '/components/header_buttons_component_widget.dart';
 import '/components/header_buttons_component_widget.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import '/shared/drawer_component/drawer_component_widget.dart';
 import '/shared/drawer_component/drawer_component_widget.dart';
+import 'dart:convert';
 import 'dart:ui';
 import 'dart:ui';
 import '/index.dart';
 import '/index.dart';
 import 'login_widget.dart' show LoginWidget;
 import 'login_widget.dart' show LoginWidget;

+ 2 - 0
lib/login/login/login_widget.dart

@@ -1,10 +1,12 @@
 import '/auth/custom_auth/auth_util.dart';
 import '/auth/custom_auth/auth_util.dart';
 import '/backend/api_requests/api_calls.dart';
 import '/backend/api_requests/api_calls.dart';
+import '/backend/api_requests/api_streaming.dart';
 import '/components/header_buttons_component_widget.dart';
 import '/components/header_buttons_component_widget.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import '/shared/drawer_component/drawer_component_widget.dart';
 import '/shared/drawer_component/drawer_component_widget.dart';
+import 'dart:convert';
 import 'dart:ui';
 import 'dart:ui';
 import '/index.dart';
 import '/index.dart';
 import 'package:easy_debounce/easy_debounce.dart';
 import 'package:easy_debounce/easy_debounce.dart';

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

@@ -1,10 +1,12 @@
 import '/backend/api_requests/api_calls.dart';
 import '/backend/api_requests/api_calls.dart';
+import '/backend/api_requests/api_streaming.dart';
 import '/backend/schema/structs/index.dart';
 import '/backend/schema/structs/index.dart';
 import '/flutter_flow/flutter_flow_drop_down.dart';
 import '/flutter_flow/flutter_flow_drop_down.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/form_field_controller.dart';
 import '/flutter_flow/form_field_controller.dart';
+import 'dart:convert';
 import 'dart:ui';
 import 'dart:ui';
 import 'select_state_drop_down_component_widget.dart'
 import 'select_state_drop_down_component_widget.dart'
     show SelectStateDropDownComponentWidget;
     show SelectStateDropDownComponentWidget;

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

@@ -1,10 +1,12 @@
 import '/backend/api_requests/api_calls.dart';
 import '/backend/api_requests/api_calls.dart';
+import '/backend/api_requests/api_streaming.dart';
 import '/backend/schema/structs/index.dart';
 import '/backend/schema/structs/index.dart';
 import '/flutter_flow/flutter_flow_drop_down.dart';
 import '/flutter_flow/flutter_flow_drop_down.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/form_field_controller.dart';
 import '/flutter_flow/form_field_controller.dart';
+import 'dart:convert';
 import 'dart:ui';
 import 'dart:ui';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/scheduler.dart';
 import 'package:flutter/scheduler.dart';

+ 2 - 0
lib/wachtwoord_vergeten/wachtwoord_vergeten_model.dart

@@ -1,7 +1,9 @@
 import '/backend/api_requests/api_calls.dart';
 import '/backend/api_requests/api_calls.dart';
+import '/backend/api_requests/api_streaming.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
+import 'dart:convert';
 import 'dart:ui';
 import 'dart:ui';
 import 'wachtwoord_vergeten_widget.dart' show WachtwoordVergetenWidget;
 import 'wachtwoord_vergeten_widget.dart' show WachtwoordVergetenWidget;
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';

+ 2 - 0
lib/wachtwoord_vergeten/wachtwoord_vergeten_widget.dart

@@ -1,7 +1,9 @@
 import '/backend/api_requests/api_calls.dart';
 import '/backend/api_requests/api_calls.dart';
+import '/backend/api_requests/api_streaming.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
+import 'dart:convert';
 import 'dart:ui';
 import 'dart:ui';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_spinkit/flutter_spinkit.dart';
 import 'package:flutter_spinkit/flutter_spinkit.dart';

+ 16 - 0
pubspec.lock

@@ -267,6 +267,22 @@ packages:
       url: "https://pub.dev"
       url: "https://pub.dev"
     source: hosted
     source: hosted
     version: "1.3.3"
     version: "1.3.3"
+  fetch_api:
+    dependency: "direct main"
+    description:
+      name: fetch_api
+      sha256: "97f46c25b480aad74f7cc2ad7ccba2c5c6f08d008e68f95c1077286ce243d0e6"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.2.0"
+  fetch_client:
+    dependency: "direct main"
+    description:
+      name: fetch_client
+      sha256: "9666ee14536778474072245ed5cba07db81ae8eb5de3b7bf4a2d1e2c49696092"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.2"
   ffi:
   ffi:
     dependency: transitive
     dependency: transitive
     description:
     description:

+ 2 - 0
pubspec.yaml

@@ -47,6 +47,8 @@ dependencies:
       path: packages/dropdown_button2
       path: packages/dropdown_button2
   easy_debounce: 2.0.1
   easy_debounce: 2.0.1
   equatable: 2.0.7
   equatable: 2.0.7
+  fetch_api: 2.2.0
+  fetch_client: 1.1.2
   flutter_animate: 4.5.0
   flutter_animate: 4.5.0
   flutter_cache_manager: 3.4.1
   flutter_cache_manager: 3.4.1
   flutter_html:
   flutter_html: