<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Taniksha Sharma</title>
    <description>The latest articles on DEV Community by Taniksha Sharma (@taniksha_sharma05).</description>
    <link>https://dev.to/taniksha_sharma05</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3315752%2F2ca22d59-0e86-476a-8c2a-aea71518aeb3.png</url>
      <title>DEV Community: Taniksha Sharma</title>
      <link>https://dev.to/taniksha_sharma05</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/taniksha_sharma05"/>
    <language>en</language>
    <item>
      <title>Setting Up Flavors in Flutter for Android and iOS</title>
      <dc:creator>Taniksha Sharma</dc:creator>
      <pubDate>Mon, 27 Oct 2025 13:51:35 +0000</pubDate>
      <link>https://dev.to/taniksha_sharma05/setting-up-flavors-in-flutter-for-android-and-ios-pk2</link>
      <guid>https://dev.to/taniksha_sharma05/setting-up-flavors-in-flutter-for-android-and-ios-pk2</guid>
      <description>&lt;p&gt;Managing multiple environments in a Flutter app—like local, staging, and production—can be tricky if you don’t have a clean setup. In this blog, I’ll walk you through how I implemented flavors in my Flutter app, covering both Android and iOS, including MethodChannels, Xcode changes, and Flutter setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Flavors?&lt;/strong&gt;&lt;br&gt;
Flavors allow you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep separate configurations for local, staging, and production.&lt;/li&gt;
&lt;li&gt;Use different API URLs, app names, and assets for each environment.&lt;/li&gt;
&lt;li&gt;Avoid accidentally hitting production APIs during development.&lt;/li&gt;
&lt;li&gt;Customize app behavior per environment (e.g., showing banners for staging/local builds).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Android Setup&lt;/strong&gt;&lt;br&gt;
For Android, I used product flavors in app/build.gradle. Here’s a simplified setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;android {
    ...

    flavorDimensions "default"

    productFlavors {
        create("local") {
            dimension = "default"
            applicationId = "com.example.app"
            resValue("string", "app_name", "App Local")
            resValue("string", "flavor_name", "local")
            resValue("string", "base_url", "https://local.app")
        }

        create("staging") {
            dimension = "default"
            applicationId = "com.example.app"
            resValue("string", "app_name", "App Staging")
            resValue("string", "flavor_name", "staging")
            resValue("string", "base_url", "https://stg.app.com")
        }

        create("production") {
            dimension = "default"
            applicationId = "com.example.app"
            resValue("string", "app_name", "AppName")
            resValue("string", "flavor_name", "production")
            resValue("string", "base_url", "https://prod.app.com")
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Reading Flavors in Kotlin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In your MainActivity.kt, you can read flavor-specific values using a MethodChannel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : FlutterActivity() {
    private val CHANNEL = "app_config"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
            .setMethodCallHandler { call, result -&amp;gt;
                when (call.method) {
                    "getFlavor" -&amp;gt; result.success(getString(R.string.flavor_name))
                    "getBaseUrl" -&amp;gt; result.success(getString(R.string.base_url))
                    else -&amp;gt; result.notImplemented()
                }
            }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;iOS Setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;iOS requires a bit more configuration with schemes, configurations, and .xcconfig files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create .xcconfig Files&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inside ios/Flutter, create three files:&lt;br&gt;
local.xcconfig&lt;br&gt;
staging.xcconfig&lt;br&gt;
production.xcconfig&lt;/p&gt;

&lt;p&gt;Example for production.xcconfig:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include "Flutter/Generated.xcconfig"
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release-production.xcconfig"

APP_NAME = Jumpick
BASE_URL_SCHEME = https
BASE_URL_HOST = prod.app.com

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Similarly, configure local.xcconfig and staging.xcconfig with the respective names and URLs as we did for android.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Info.plist Changes&lt;/strong&gt;&lt;br&gt;
In Info.plist, use placeholders for app name and base URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;key&amp;gt;CFBundleDisplayName&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;$(APP_NAME)&amp;lt;/string&amp;gt;

&amp;lt;key&amp;gt;BASE_URL&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;$(BASE_URL_SCHEME)://$(BASE_URL_HOST)&amp;lt;/string&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Create MethodChannel in Swift&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In AppDelegate.swift, fetch the base URL for Flutter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  // ✅ Create channel
       if let controller = window?.rootViewController as? FlutterViewController {
           let channel = FlutterMethodChannel(name: "app_config", binaryMessenger: controller.binaryMessenger)

           channel.setMethodCallHandler { (call: FlutterMethodCall, result: @escaping FlutterResult) in
                   if call.method == "getBaseUrl" {
                     if let baseUrl = Bundle.main.object(forInfoDictionaryKey: "BASE_URL") as? String {
                       result(baseUrl)
                     } else {
                       result(nil)
                     }
                   } else {
                     result(FlutterMethodNotImplemented)
                   }
                 }
               }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Schemes and Configurations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create new schemes for each flavor (Runner-local, Runner-staging, Runner-production).&lt;/li&gt;
&lt;li&gt;Add Debug/Release configurations per flavor in Xcode.&lt;/li&gt;
&lt;li&gt;Map each configuration to the corresponding .xcconfig file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See below images for reference&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1frlryukgpdlbaicql1e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1frlryukgpdlbaicql1e.png" alt="flutter flavor xcode 1" width="752" height="516"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm83mkb05yoqjdqgcl4t7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm83mkb05yoqjdqgcl4t7.png" alt="flutter flavor xcode 2" width="800" height="321"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hmfeqp3iampkzdacj19.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hmfeqp3iampkzdacj19.png" alt="Iflutter flavor xcode 3" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flutter Setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a singleton AppConfig to fetch the base URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'dart:io';
import 'package:flutter/services.dart';

class AppConfig {
  static const _defaultBaseUrl = "https://prod.app.com";
  static const MethodChannel _channel = MethodChannel("app_config");
  static String? _cachedBaseUrl;

  static Future&amp;lt;String&amp;gt; get baseUrl async {
    if (_cachedBaseUrl != null) return _cachedBaseUrl!;
    if (Platform.isAndroid || Platform.isIOS) {
      try {
        _cachedBaseUrl = await _channel.invokeMethod&amp;lt;String&amp;gt;("getBaseUrl") ?? _defaultBaseUrl;
      } on PlatformException {
        _cachedBaseUrl = _defaultBaseUrl;
      }
    } else {
      _cachedBaseUrl = _defaultBaseUrl;
    }
    return _cachedBaseUrl!;
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Show Environment Banner&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In main.dart, show a small banner for local/staging:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Demo App',
      debugShowCheckedModeBanner: false,
      theme: lightTheme,
      darkTheme: darkTheme,
      themeMode: themeController.theme,
      initialRoute: AppPages.initial,
      getPages: AppPages.routes,

      builder: (context, child) {
        final originalScaler = MediaQuery.of(context).textScaler;
        final clampedScaler = originalScaler.clamp(
          minScaleFactor: 1.0,
          maxScaleFactor: 1.4,
        );

        Widget content = MediaQuery(
          data: MediaQuery.of(context).copyWith(textScaler: clampedScaler),
          child: child!,
        );

        // Add banner only if staging
        if (ApiConstants.baseUrl.contains("stg")) {
          content = Banner(
            message: "STAGING",
            location: BannerLocation.topEnd,
            color: Colors.orange.withValues(alpha: 0.8),
            textStyle: const TextStyle(
              fontWeight: FontWeight.bold,
              fontSize: 12,
            ),
            child: content,
          );
        }
        else if (ApiConstants.baseUrl.contains("local")) {
          content = Banner(
            message: "LOCAL",
            location: BannerLocation.topEnd,
            color: Colors.green.withValues(alpha: 0.85),
            textStyle: const TextStyle(fontWeight: FontWeight.bold, fontSize: 12),
            child: content,
          );
        }


        return content;
      },
    );


  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes it visually clear which environment is running. See below images for reference.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foptshjef00teocbh1ebw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foptshjef00teocbh1ebw.png" alt="flutter flavor banner 1" width="624" height="180"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyvj6vdysfoh48at7el6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyvj6vdysfoh48at7el6m.png" alt="flutter flavor banner 2" width="626" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install your app through android studio or xcode refer below screenshots. For android create new configurations from top bar. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdmx13x741m5nz1mjhmxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdmx13x741m5nz1mjhmxk.png" alt="flutter flavor android studio config1" width="800" height="681"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge38wfzbfajo9chqol9f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge38wfzbfajo9chqol9f.png" alt="flutter flavor android studio config2" width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TO BUILD APP THROUGH COMMANDS:&lt;br&gt;
&lt;strong&gt;ANDROID&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter build appbundle \
                      --flavor staging \
                      -t lib/main.dart \
                      --release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;IOS&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; xcodebuild clean -workspace Runner.xcworkspace \
                                   -scheme Runner-staging \
                                   -configuration Release-staging

                  # Archive the build with explicit overrides
                     xcodebuild -workspace Runner.xcworkspace \
                     -scheme Runner-staging \
                     -configuration Release-staging \
                     -archivePath build/Runner-staging.xcarchive \
                     DEVELOPMENT_TEAM="$DEV_TEAM_ID" \
                     CODE_SIGN_STYLE=Automatic \
                     archive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Wrap Up&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up flavors properly saves a lot of headaches. With the above setup:&lt;/li&gt;
&lt;li&gt;Android flavors are easy via build.gradle.&lt;/li&gt;
&lt;li&gt;iOS flavors are manageable with .xcconfig files and schemes.&lt;/li&gt;
&lt;li&gt;Flutter can dynamically fetch the correct base URL or flavor.&lt;/li&gt;
&lt;li&gt;You can display banners to avoid confusion during testing.&lt;/li&gt;
&lt;li&gt;This setup makes switching environments seamless, helps with testing, and prevents accidental API calls to production during development.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dart</category>
      <category>flutter</category>
      <category>flutterflavor</category>
      <category>mobile</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Taniksha Sharma</dc:creator>
      <pubDate>Mon, 27 Oct 2025 06:22:10 +0000</pubDate>
      <link>https://dev.to/taniksha_sharma05/-285b</link>
      <guid>https://dev.to/taniksha_sharma05/-285b</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/taniksha_sharma05" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3315752%2F2ca22d59-0e86-476a-8c2a-aea71518aeb3.png" alt="taniksha_sharma05"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/taniksha_sharma05/flutter-write-less-do-more-supercharge-your-flutter-apps-with-mplix-extensions-4ik5" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Flutter Write Less, Do More: Supercharge Your Flutter Apps with Mplix Extensions&lt;/h2&gt;
      &lt;h3&gt;Taniksha Sharma ・ Jul 2&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#flutter&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#dart&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#pubdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>flutter</category>
      <category>dart</category>
      <category>mobile</category>
      <category>pubdev</category>
    </item>
    <item>
      <title>Flutter Zoom Meeting - Easily Integrate Zoom Meeting into Flutter with : flutter_zoom_wrapper</title>
      <dc:creator>Taniksha Sharma</dc:creator>
      <pubDate>Wed, 02 Jul 2025 08:16:55 +0000</pubDate>
      <link>https://dev.to/taniksha_sharma05/zoom-meeting-easily-integrate-zoom-meeting-into-flutter-with-flutterzoomwrapper-29d7</link>
      <guid>https://dev.to/taniksha_sharma05/zoom-meeting-easily-integrate-zoom-meeting-into-flutter-with-flutterzoomwrapper-29d7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Video conferencing is now a core part of many apps in domains like healthcare and educational — but integrating Zoom natively in Flutter has been a challenge for both Android and iOS platforms...&lt;/p&gt;

&lt;p&gt;I developed &lt;a href="https://pub.dev/packages/flutter_zoom_wrapper" rel="noopener noreferrer"&gt;flutter_zoom_wrapper&lt;/a&gt; to help you seamlessly integrate Zoom into your Flutter apps, without digging deep into native code.&lt;/p&gt;

&lt;p&gt;This blog will guide you step-by-step on how to install, configure, and use the package to join Zoom meetings with ease.&lt;/p&gt;

&lt;p&gt;Why I Built This - &lt;/p&gt;

&lt;p&gt;While working on apps that required Zoom meetings, I found existing solutions were either incomplete or outdated&lt;/p&gt;

&lt;p&gt;So we built &lt;strong&gt;&lt;a href="https://pub.dev/packages/flutter_zoom_wrapper" rel="noopener noreferrer"&gt;flutter_zoom_wrapper&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple Dart API&lt;/li&gt;
&lt;li&gt;Native Zoom SDK support for Android and iOS&lt;/li&gt;
&lt;li&gt;JWT &amp;amp; SDK key-based auth&lt;/li&gt;
&lt;li&gt;Highly customizable meeting options&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it’s now available for everyone on pub.dev.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How It Works - Let's Get Started&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 1: In Your pubspec.yaml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dependencies:
  flutter_zoom_wrapper: ^0.0.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run -   flutter pub get&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Download Zoom SDKs (Required)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Download SDKs from zoom marketplace : &lt;a href="https://marketplace.zoom.us/" rel="noopener noreferrer"&gt;https://marketplace.zoom.us/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create general app and from Embed section download below sdk versions or latest available compatible versions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android SDK: v6.3.1.26548&lt;br&gt;
iOS SDK: v6.4.10.25465&lt;br&gt;
SDK Key and SDK Secret will be on the marketplace.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Step 3: Android Native Setup - (As SDK files are large and not available on github so require to update .pub-cache folder for flutter_zoom_wrapper *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;em&gt;~/.pub-cache/hosted/pub.dev/flutter_zoom_wrapper-0.0.4/android&lt;/em&gt;&lt;br&gt;
Create a libs folder inside android.&lt;/p&gt;

&lt;p&gt;Copy Mobilertc.aar file which is available in the downloaded sdk folder and paste it in the above path.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add required permissions in AndroidManifest.xml:
&amp;lt;uses-permission android:name="android.permission.INTERNET"/&amp;gt;
&amp;lt;uses-permission android:name="android.permission.RECORD_AUDIO"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Android side setup is done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: iOS Native Setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to  &lt;em&gt;~/.pub-cache/hosted/pub.dev/flutter_zoom_wrapper-0.0.4/ios&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Create a ZoomSDK folder.&lt;/p&gt;

&lt;p&gt;Copy &lt;strong&gt;MobileRTC.xcframework&lt;/strong&gt; and &lt;strong&gt;MobileRTCResources.bundle&lt;/strong&gt; which is available in the downloaded SDK folder and paste it in the above path.&lt;/p&gt;

&lt;p&gt;Add required permissions in Info.plist of your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;key&amp;gt;NSCameraUsageDescription&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;This app uses your camera for Zoom meetings&amp;lt;/string&amp;gt;
&amp;lt;key&amp;gt;NSMicrophoneUsageDescription&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;This app uses your mic for Zoom meetings&amp;lt;/string&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in your project IOS project, Paste MobileRTCResources.bundle inside runner.&lt;br&gt;
Run pod install.&lt;br&gt;
IOS setup is done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The .aar for android and .xcframework and .bundle files for ios  must be placed in the correct location for the plugin to function properly.&lt;/p&gt;

&lt;p&gt;If the package is updated in future, then the zoom SDK files need to be updated, in the updated package location according to the version number..  ~/.pub-cache/hosted/pub.dev/flutter_zoom_wrapper-0.0.4&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Now Let’s use this package in your flutter project.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;import 'package:flutter_zoom_wrapper/flutter_zoom_wrapper.dart';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Give your SDK key and secret to generate a JWT token, which is required for initializing the SDK and joining the meeting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Future&amp;lt;void&amp;gt; _initializeZoomSDK() async {
    final sdkKey = _sdkKeyController.text.trim();
    final sdkSecret = _sdkSecretController.text.trim();

    if (sdkKey.isEmpty || sdkSecret.isEmpty) {
      _appendLog('❗ Please enter both SDK Key and SDK Secret.');
      return;
    }

    try {
      final jwtToken = FlutterZoomWrapper.generateZoomJWT(sdkKey, sdkSecret);
      await FlutterZoomWrapper.initializeZoom(jwtToken);
      debugPrint('✅ Zoom SDK initialized successfully.');
    } catch (e) {
      debugPrint('❌ Error initializing Zoom SDK: $e');
    }
  }

Future&amp;lt;void&amp;gt; _joinZoomMeeting() async {
    final meetingId = _meetingIdController.text.trim();
    final meetingPassword = _meetingPasswordController.text.trim();
    final displayName = _displayNameController.text.trim();


    try {
      await FlutterZoomWrapper.joinMeeting(
        meetingId: meetingId,
        meetingPassword: meetingPassword,
        displayName: displayName,
      );
      debugPrint('📞 Attempting to join the Zoom meeting...');
    } catch (e) {
      debugPrint('❌ Error joining Zoom meeting: $e');
    }
  }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For full Example code, Refer -&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://pub.dev/packages/flutter_zoom_wrapper/example" rel="noopener noreferrer"&gt;Example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find it useful:&lt;br&gt;
🌟 Star the project on GitHub and give like on pub.dev&lt;br&gt;
🗣 Share feedback or feature requests&lt;/p&gt;

&lt;p&gt;Let’s Zoom Together!&lt;br&gt;
Start integrating Zoom into your Flutter app with just a few lines of code — and let us handle the complexity under the hood.&lt;/p&gt;

&lt;p&gt;Happy coding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Result&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2bvmuvrvbicbj7vnrgsd.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2bvmuvrvbicbj7vnrgsd.gif" alt="Image description" width="432" height="768"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>mobile</category>
      <category>zoom</category>
    </item>
    <item>
      <title>Flutter Write Less, Do More: Supercharge Your Flutter Apps with Mplix Extensions</title>
      <dc:creator>Taniksha Sharma</dc:creator>
      <pubDate>Wed, 02 Jul 2025 08:00:39 +0000</pubDate>
      <link>https://dev.to/taniksha_sharma05/flutter-write-less-do-more-supercharge-your-flutter-apps-with-mplix-extensions-4ik5</link>
      <guid>https://dev.to/taniksha_sharma05/flutter-write-less-do-more-supercharge-your-flutter-apps-with-mplix-extensions-4ik5</guid>
      <description>&lt;p&gt;Are you tired of writing the same Flutter boilerplate over and over? &lt;br&gt;
Do you wish there was a cleaner, faster way to build beautiful UI without sacrificing flexibility?&lt;/p&gt;

&lt;p&gt;Enter &lt;code&gt;[mplix](https://pub.dev/packages/mplix)&lt;/code&gt; — a Flutter package designed to simplify your code  and let you build powerful apps with fewer lines.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;mplix&lt;/code&gt;, you get a collection of  production-ready extensions that make your widgets smarter, reusable, and just... fun to use! &lt;/p&gt;

&lt;p&gt;**Why Mplix? — A Developer’s Problem&lt;br&gt;
**Let’s be real: writing a &lt;code&gt;Container&lt;/code&gt;, adding padding, applying rounded corners, adding a gradient, or just logging something during debug... takes too many lines.&lt;br&gt;
What if you could go from this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Container(
  height: 200,
  padding: EdgeInsets.all(16),
  decoration: BoxDecoration(
    borderRadius: BorderRadius.circular(16),
    color: Colors.white,
  ),
  child: Text('Hello'),
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To this:&lt;br&gt;
&lt;code&gt;Text('Hello').asCard(height: 200),&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Clean, readable, and reusable. With &lt;code&gt;mplix&lt;/code&gt;, that’s the default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How It Works - Let's Get Started&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using mplix is as simple as writing plain Flutter — but with superpowers. Once you install the package, you instantly unlock dozens of extensions that drastically reduce boilerplate and make your code more expressive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: In Your pubspec.yaml&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dependencies:&lt;br&gt;
  mplix: ^0.0.11&lt;/code&gt;&lt;br&gt;
Run -   flutter pub get&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Use Extensions to Simplify Your UI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of writing widgets the long way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Container(
  padding: EdgeInsets.all(16),
  decoration: BoxDecoration(
    color: Colors.white,
    borderRadius: BorderRadius.circular(12),
  ),
  child: Text('Hello'),
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can now write:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Text('Hello').asCard(),&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Render Beautiful Images Instantly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Want a nice rounded image card with just a path -&lt;br&gt;
&lt;code&gt;'https://picsum.photos/800/300'.asImageCard(height: 200, radius: 16),&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Whether it's an asset, file, or network image — it just works.&lt;/p&gt;

&lt;p&gt;🧩 All Built With Extension Methods&lt;/p&gt;

&lt;p&gt;Mplix uses Dart's extension methods to make any widget smarter:&lt;/p&gt;

&lt;p&gt;Add tap functionality using .onTap()&lt;/p&gt;

&lt;p&gt;Animate easily with .fadeIn() or .tapScale()&lt;/p&gt;

&lt;p&gt;Add spacing with 16.spacingY() or 8.spacingX()&lt;/p&gt;

&lt;p&gt;Build cards, glassmorphism, gradients, and blur effects in one line&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try This Mini Demo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Column(
  children: [
    'https://picsum.photos/800/300'.asImageCard(height: 200, radius: 24),
    16.spacingY(),
    Text('Tap Me')
        .asCard()
        .onTap(() =&amp;gt; context.showSnackbar('Hello from Mplix!')),
  ],
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Text('Glass Card').asGlassCard();                         // Frosted glass blur card

Image.asset('pic.png').clipRounded(12);                                       // Clip with corner radius

Image.network(url).clipRounded(12).onImageTapPreview(context, imageProvider: NetworkImage(url)); // Zoomable full preview

'https://picsum.photos/800/300'.asImageCard(
height: 180,
radius: 20,
shadow: true,
onTap: () =&amp;gt; print('Image tapped'),
), //resuable image card, (asset,network or file image)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🤖 Convert :emoji: Codes to Real Emojis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Need to add emoji support in user-generated content like chat messages, bios, or notes?&lt;/p&gt;

&lt;p&gt;With Mplix, just use .withEmojis() on any string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'I love :pizza: and :flutter:'.withEmojis();  
// Output: I love 🍕 and 🐦
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can now let users type natural :emoji: codes, and your app handles the rest—no third-party libraries needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🗓️ Date &amp;amp; Time Utilities — Format in Style&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dealing with date formatting and time calculations in Flutter can be verbose and repetitive.&lt;/p&gt;

&lt;p&gt;Mplix brings you intuitive extensions on DateTime and Duration so you can format and compare time with just one-liners.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DateTime.now().format();               // e.g. "26 Jun 2025"
DateTime.now().format('yyyy-MM-dd');  // e.g. "2025-06-26"
DateTime.now().short;                 // "26/06/25"
DateTime.now().time;                  // "01:15 PM"
DateTime.now().fullDateTime;          // "26 Jun 2025, 01:15 PM"

Duration(seconds: 75).formatted;  // "01:15"
Duration(minutes: 5).formatted;   // "05:00"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🕵️ Smart Date Comparisons&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;myDate.isToday;                      // true if the date is today
myDate.isSameDate(anotherDate);     // compares only day/month/year
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🚀 And That’s Just the Beginning…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mplix isn’t just about styling widgets — it’s about supercharging your Flutter experience from top to bottom.&lt;/p&gt;

&lt;p&gt;Here’s what else you get:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 Smarter Context = Cleaner Code&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;context.width  // Instead of MediaQuery.of(context).size.width
context.height // Instead of MediaQuery.of(context).size.height
context.showSnackbar('Something went wrong');
context.showLoader(message: 'Please wait...');
context.divider          // A themed divider
context.spacing(16) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🌀 Full-Screen Loading &amp;amp; Shimmer Effects&lt;/strong&gt;&lt;br&gt;
Mplix also provides professional full-screen loading overlays and shimmer animations, making your apps feel more modern and responsive with minimal effort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Show a loading spinner with a message:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Container().asLoadingScreen(
  message: "Fetching data...",
  subMessage: "Please wait a moment",
  spinnerColor: Colors.deepPurple,
  spinnerSize: 50,
  spinnerType: LoadingSpinnerType.doubleBounce,
  blur: 6.0,
  backgroundColor: Colors.black.withOpacity(0.6),
);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Add custom icons or images above the spinner:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Container().asLoadingScreen(
  blur: 8.0,
  backgroundColor: Colors.black.withOpacity(0.6),
  customChild: Column(
    mainAxisSize: MainAxisSize.min,
    children: [
      Icon(Icons.cloud_download, size: 60, color: Colors.deepPurple),
      SizedBox(height: 20),
      SpinKitFadingCube(color: Colors.deepPurpleAccent, size: 50),
      SizedBox(height: 20),
      Text("Fetching data...", style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.w600)),
      Text("Please wait a moment", style: TextStyle(color: Colors.white70, fontSize: 14)),
    ],
  ),
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Add shimmer animations to any widget:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Container(height: 20, width: 100, color: Colors.grey).asShimmer(
  baseColor: Colors.grey.shade300,
  highlightColor: Colors.grey.shade100,
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster development&lt;/li&gt;
&lt;li&gt;Cleaner widget trees&lt;/li&gt;
&lt;li&gt;Reusable and composable&lt;/li&gt;
&lt;li&gt;Works with any existing Flutter project&lt;/li&gt;
&lt;li&gt;No learning curve — just shorter syntax&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To know more about mplix visit : &lt;a href="https://pub.dev/packages/mplix/example" rel="noopener noreferrer"&gt;https://pub.dev/packages/mplix/example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find it useful:&lt;br&gt;
🌟 Star the project on GitHub  and hit like on pub.dev&lt;br&gt;
🗣 Share feedback or feature requests&lt;/p&gt;

&lt;p&gt;Mplix helps you focus on what you want to build, not how to structure boilerplate Flutter code.&lt;br&gt;
Start using Mplix in your Flutter app with just a few lines of code — and let us take care of the heavy lifting behind the scenes.&lt;/p&gt;

&lt;p&gt;Happy coding.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>mobile</category>
      <category>pubdev</category>
    </item>
  </channel>
</rss>
