ids_material_sdk 4.3.0 copy "ids_material_sdk: ^4.3.0" to clipboard
ids_material_sdk: ^4.3.0 copied to clipboard

IDS Material SDK for Flutter offers fast networking, cache optimisation, custom widgets like Multi-Select DropDown, theming tools, and performance boosts to reduce server costs.

4.3.0 - 2026-01-23 #

  • Bug Fixes:
    • Handle the api response fallback mechanism to avoid the app crash.
    • Uniform the error fallback of crashed api {status:
    • Improved error handling for non-JSON error responses with structured fallback
    • Changed return type of _postInBg to dynamic for backward compatibility with both Map and List responses

4.2.0 - 2025-12-29 #

  • Bug Fixes:
    • Fixed HTTP 422 status code handling in _postInBg method to prevent FormatException crashes
    • Added proper status code validation before JSON decoding in API responses
    • Improved error handling for non-JSON error responses with structured fallback
    • Changed return type of _postInBg to dynamic for backward compatibility with both Map and List responses
  • Deprecation Fixes:
    • Updated IDSMultiSelectDropDown widget to use initialValue instead of deprecated value parameter (Flutter 3.33+ compatibility)
  • Dependency Updates:
    • Updated xml package from ^6.5.0 to ^6.6.1
    • Updated logger package from ^2.6.1 to ^2.6.2
    • Updated encrypt package to ^5.0.3 (corrected from non-existent 5.0.5)
    • Updated states_rebuilder to ^6.4.0 (corrected from non-existent 6.5.0)
    • Updated internet_connection_checker to ^3.0.1 (corrected from non-existent 3.0.2)
    • Maintained connectivity_plus at ^6.1.5 for compatibility with internet_connection_checker
  • Improvements:
    • Enhanced API error responses to include status code, message, and error details
    • Improved backward compatibility for SDK consumers
    • Better handling of validation errors (422) with proper JSON parsing

4.1.0 - 2025-07-26 #

  • Updated intl package to ^0.20.2 for better internationalization support
  • Added backward compatibility with older versions of the SDK
  • Improved dependency management and version constraints
  • Added coverage/ to .gitignore to exclude test coverage reports
  • Enhanced documentation and code examples

4.0.0 - 2025-07-04 #

  • Mobile Number field index
  • IDSNumberFieldTile
  • IDSInputFieldTile
  • IDSNumberUIFieldTile
  • IDSDatePickerTile
  • IDSDateTimePickerTile
  • IDSDropdownDesign
/// Example of code snippet demonstrating usage of IDS custom form widgets.
Widget codeExample() {
  return Column(
    children: [
      /// Date picker field
      IDSDatePickerTile(
        label: "LR DATE", // CN date
        controller: _lrDateController,
        onDateTap: () => _selectDate(5),
        hintText: "Select date",
        borderColor: Colors.grey,
        iconColor: kPrimaryColor,
        borderRadius: 8.0,
      ),

      /// Date & Time picker combo
      IDSDateTimePickerTile(
        dateLabel: "REPORT DATE",
        timeLabel: "REPORT TIME",
        dateController: _reportDateController,
        timeController: _reportTimeController,
        onDateTap: () => _selectDate(1),
        onTimeTap: () => _selectTime(1),
      ),

      /// Dropdown field
      IDSDropdownDesign(
        title: 'DISPATCH MODE',
        selectedValue: _dispatchMode,
        onTap: () {
          showDropDown(1, "Name", dispatchArray);
        },
      ),

      /// Input text field
      IDSInputFieldTile(
        title: "LR SER",
        controller: _lrSerNumController,
        hintText: "LR SER",
        hintTextColor: kGreyColor,
        textColor: kBlackColor,
        borderColor: kGreyColor,
        focusedBorderColor: kPrimaryColor,
        circularRadius: 8.0,
        validator: (value) {
          if (value == null || value.isEmpty) {
            return "LR SER cannot be empty";
          }
          return null;
        },
      ),

      /// Mobile number field with validation
      IDSMobileFieldTitle(
        title: "DRIVER MOBILE NO",
        controller: driverMobileNoController,
        hintText: "Mobile number",
        hintTextColor: kGreyColor,
        textColor: kBlackColor,
        prefixIconColor: null,
        borderColor: kGreyColor,
        focusedBorderColor: kPrimaryColor,
        circularRadius: 8.0,
        keyboardType: TextInputType.phone,
        inputFormatters: [
          FilteringTextInputFormatter.digitsOnly,
          LengthLimitingTextInputFormatter(10),
        ],
        validator: (value) {
          if (value == null || value.isEmpty) {
            return "Mobile number cannot be empty";
          } else if (value.length != 10) {
            return "Mobile number must be 10 digits";
          }
          return null;
        },
      ),

      /// Number input field
      IDSNumberUIFieldTile(
        title: "No Of Package",
        controller: noOfPackageController,
        hintText: "No Of Package",
        hintTextColor: kGreyColor,
        textColor: kBlackColor,
        borderColor: kGreyColor,
        focusedBorderColor: kPrimaryColor,
        circularRadius: 8.0,
        validator: (value) {
          if (value == null || value.isEmpty) {
            return "No Of Package cannot be empty";
          }
          return null;
        },
      ),
    ],
  );
}

3.9.9 - 2025-07-03 #

  • Mobile Number field created
void mobileNumberExample() {
  IDSMobileFieldTitle(
    title: "DRIVER MOBILE NO",
    controller: driverMobileNoController,
    hintText: "Enter mobile number",
    hintTextColor: Colors.grey,
    textColor: Colors.black,
    borderColor: Colors.grey,
    focusedBorderColor: Colors.blue,
    keyboardType: TextInputType.phone,
    inputFormatters: [
      FilteringTextInputFormatter.digitsOnly,
      LengthLimitingTextInputFormatter(10),
    ],
    validator: (value) {
      if (value == null || value.isEmpty) {
        return "Mobile number cannot be empty";
      } else if (value.length != 10) {
        return "Mobile number must be 10 digits";
      }
      return null;
    },
  );

}

3.9.8 - 2025-05-17 #

  • Form url encoded functionality build
  • API bug fixes
void _exampleStatus() {
    final requestParams = {
      'vehicle': 'MH46CU0008',
      'branch': '11'
    };

    final headers = {
      'Content-Type': 'application/x-www-form-urlencoded',
    };

    var response = IDSApiManager().sendFormEncodedRequest(
      endPoint: 'url-here',
      param: requestParams,
      headers: headers,
      method: IDSMethodType.post,
    );

    response.then((result) {
      // πŸ” Handle the response
      debugPrint('βœ… Vehicle Status Response: $result');
    }).catchError((error) {
      // ❌ Handle errors
      debugPrint('❌ Error occurred: $error');
    });
  }

3.9.7 - 2025-05-17 #

  • Networking IDSHttpClient made. Using this to interact with any server api
  • // Use client.get(), client.post(), etc.
  • Bug fixes and optimization
Future<void> fetchData() async {
  final client = IDSHttpClient(); 
  final Uri url = Uri.parse('https://jsonplaceholder.typicode.com/posts/1');

  try {
    final response = await client.get(url);
    if (response.statusCode == 200) {
      print('Response body: ${response.body}');
    } else {
      print('Request failed with status: ${response.statusCode}');
    }
  } catch (e) {
    print('Error: $e');
  }
}


Future<void> postFormData() async {
  final client = IDSHttpClient();
  final Uri url = Uri.parse('https://example.com/api');
  final headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
  };
  final body = {
    'username': 'test_user',
    'password': '123456',
  };

  final request = http.Request('POST', url)
    ..headers.addAll(headers)
    ..bodyFields = body;

  try {
    final streamedResponse = await client.send(request);
    final response = await http.Response.fromStream(streamedResponse);

    if (response.statusCode == 200) {
      print('Response body: ${response.body}');
    } else {
      print('Request failed with status: ${response.statusCode}');
    }
  } catch (e) {
    print('Error: $e');
  }
}


3.9.6 - 2025-05-16 #

  • Using the get method to fetch the data in array
  • Bug fixes
void showDemoOfGetMethod() {
  final Future<List<dynamic>> apiResponse = IDSApiManager()
          .getArrayInBg('url-here', 'hedear here');
  apiResponse.then((response) => {
    setState(() {
     var tripStatusArray = response;
    }),
  });
}

3.9.5 - 2025-04-20 #

  • IDSLoader hide issue fixed
  • IDSFloatTextFieldTile class name renamed

3.9.4 - 2025-04-20 #

  • IDSFloatTextFieldTitle & IDSFloatTextField
  • Lint issue fixed for the entire SDK
Widget showDecimalField() {
  return IDSFloatTextField(
    controller: priceController,
    hintText: 'Enter product price',
    prefixIcon: Icons.attach_money,
    prefixIconColor: Colors.green,
    borderColor: Colors.grey,
    focusedBorderColor: Colors.green,
    textColor: Colors.black,
    hintTextColor: Colors.grey,
    validator: (value) {
      if (value == null || value.isEmpty) {
        return 'Please enter a price';
      }
      final double? parsedValue = double.tryParse(value);
      if (parsedValue == null || parsedValue <= 0) {
        return 'Enter a valid price';
      }
      return null;
    },
  );
}

3.9.3 - 2025-04-10 #

  • IDSTextAreaTitle & IDSTextArea bug fixes.

3.9.2 - 2025-04-10 #

  • TextArea new line issue fixed.
  • IDSTextAreaTitle new line field added. by default newline will come.

3.9.1 - 2025-04-08 #

  • Public access IDSCryptoConfiguration & IDSCryptoManager
  • Code clean up

3.9.0 - 2025-04-07 #

  • IDSCryptoManager developed and tested in flutter code
  • Code formatted
  • Code cleanup
void cryptoExample() {
  // Sample payload to encrypt
  Map<String, dynamic> param = {
    "username": "8967564321",
    "countryCode": "+91"
  };

  // Step 1: Convert your data to JSON string
  final jsonData = jsonEncode(param);
  print("Sending this JSON to be encrypted: $jsonData");

  // Step 2: Create an instance of IDSCryptoConfiguration with a secure password
  final crypto = IDSCryptoConfiguration(
    password: 'b6edf65dd8e3db',
  );

  // Step 3: Use the high-level manager to handle encryption/decryption
  final cryptoManager = IDSCryptoManager(crypto: crypto);

  // Step 4: Encrypt the data
  final encrypted = cryptoManager.encryptText(jsonData);
  print('\nEncrypted Text:\n$encrypted\n');

  // Step 5: Decrypt the data back to its original form
  final decrypted = cryptoManager.decryptText(encrypted);
  print('Decrypted Text:\n$decrypted');
}

3.8.1 - 2025-03-04 #

  • kSizeBox and kSizeBoxWidth added 1 to 100 and more use dynamic functions

new kHeight & kWidth Usage example, it will support n- number of parameter: #

Widget build(BuildContext context) {
  return Column(
    children: [
      kHeight(10),
      kWidth(10),
    ],
  );
}

3.8.0 - 2025-03-03 #

AppButton - Configurable Button #

πŸ”Ή Basic Button #

Widget showExample() {
  return AppButton(title: "Submit");
}

πŸ”Ή Button with Custom Background & Text Color #

Widget showExample() {
  return AppButton(
    title: "Confirm",
    backgroundColor: Colors.green,
    textColor: Colors.white,
  );
}

πŸ”Ή Button with Click Action #

Widget showExample() {
  return AppButton(
    title: "Tap Me",
    onTap: () {
      print("Button clicked!");
    },
  );
}

πŸ”Ή Button with Custom Size #

Widget showExample() {
 return AppButton(
    title: "Large Button",
    height: 80,
    width: 200,
  );
}

AppButton is fully configurable & functional! πŸš€πŸ”₯

AppBorderButton - Configurable Border Button #

A customizable bordered button widget for Flutter.

πŸ›  Features #

  • Customizable title, text color, and background
  • Customizable border color and radius
  • Adjustable height and width
  • Clickable with onTap action

βœ… Example Usage #

πŸ”Ή Basic Button #

Widget showExample() {
  return AppBorderButton(title: "Submit");
}

πŸ”Ή Button with Custom Colors #

Widget showExample() {
 return AppBorderButton(
    title: "Confirm",
    borderColor: Colors.blue,
    textColor: Colors.blue,
  );
}

πŸ”Ή Button with Custom Size #

Widget showExample() {
 return AppBorderButton(
    title: "Large Button",
    height: 80,
    width: 200,
  );
}

πŸ”Ή Button with Click Action #

Widget showExample() {
 return AppBorderButton(
    title: "Tap Me",
    onTap: () {
      print("Button clicked!");
    },
  );
}

AppBorderButton is fully configurable & functional! πŸš€πŸ”₯

IDSButton - Configurable Button Widget #

A customizable button widget for Flutter.

πŸ›  Features #

  • Customizable title, text color, and background
  • Adjustable height, width, and border radius
  • Supports custom padding and text styles
  • Clickable with onPressed action
  • Optional border support

βœ… Example Usage #

πŸ”Ή Basic Button #

Widget showExample() {
  return IDSButton(
    title: "Submit",
    onPressed: () {
      print("Button clicked!");
    },
  );
}

πŸ”Ή Button with Custom Background & Text Color #

Widget showExample() {
  return IDSButton(
    title: "Confirm",
    onPressed: () {
      print("Confirmed!");
    },
    backgroundColor: Colors.green,
    textColor: Colors.white,
  );
}

πŸ”Ή Button with Custom Size #

Widget showExample() {
 return IDSButton(
    title: "Large Button",
    onPressed: () {
      print("Large button clicked!");
    },
    height: 80,
    width: 200,
  );
}

πŸ”Ή Button with Custom Text Style #

Widget showExample() {
 return IDSButton(
    title: "Styled Button",
    onPressed: () {
      print("Styled button clicked!");
    },
    textStyle: TextStyle(
      fontSize: 20,
      fontWeight: FontWeight.w600,
      color: Colors.orange,
    ),
  );
}

πŸ”Ή Button with Border #

Widget showExample() {
 return IDSButton(
    title: "Outlined Button",
    onPressed: () {
      print("Outlined button clicked!");
    },
    backgroundColor: Colors.transparent,
    textColor: Colors.blue,
    border: Border.all(color: Colors.blue, width: 2),
  );
}

πŸš€ IDSButton is fully configurable & functional πŸ”₯

 Widget showProgress() {
  return  Padding(
    padding: EdgeInsets.zero,
    child: UIProgressIndicator(
      progressValue: 0.5,
      height: 12,
      activeColor: AppColors.stepActiveColor,
      inactiveColor: AppColors.stepInActiveColor,
    ),
  );
}
 Widget showStepProgress() {
  return  Padding(
    padding: EdgeInsets.zero,
    child: UIStepProgressWidget(
      totalSteps: 4,
      currentStep: currentStep,
      height: 12,
      activeColor: AppColors.stepActiveColor,
      inactiveColor: AppColors.stepInActiveColor,
      horizontalMargin: 5,
    ),
  );
}

IDSDialog #

A universal Flutter dialog utility for displaying simple alert dialogs with a title and an "OK" button.

Usage Basic Example #

Customizing Text and Button #

void showDialog() {
  ElevatedButton(
    onPressed: () {
      IDSDialog.showMessage(
        context: context,
        message: "Custom Styled Dialog!",
        buttonText: "Close",
        textStyle: TextStyle(fontSize: 20, fontWeight: FontWeight.w600, color: Colors.blue),
        buttonTextStyle: TextStyle(fontSize: 16, color: Colors.red),
      );
    },
    child: Text("Show Dialog"),
  );
}

Allowing Dismiss on Tap Outside #

void showDialog() {
  ElevatedButton(
    onPressed: () {
      IDSDialog.showMessage(
        context: context,
        message: "Tap outside to close",
        barrierDismissible: true, // Allows closing the dialog by tapping outside
      );
    },
    child: Text("Show Dialog"),
  );
}

Simple use cases #

void showDialog() {
  ElevatedButton(
    onPressed: () {
      IDSDialog.showMessage(
        context: context,
        message: "Hello!, This is simple IDS material SDK dialog",
      );
    },
    child: Text("Show Dialog"),
  );
}

Features #

  • Simple and reusable.
  • Customizable title and button text.
  • Customizable text styles.
  • Supports barrierDismissible to allow or prevent dismissal by tapping outside.

3.7.0 - 2025-02-15 #

  • IDSApiManager().postFormDataInBg in this function method type added as IDSMethodType.post use the below code snippet
IDSMethodType method;
void validateRequest() {
  var request4 = {"UserName": "ddd", "Password": "ddd"};
  final Future<Map<String, dynamic>> apiResponse5 = IDSApiManager()
          .postFormDataInBg("http://ids.com/api/v1/login", request4,
          {"Connection": "keep-alive"}, IDSMethodType.post);
  apiResponse5.then((response) => {IDSHelper.debugJSON(response)});
}
  • Here’s an example demonstrating how to use the sendFormRequest method for different HTTP methods:

 class ApiService {
  final IDSApiManager _apiManager = IDSApiManager(); // Replace with actual API manager instance

  /// Logs in the user with a username and password.
  Future<dynamic> loginUser() async {
    return await _apiManager.sendFormRequest(
      endPoint: "https://api.example.com/login",
      param: {
        "username": "test_user",
        "password": "secure_password"
      },
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
        "Authorization": "Bearer your_token"
      },
      method: IDSMethodType.post,
    );
  }

  /// Fetches a list of users with pagination.
  Future<dynamic> getUsers() async {
    return await _apiManager.sendFormRequest(
      endPoint: "https://api.example.com/users",
      param: {
        "page": "1",
        "limit": "10"
      },
      headers: {
        "Authorization": "Bearer your_token"
      },
      method: IDSMethodType.get,
    );
  }

  /// Updates a user's details.
  Future<dynamic> updateUser() async {
    return await _apiManager.sendFormRequest(
      endPoint: "https://api.example.com/user/123",
      param: {
        "name": "Updated Name",
        "email": "updated_email@example.com"
      },
      headers: {
        "Authorization": "Bearer your_token"
      },
      method: IDSMethodType.put,
    );
  }

  /// Deletes a user by ID.
  Future<dynamic> deleteUser() async {
    return await _apiManager.sendFormRequest(
      endPoint: "https://api.example.com/user/123",
      param: {}, // DELETE requests usually don't need a body
      headers: {
        "Authorization": "Bearer your_token"
      },
      method: IDSMethodType.delete,
    );
  }
}

void main() async {
  final apiService = ApiService();

  print("Logging in...");
  final loginResponse = await apiService.loginUser();
  print("Login Response: $loginResponse\n");

  print("Fetching Users...");
  final usersResponse = await apiService.getUsers();
  print("Users Response: $usersResponse\n");

  print("Updating User...");
  final updateResponse = await apiService.updateUser();
  print("Update Response: $updateResponse\n");

  print("Deleting User...");
  final deleteResponse = await apiService.deleteUser();
  print("Delete Response: $deleteResponse\n");
}
  • Example of IDSResponseHandler
 void exampleOfResponseHandler() async {
  dynamic response = await IDSApiManager().sendFormRequest(
    endPoint: "https://api.example.com/user",
    param: {},
    headers: {},
    method: IDSMethodType.get,
  );

  if (IDSResponseHandler.isJsonObject(response)) {
    Map<String, dynamic> userData = IDSResponseHandler.asJsonObject(response);
    print("User ID: ${userData['id']}");
  }

  if (IDSResponseHandler.isJsonArray(response)) {
    List<dynamic> products = IDSResponseHandler.asJsonArray(response);
    print("First product: ${products[0]}");
  }

  if (IDSResponseHandler.asString(response)) {
    String statusMessage = IDSResponseHandler.asString(response);
    print("First product: $statusMessage");
  }
}

  • sendRequest

Benchmark API for IDSApiManager().sendRequest Method #

This API is designed to test the sendRequest function, which supports GET, POST, PUT, PATCH, DELETE HTTP methods with JSON payloads.

🏠 Base URL #


πŸ“Œ 1. GET Request - Fetch Data #

Endpoint: #

Query Parameters: #

Parameter Type Required Description
page int ❌ Page number (default: 1)
limit int ❌ Number of records per page (default: 10)

Example Usage in IDSApiManager().sendRequest: #

 void getExample() async {
  final response = await IDSApiManager().sendRequest(
    endPoint: "https://benchmarkapi.example.com/users",
    param: { "page": 1, "limit": 10 },
    headers: { "Authorization": "Bearer your_token" },
    method: IDSMethodType.get,
  );

  print(response);
}
{
  "status": 200,
  "data": [
    { "id": 1, "name": "Alice Doe", "email": "alice@example.com" },
    { "id": 2, "name": "Bob Smith", "email": "bob@example.com" }
  ]
}
  • πŸ“Œ 2. POST Request - Create User
  • Endpoint: POST /users
  • Request Body:
{
  "name": "John Doe",
  "email": "john.doe@example.com"
}

Example Usage in IDSApiManager().sendRequest: #

void postExample() async {
  final response = await IDSApiManager().sendRequest(
    endPoint: "https://benchmarkapi.example.com/users",
    param: { "name": "John Doe", "email": "john.doe@example.com" },
    headers: {
      "Content-Type": "application/json",
      "Authorization": "Bearer your_token"
    },
    method: IDSMethodType.post,
  );

  print(response);
}
{
  "status": 201,
  "message": "User created successfully",
  "user": {
    "id": 123,
    "name": "John Doe",
    "email": "john.doe@example.com"
  }
}

  • πŸ“Œ 3. PUT Request - Update User
  • Endpoint: PUT /users/{id}

Example Usage in IDSApiManager().sendRequest #

void putExample()  async {
  final response = await IDSApiManager().sendRequest(
    endPoint: "https://benchmarkapi.example.com/users/123",
    param: { "name": "John Updated", "email": "john.updated@example.com" },
    headers: { "Authorization": "Bearer your_token" },
    method: IDSMethodType.put,
  );

  print(response);
}
{
  "status": 200,
  "message": "User updated successfully"
}

  • πŸ“Œ 4. PATCH Request - Partial Update
  • Endpoint: PATCH /users/{id}

Example Usage in IDSApiManager().sendRequest: #

void patchExample() async {
  final response = await IDSApiManager().sendRequest(
    endPoint: "https://benchmarkapi.example.com/users/123",
    param: { "email": "new.email@example.com" },
    headers: { "Authorization": "Bearer your_token" },
    method: IDSMethodType.patch,
  );

  print(response);
}
{
  "status": 200,
  "message": "User email updated successfully"
}

  • πŸ“Œ 5. DELETE Request - Remove User
  • Endpoint: DELETE /users/{id}

Example Usage in IDSApiManager().sendRequest: #

void deleteExample() async {
  final response = await IDSApiManager().sendRequest(
    endPoint: "https://benchmarkapi.example.com/users/123",
    param: {}, // DELETE usually doesn't require a body
    headers: { "Authorization": "Bearer your_token" },
    method: IDSMethodType.delete,
  );

  print(response);

}
{
  "status": 200,
  "message": "User deleted successfully"
}

πŸ“Œ 6. Benchmarking Performance #

Load Testing with _sendRequest #

  • Measure response time using DateTime.now().
  • Test with JMeter, k6, or Locust.
  • Use a loop to send multiple concurrent requests.

Example Dart Code for Benchmarking #

  void benchmarkAPI() async {
  final stopwatch = Stopwatch()..start();

  for (int i = 0; i < 10; i++) {
    await sendRequest(
      endPoint: "https://benchmarkapi.example.com/users",
      param: {},
      headers: { "Authorization": "Bearer your_token" },
      method: IDSMethodType.get,
    );
  }

  stopwatch.stop();
  print("Total execution time: ${stopwatch.elapsedMilliseconds} ms");
}

benchmarkAPI();

3.6.0 - 2025-02-12 #

  • Bug fixing and code optimisation
import 'package:ids_material_sdk/public/index.dart';

void loaderExample() async {
  IDSLoader(context).showLoader();
  try {
    await Future.delayed(Duration(seconds: 3)); // Simulate a network call
  } finally {
    IDSLoader(context).hideLoader();
  }
}

3.5.1 - 2025-02-11 #

  • Public access added

3.5.0 - 2025-02-11 #

Added #

  • uploadMultiPartFormData: This function allows uploading multiple files of any type (e.g., images, PDFs, videos, audio, documents) in a single request using multipart form data.
  • IDSDownloadManager: Introduced a new feature to efficiently manage file downloads, providing support for pause, resume, and retry capabilities with enhanced error handling.
  • IDSChipsRadioGroup: Introduced a new feature to efficiently manage option selections using chip-styled radio buttons. Provides support for dynamic option updates, state synchronization, and enhanced UI customization with properties like background color, text color, and border.
  • IDSInternetChecker – Reliable Internet Monitoring Utility
  • On-Demand Connectivity Check:
    • Use isConnected() to verify the current internet connection whenever required, such as before making API calls.
  • Real-Time Connectivity Notifications:
    • The onConnectionChange stream allows the app to react to connectivity changes immediately. For example:
      • Display a banner when the internet is lost.
      • Automatically retry failed requests when the connection is restored.
  • Cross-Platform Support: Works seamlessly across Android, iOS, Web, and Desktop platforms.

Improved #

  • Enhanced file handling capabilities to support a wider range of file formats.
  • Optimized network requests for better performance with large file uploads.

Fixed #

  • Resolved minor bugs related to file upload error handling and response parsing.

Example of uploadMultiPartFormData #

  void uploadFileWithData() async {

    final response = await uploadMultiPartFormData(
      endPoint: "https://example.com/upload",
      payloadParams: {
        'userId': '12345',
        'description': 'Uploading multiple files',
      },
      fileUploads: {
        'profileImage': ['path/to/profile_image.jpg'],
        'document': ['path/to/document.pdf'],
        'audioClip': ['path/to/audio.mp3'],
        'files':['path/to/audio.mp3', 'path/to/video.mpv4', 'path/to/images.jpg']
      },
      headers: {
        'Authorization': 'Bearer your_token_here',
        'Content-Type': 'multipart/form-data',
      },
      method: IDSMethodType.POST,
    );
  
    if (response['success']) {
      print('Files uploaded successfully!');
    } else {
      print('Upload failed: ${response['error']}');
    }
}

Example of IDSDownloadManager download files #

  /// Example usage demonstrating how to use the [IDSDownloadManager] to download files
  /// import this line  import 'package:ids_material_sdk/downloads/index.dart';
  void exampleUsage(String fileUrl) {
    IDSDownloadManager.instance.download(
      url: fileUrl,
      success: (fileBytes) async {
        // Handle successful download, e.g., display the file
        //print('Download successful. File size: ${fileBytes.lengthInBytes} bytes');
        /* /// path_provider add this in your pub file if not exist
        final fileName = fileUrl.split('/').last;
        final tempDir = await getTemporaryDirectory();
        final file = File('${tempDir.path}/$fileName');
        await file.writeAsBytes(fileBytes.lengthInBytes as List<int>);*/
      },
      failure: (error) {
        // Handle download error
        //print('Download failed with error: $error');
      },
    );
  }

Example of IDSChipsRadioGroup #

 
    String _selectedValue = "";
    /// Use this function to create the widget
    Widget buildRadioGroup() {
      return IDSChipsRadioGroup(
        options: ["Yes", "No"],
        selectedOption: _selectedValue,
        onChanged: (value) {
          setState(() {
            _selectedValue = value;
          });
        },
        chipsHeight: 40,
        chipsSelectedBgColor: Colors.indigoAccent,
      );
    }

How They Work Together #

Both IDSChipsRadioGroup and IDSInternetChecker enhance the overall user experience:

  • IDSChipsRadioGroup improves the visual interaction for option selection, offering a modern and responsive design.
  • IDSInternetChecker ensures the app can dynamically respond to internet connectivity, providing seamless offline and online transitions. These utilities help create robust, user-friendly apps that are both visually appealing and functionally reliable.
  /// Internet connection example
  Future<void> checkConnection() async {
    // 1. Check the current internet connection status
    bool isConnected = await IDSInternetChecker.isConnected();

    // 2. Listen for changes in internet connectivity status
    IDSInternetChecker.onConnectionChange.listen((isConnected) {
      if (isConnected) {
        // 3. Handle internet reconnection
        if (kDebugMode) {
          print("Internet reconnected");
        }
      } else {
        // 4. Handle internet disconnection
        if (kDebugMode) {
          print("Internet connection lost");
        }
      }
    });
  }

3.4.0 #

  • IDSExpandableCard components created

  • uploadMultiPartFormData api error handling did that

  • Code snippet added in the example file function name = uploadFormData

3.3.0 #

  • uploadMultiPartFormData api create to upload the multiple or single file in the form
  • Code clean up and formation
  • SDK API name uploadMultiPartFormData

3.2.0 #

  • index.dart file added to avoid multiple file import
  • IDSTextArea UI issues fixes
  • Multidrop down code format issue fixed

3.1.0 #

  • ids_multiselect_drop_down.dart code formatting issue fixed
  • SearchArrayDialog created code snippet available in example code.

3.0.1 #

  • Bug fixes of the bottom nav bar. below configuration property added in the bottom nav bar
  • this.enableTopShadow = true,
    
  • this.blurRadius = 2.0,
    
  • this.spreadRadius = 0.2,
    
  • this.offset = -2,
    
  • this.shadowColor = Colors.black12,
    

3.0.0 #

  • IDSBottomNavigationAppBar widget created
  • IDSBottomNavigationAppBar this widget is fully customizable as per the user case of the app
  • Code snippet https://github.com/vinod1988/ids_bottom_nav_bar_example
  • IDSTextAreaTitle formatting issue fixed
  • IDSTextArea formatting issue fixed

2.8.8 #

  • IDSTextAreaTitle widget added in the material sdk
  • IDSTextArea widget added in the material sdk

2.8.7 #

  • IDSDropdownTitle widget added in the material sdk

2.8.6 #

  • IDSFieldTitle widget added in the material sdk
  • code formatted as per dart formatter
  • code clean up and widget optimization

2.8.5 #

  • postFormDataInBg 500 error handle and send back in response
  • IDSNumberTextField created to user only number fields in the form
  • IDSUITextField keyboard type parameter added in the constructor

2.8.4 #

  • postFormDataInBg return type changed to Map<String, dynamic>

2.8.3 #

  • UIPasswordField parameter issue fixed. below lib version upgraded
  • xml: ^6.5.0
  • logger: ^2.5.0
  • states_rebuilder: ^6.4.0 _

2.8.2 #

  • Example code added
  • 500 server error print in the log, for debugging purpose only
  • Readme file updated
  • UIPasswordField suffix icon added for password show and hide functionality

2.8.1 #

  • Error Handling: Implement robust error handling mechanisms for all Payment Authorization Interface (PAI) processes to gracefully handle 500 errors.
  • Documentation Update: Update the existing documentation to reflect the latest implementation changes and best practices.
  • Code Optimization: Review and optimize the codebase for performance and efficiency.
  • Security Enhancement: Conduct a thorough security audit and implement necessary measures to strengthen the system's security posture.

2.8.0 #

  • postFormDataInBgArray [when api return the array response]

2.7.0 #

  • Document updated

2.6.0 #

  • PasswordField
  • Documentations

2.5.0 #

  • UITextField
  • Networking services enhancements

2.4.0 #

  • APi logic separated

2.3.0 #

  • Form data request api implemented

2.2.1 #

  • API bug fixing

2.2.0 #

  • Networking api added
  • Custom Button Style
  • Constants
  • Networking logger

2.1.0 #

  • Optimization

2.0.1 #

  • SKD upgraded to support 3.3

2.0.0 #

  • New html widget added

1.0.2 #

  • drop down key name changed

1.0.1 #

  • Drop down html content issue fixed

1.0.0 #

  • Version 1.0 released

0.0.3 #

  • TODO: Describe initial release.

0.0.2 #

  • TODO: Describe initial release.

0.0.1 #

  • TODO: Describe initial release.
27
likes
150
points
188
downloads

Documentation

API reference

Publisher

verified publisherivandigitalsolutions.com

Weekly Downloads

IDS Material SDK for Flutter offers fast networking, cache optimisation, custom widgets like Multi-Select DropDown, theming tools, and performance boosts to reduce server costs.

Repository (GitHub)

License

MIT (license)

Dependencies

connectivity_plus, crypto, encrypt, flutter, flutter_html, html_unescape, http, internet_connection_checker, intl, logger, states_rebuilder, xml

More

Packages that depend on ids_material_sdk