<?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>Forem: Mobile innovation Network</title>
    <description>The latest articles on Forem by Mobile innovation Network (@mobileinnovation).</description>
    <link>https://forem.com/mobileinnovation</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%2F1448772%2Fd8527716-ab64-4c61-ad4f-e069b910f946.png</url>
      <title>Forem: Mobile innovation Network</title>
      <link>https://forem.com/mobileinnovation</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mobileinnovation"/>
    <language>en</language>
    <item>
      <title>CMPToast: Toasts for Compose Multiplatform Projects</title>
      <dc:creator>Mobile innovation Network</dc:creator>
      <pubDate>Mon, 30 Sep 2024 10:45:52 +0000</pubDate>
      <link>https://forem.com/mobileinnovation/cmptoast-toasts-for-compose-multiplatform-projects-28hk</link>
      <guid>https://forem.com/mobileinnovation/cmptoast-toasts-for-compose-multiplatform-projects-28hk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🍞️ CMPToast is a Compose Multiplatform library that simplifies the creation of toasts in your mobile applications. CMPToast stands out for a number of reasons:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform support&lt;/strong&gt;: Works on both Android and iOS, making it perfect for Compose Multiplatform projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customization&lt;/strong&gt;: Easily tailor toasts with properties like background color, text size, and position.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight&lt;/strong&gt;: CMPToast is designed to be light and efficient, so it won't affect your app's performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple integration&lt;/strong&gt;: Just add the dependency, and you're good to go!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Getting Started with CMPToast
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;To get started with CMPToast, simply add the following dependency to your project's build.gradle.kts file:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commonMain.dependencies {
    implementation("network.chaintech:cmptoast:1.0.1")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;br&gt;
🖥️ Platforms Supported&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Android 🤖&lt;/li&gt;
&lt;li&gt;iOS 🍎&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  🎨 Customizing CMPToast
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Let's dive into some practical examples of how to customize your toasts in CMPToast.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt; &lt;br&gt;
&lt;strong&gt;⏳ Short Toast&lt;/strong&gt;&lt;br&gt;
To show a toast with a short duration, you can use the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;showToast(
    message = "This is Short Toast",
    backgroundColor = Color.White,
    textColor = Color.Black,
    duration = ToastDuration.Short
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;br&gt;
&lt;strong&gt;⏳ Long Toast&lt;/strong&gt;&lt;br&gt;
If you need the toast to stay on the screen longer, here's how to show a long-duration toast:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;showToast(
    message = "This is Long Toast",
    backgroundColor = Color.White,
    textColor = Color.Black,
    duration = ToastDuration.Long
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;br&gt;
&lt;strong&gt;📍 Top Toast&lt;/strong&gt;&lt;br&gt;
To position the toast at the top of the screen, use the gravity property:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;showToast(
    message = "This is Top Toast",
    backgroundColor = Color.White,
    textColor = Color.Black,
    gravity = ToastGravity.Top
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;br&gt;
&lt;strong&gt;🎯 Center Toast&lt;/strong&gt;&lt;br&gt;
To center the toast on the screen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;showToast(
    message = "This is Center Toast",
    backgroundColor = Color.White,
    textColor = Color.Black,
    gravity = ToastGravity.Center
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;br&gt;
&lt;strong&gt;🎨 Colored Toast&lt;/strong&gt;&lt;br&gt;
If you want to give your toast a custom color, you can easily do so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;showToast(
    message = "This is Colored Toast",
    backgroundColor = Color(0xFF27AD9D)
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Customizable Properties
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;CMPToast provides several properties that allow you to fully customize your toast notifications.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;message (String)&lt;/strong&gt;: The message text that will be displayed in the toast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gravity (ToastGravity)&lt;/strong&gt;: Specifies where the toast will appear on the screen. You can position it at the top, center, or bottom using values like ToastGravity.Top, ToastGravity.Center, and ToastGravity.Bottom.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;backgroundColor (Color)&lt;/strong&gt;: Allows you to customize the background color of the toast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;textColor (Color)&lt;/strong&gt;: Lets you change the color of the message text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;duration (ToastDuration)&lt;/strong&gt;: Controls how long the toast will be displayed. You can choose between ToastDuration.Short and ToastDuration.Long.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;padding (ToastPadding?)&lt;/strong&gt;: Optional padding for the toast content to adjust the spacing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;textSize (TextUnit)&lt;/strong&gt;: Sets the size of the message text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;topPadding (Int)&lt;/strong&gt;: Adds extra padding to the top of the toast for further positioning customization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;bottomPadding (Int)&lt;/strong&gt;: Adds extra padding to the bottom of the toast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cornerRadius (Int?)&lt;/strong&gt;: Optionally rounds the corners of the toast by specifying a corner radius.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Checkout the complete code on Github&lt;/strong&gt;:&lt;br&gt;
[&lt;a href="https://github.com/Chaintech-Network/CMPToast" rel="noopener noreferrer"&gt;https://github.com/Chaintech-Network/CMPToast&lt;/a&gt;]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Head over to the repository to try it out and contribute to the project!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Feel free to give it a star ⭐ and explore how CMPToast can elevate your user experience with customizable toast notifications in Compose Multiplatform projects.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;Connect with us&lt;/strong&gt; 👇&lt;/p&gt;

&lt;p&gt;[&lt;a href="https://www.linkedin.com/showcase/mobile-innovation-network/" rel="noopener noreferrer"&gt;https://www.linkedin.com/showcase/mobile-innovation-network/&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;[&lt;a href="https://github.com/Chaintech-Network" rel="noopener noreferrer"&gt;https://github.com/Chaintech-Network&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>toast</category>
      <category>composemultiplatform</category>
      <category>cmp</category>
      <category>kmp</category>
    </item>
    <item>
      <title>CountryCodePicker in Compose Multiplatform for Android and iOS</title>
      <dc:creator>Mobile innovation Network</dc:creator>
      <pubDate>Thu, 20 Jun 2024 11:06:03 +0000</pubDate>
      <link>https://forem.com/mobileinnovation/countrycodepicker-in-compose-multiplatform-for-android-and-ios-4c3a</link>
      <guid>https://forem.com/mobileinnovation/countrycodepicker-in-compose-multiplatform-for-android-and-ios-4c3a</guid>
      <description>&lt;p&gt;A CMPCountryCodePicker is country picker library for Compose Multiplatform for Android and iOS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Add the dependency to your &lt;code&gt;build.gradle.kts&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commonMain.dependencies {
    implementation("network.chaintech:cmp-country-code-picker:1.0.0")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Composable
fun CountryPickerBasicTextField(
    mobileNumber: String,
    defaultCountryCode: String,
    onMobileNumberChange: (String) -&amp;gt; Unit,
    onCountrySelected: (country: CountryDetails) -&amp;gt; Unit,
    modifier: Modifier = Modifier,
    defaultPaddingValues: PaddingValues = PaddingValues(4.dp, 6.dp),
    showCountryFlag: Boolean = true,
    showCountryPhoneCode: Boolean = true,
    showCountryName: Boolean = false,
    showCountryCode: Boolean = false,
    showArrowDropDown: Boolean = true,
    spaceAfterCountryFlag: Dp = 8.dp,
    spaceAfterCountryPhoneCode: Dp = 6.dp,
    spaceAfterCountryName: Dp = 6.dp,
    spaceAfterCountryCode: Dp = 6.dp,
    countryFlagSize: Dp = 26.dp,
    showVerticalDivider: Boolean = true,
    spaceAfterVerticalDivider: Dp = 4.dp,
    verticalDividerColor: Color = MaterialTheme.colorScheme.onSurface,
    verticalDividerHeight: Dp = 26.dp,
    countryPhoneCodeTextStyle: TextStyle = TextStyle(),
    countryNameTextStyle: TextStyle = TextStyle(),
    countryCodeTextStyle: TextStyle = TextStyle(),
    enabled: Boolean = true,
    readOnly: Boolean = false,
    textStyle: TextStyle = LocalTextStyle.current,
    label: @Composable() (() -&amp;gt; Unit)? = null,
    placeholder: @Composable() (() -&amp;gt; Unit)? = null,
    trailingIcon: @Composable() (() -&amp;gt; Unit)? = null,
    prefix: @Composable() (() -&amp;gt; Unit)? = null,
    suffix: @Composable() (() -&amp;gt; Unit)? = null,
    supportingText: @Composable() (() -&amp;gt; Unit)? = null,
    isError: Boolean = false,
    visualTransformation: VisualTransformation = VisualTransformation.None,
    singleLine: Boolean = false,
    maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE,
    minLines: Int = 1,
    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
    shape: Shape = RoundedCornerShape(12.dp),
    colors: TextFieldColors = OutlinedTextFieldDefaults.colors(),
    focusedBorderThickness: Dp = 2.dp,
    unfocusedBorderThickness: Dp = 1.dp,
    onDone: () -&amp;gt; Unit = {},
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;mobileNumber&lt;/strong&gt;: The mobile number to be shown in the text field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;onMobileNumberChange&lt;/strong&gt;: The callback that is triggered when the input service updates the mobile number. An updated mobile number comes as a parameter of the callback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;onCountrySelected&lt;/strong&gt;: The callback function is triggered each time a country is selected within the picker. Additionally, it is also invoked when the picker is first displayed on the screen with the default selected country.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;modifier&lt;/strong&gt;: The Modifier to be applied to this text field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;defaultPaddingValues&lt;/strong&gt;: The spacing values to apply internally between the container and the content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;showCountryFlag&lt;/strong&gt;: Determines whether to show the country flag within the picker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;showCountryPhoneCode&lt;/strong&gt;: Determines whether to show the country phone code within the picker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;showCountryName&lt;/strong&gt;: Determines whether to show the country name within the picker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;showCountryCode&lt;/strong&gt;: Determines whether to show the country code within the picker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;showArrowDropDown&lt;/strong&gt;: Determines whether to show the arrow drop-down icon within the picker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;spaceAfterCountryFlag&lt;/strong&gt;: The space to add after the country flag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;spaceAfterCountryPhoneCode&lt;/strong&gt;: The space to add after the country phone code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;spaceAfterCountryName&lt;/strong&gt;: The space to add after the country name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;spaceAfterCountryCode&lt;/strong&gt;: The space to add after the country code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;countryFlagSize&lt;/strong&gt;: The size of the country flag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;showVerticalDivider&lt;/strong&gt;: Determines whether to show the vertical divider within the picker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;spaceAfterVerticalDivider&lt;/strong&gt;: The space to add after the vertical divider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;verticalDividerColor&lt;/strong&gt;: The color of the vertical divider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;verticalDividerHeight&lt;/strong&gt;: The height of the vertical divider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;countryPhoneCodeTextStyle&lt;/strong&gt;: The text style for the country phone code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;countryNameTextStyle&lt;/strong&gt;: The text style for the country name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;countryCodeTextStyle&lt;/strong&gt;: The text style for the country code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;enabled&lt;/strong&gt;: Controls the enabled state of this text field. When false, this component will not respond to user input, and it will appear visually disabled and disabled to accessibility services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;readOnly&lt;/strong&gt;: Controls the editable state of the text field. When true, the text field cannot be modified. However, a user can focus it and copy text from it. Read-only text fields are usually used to display pre-filled forms that a user cannot edit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;textStyle&lt;/strong&gt;: The style to be applied to the input text. Defaults to LocalTextStyle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;label&lt;/strong&gt;: The optional label to be displayed inside the text field container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;placeholder&lt;/strong&gt;: The optional placeholder to be displayed when the text field is in focus and the input text is empty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;trailingIcon&lt;/strong&gt;: The optional trailing icon to be displayed at the end of the text field container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;prefix&lt;/strong&gt;: The optional prefix to be displayed before the input text in the text field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;suffix&lt;/strong&gt;: The optional suffix to be displayed after the input text in the text field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;supportingText&lt;/strong&gt;: The optional supporting text to be displayed below the text field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;isError&lt;/strong&gt;: Indicates if the text field’s current value is in error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;visualTransformation&lt;/strong&gt;: Transforms the visual representation of the input value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;singleLine&lt;/strong&gt;: When true, this text field becomes a single - horizontally scrolling text field instead of wrapping onto multiple lines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;maxLines&lt;/strong&gt;: The maximum height in terms of maximum number of visible lines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;minLines&lt;/strong&gt;: The minimum height in terms of minimum number of visible lines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;interactionSource&lt;/strong&gt;: The MutableInteractionSource representing the stream of Interactions for this text field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;shape&lt;/strong&gt;: Defines the shape of this text field’s border.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;colors&lt;/strong&gt;: TextFieldColors that will be used to resolve the colors used for this text field in different&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;focusedBorderThickness&lt;/strong&gt;: Represents the border thickness for focused state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;unfocusedBorderThickness&lt;/strong&gt;: Represents the border thickness for unfocused state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;onDone&lt;/strong&gt;: The callback is triggered when the user clicks the Done button on the keyboard, as the default IME action is set to Done.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Composable
fun CountryPickerBasicText() {
    val selectedCountryState: MutableState&amp;lt;CountryDetails?&amp;gt; = remember {
        mutableStateOf(null)
    }
    var mobileNumber by remember {
        mutableStateOf("")
    }

    CountryPickerBasicTextField(
        mobileNumber = mobileNumber,
        defaultCountryCode = "ad",
        onMobileNumberChange = {
            mobileNumber = it
        },
        onCountrySelected = {
            selectedCountryState.value = it
        },
        modifier = Modifier.fillMaxWidth(),
        defaultPaddingValues = PaddingValues(6.dp),
        showCountryFlag = true,
        showCountryPhoneCode = true,
        showCountryName = false,
        showCountryCode = false,
        showArrowDropDown = true,
        spaceAfterCountryFlag = 8.dp,
        spaceAfterCountryPhoneCode = 6.dp,
        spaceAfterCountryName = 6.dp,
        spaceAfterCountryCode = 6.dp,
        label = {
            Text(text = "Mobile Number")
        },
        focusedBorderThickness = 2.dp,
        unfocusedBorderThickness = 1.dp,
        shape = RoundedCornerShape(10.dp),
        verticalDividerColor = Color(0XFFDDDDDD),
        colors = OutlinedTextFieldDefaults.colors(
            focusedBorderColor = Color(0XFFDDDDDD),
            unfocusedBorderColor = Color(0XFFDDDDDD)
        )
    )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Screenshot
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecatrbnw5cnnspy2uund.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecatrbnw5cnnspy2uund.png" alt="countrycodepicker compose multiplatform" width="800" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;CMPCountryCodePicker is a versatile and user-friendly tool designed to simplify the selection of country codes in Android and iOS applications. Its customizable options and robust performance make it an ideal solution for developers seeking to streamline their application’s country code selection process. Whether for a small project or a large-scale application, CMPCountryCodePicker stands out as a reliable and efficient choice.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork/CMPCountryCodePicker.git"&gt;https://github.com/ChainTechNetwork/CMPCountryCodePicker.git&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Connect with us 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/showcase/mobile-innovation-network"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>ios</category>
      <category>compose</category>
      <category>composemultiplatform</category>
    </item>
    <item>
      <title>Introducing Compose Multiplatform Media Player: Your Go-To Solution for Seamless Media Playback</title>
      <dc:creator>Mobile innovation Network</dc:creator>
      <pubDate>Mon, 20 May 2024 12:02:41 +0000</pubDate>
      <link>https://forem.com/mobileinnovation/introducing-compose-multiplatform-media-player-your-go-to-solution-for-seamless-media-playback-mfo</link>
      <guid>https://forem.com/mobileinnovation/introducing-compose-multiplatform-media-player-your-go-to-solution-for-seamless-media-playback-mfo</guid>
      <description>&lt;p&gt;In today’s digital age, media consumption is an integral part of our lives. Whether it’s watching videos or browsing through reels, users expect a seamless and immersive experience. However, building a media player that works seamlessly across different platforms can be a daunting task. That’s where Compose Multiplatform Media Player comes to the rescue!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Compose Multiplatform Media Player?&lt;/strong&gt;&lt;br&gt;
Compose Multiplatform Media Player is a powerful media player library designed specifically for Compose Multiplatform projects. It provides developers with the tools they need to effortlessly integrate video playback and reel viewing into their applications, all while maintaining a consistent experience across both iOS and Android platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cross-Platform Compatibility&lt;/strong&gt;&lt;br&gt;
With Compose Multiplatform Media Player, you can rest assured that your media player will work flawlessly on both iOS and Android platforms within Compose Multiplatform projects. Say goodbye to platform-specific headaches and hello to a seamless development experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video Playback&lt;/strong&gt;&lt;br&gt;
Easily incorporate video playback functionality into your app with high performance and reliability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reel Viewing&lt;/strong&gt;&lt;br&gt;
Experience reel viewing like never before with support for both horizontal and vertical scrolling. Whether your users prefer to swipe through content or scroll vertically, our media player ensures a smooth and intuitive experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customizable Controls&lt;/strong&gt;&lt;br&gt;
Take control of your media player’s behavior with extensive customization options. Enable or disable pause/resume functionality, toggle the visibility of the seek bar, and display playback time duration according to your app’s requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Getting started with Compose Multiplatform Media Player is easy! Simply add the library as a dependency in your project’s &lt;code&gt;build.gradle.kts&lt;/code&gt; file, and you’re good to go:&lt;/p&gt;

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

commonMain.dependencies {
   implementation("network.chaintech:compose-multiplatform-media-player:1.0.5")
}


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

&lt;/div&gt;

&lt;p&gt;Once you’ve added the dependency, you can start using the library’s composable functions to integrate video playback and reel viewing into your app:&lt;/p&gt;

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

// Video Playback
VideoPlayerView(
 modifier = Modifier.fillMaxSize(),
 url = videoUrl
)

// Reel Viewing
ReelsPlayerView(
 modifier = Modifier.fillMaxSize(),
 urls = videoUrlArray
)


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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Customization Options&lt;/strong&gt;&lt;br&gt;
Our media player library offers a wide range of customization options to suit your app’s needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;modifier&lt;/code&gt;: Modify the layout and appearance of the media player.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;url&lt;/code&gt;: Provide the URL of the video to be played.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;urls&lt;/code&gt;: Pass an array of URLs for reel viewing.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;playerConfig&lt;/code&gt;: You can configure various aspects of the player appearance and behavior.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;enablePauseResume&lt;/code&gt;: Enable or disable pause/resume functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;showSeekBar&lt;/code&gt;: Toggle the visibility of the seek bar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;showDuration&lt;/code&gt;: Control the display of playback time duration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;thumbColor&lt;/code&gt;: Customize color of the seek bar thumb.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;activeTrackColor&lt;/code&gt;: Customize the color of the seek bar’s active track, representing the portion of the media content that has already been played.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;inactiveTrackColor&lt;/code&gt;: Customize the color of the seek bar’s inactive track, representing the remaining portion of the media content yet to be played.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;textColor&lt;/code&gt;: Customization of the color of the duration text displayed alongside the seek bar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;seekBarBottomPadding&lt;/code&gt;: Allows configuring the bottom padding for the seek bar control, ensuring proper alignment within the UI layout.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;playIcon&lt;/code&gt; &amp;amp; pauseIcon: Customize the play and pause button icons.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;reelVerticalScrolling&lt;/code&gt;: Manage vertical and horizontal scrolling in reel viewing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;autoHideControl&lt;/code&gt; &amp;amp; controlHideInterval: Enable the automatic hiding of controls after a specified time interval, enhancing user experience by reducing clutter on the interface when controls are not in use.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fkysxy7jvvv07oxyzbbqt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fkysxy7jvvv07oxyzbbqt.png" alt="MediaPlayer"&gt;&lt;/a&gt;&lt;/p&gt;

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

VideoPlayerView(modifier = Modifier.fillMaxSize(),
                url = videoUrl,
                playerConfig = PlayerConfig(
                    enablePauseResume = true,
                    showSeekBar = true,
                    showDuration = true,
                    thumbColor = Color.Red,
                    activeTrackColor = Color.Red,
                    inactiveTrackColor = Color.White,
                    textColor = Color.White,
                    seekBarBottomPadding = 10.dp,
                    playIcon = Res.drawable.icn_play,
                    pauseIcon = Res.drawable.icn_pause,
                    pauseResumeIconSize = 40.dp,
                    autoHideControl = true,
                    controlHideInterval = 5
                )
            )


&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;

VideoPlayerView(modifier = Modifier.fillMaxSize(),
                url = videoUrl,
                playerConfig = PlayerConfig(
                    enablePauseResume = false,
                    showSeekBar = false,
                    showDuration = false
                )
            )


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

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fy075hmmm8doqjxfes5wy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fy075hmmm8doqjxfes5wy.png" alt="Reels"&gt;&lt;/a&gt;&lt;/p&gt;


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

&lt;p&gt;ReelsPlayerView(modifier = Modifier.fillMaxSize(),&lt;br&gt;
                url = videoUrlArray,&lt;br&gt;
                playerConfig = PlayerConfig(&lt;br&gt;
                    enablePauseResume = true,&lt;br&gt;
                    showSeekBar = true,&lt;br&gt;
                    reelVerticalScrolling = true&lt;br&gt;
                )&lt;br&gt;
            )&lt;/p&gt;

&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;

&lt;p&gt;ReelsPlayerView(modifier = Modifier.fillMaxSize(),&lt;br&gt;
                url = videoUrlArray,&lt;br&gt;
                playerConfig = PlayerConfig(&lt;br&gt;
                    enablePauseResume = false,&lt;br&gt;
                    showSeekBar = false,&lt;br&gt;
                    reelVerticalScrolling = false&lt;br&gt;
                )&lt;br&gt;
            )&lt;/p&gt;

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

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Conclusion&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;With Compose Multiplatform Media Player, building a seamless media playback experience for your app has never been easier. Whether you’re a seasoned developer or just getting started with Compose Multiplatform, our library empowers you to create engaging and immersive media experiences that delight your users.&lt;br&gt;
So why wait? Give Compose Multiplatform Media Player a try today and take your app’s media playback to the next level!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork/ComposeMultiplatformMediaPlayer.git" rel="noopener noreferrer"&gt;https://github.com/ChainTechNetwork/ComposeMultiplatformMediaPlayer.git&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Connect with us 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.linkedin.com/showcase/mobile-innovation-network" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>android</category>
      <category>ios</category>
      <category>compose</category>
      <category>composemultiplatform</category>
    </item>
    <item>
      <title>Easy WheelDateTimePicker — Compose Multiplatform(KMP)</title>
      <dc:creator>Mobile innovation Network</dc:creator>
      <pubDate>Mon, 20 May 2024 11:32:35 +0000</pubDate>
      <link>https://forem.com/mobileinnovation/easy-wheeldatetimepicker-compose-multiplatformkmp-40a2</link>
      <guid>https://forem.com/mobileinnovation/easy-wheeldatetimepicker-compose-multiplatformkmp-40a2</guid>
      <description>&lt;p&gt;Easy Date Picker is a Kotlin Multiplatform library for selecting date and time in your Android, iOS &amp;amp; Desktop App. It offers a customizable UI to use in your multiplatform projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Add the dependency to your &lt;code&gt;build.gradle.kts&lt;/code&gt; file:&lt;/p&gt;


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

&lt;p&gt;commonMain.dependencies {&lt;br&gt;
    implementation("network.chaintech:kmp-date-time-picker:1.0.3")&lt;br&gt;
}&lt;/p&gt;

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

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  WheelDatePickerView&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fcv6r9jlii8atv0ewppcx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fcv6r9jlii8atv0ewppcx.png" alt="WheelDatePicker"&gt;&lt;/a&gt;&lt;/p&gt;


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

&lt;p&gt;@Composable&lt;br&gt;
fun WheelDatePickerBottomSheet() {&lt;br&gt;
    var showDatePicker by remember { mutableStateOf(false) }&lt;br&gt;
    var selectedDate by remember { mutableStateOf("") }&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (showDatePicker) {
    WheelDatePickerView(
        modifier = Modifier
            .fillMaxWidth()
            .padding(top = 22.dp, bottom = 26.dp),
        showDatePicker = showDatePicker,
        title = "DUE DATE",
        doneLabel = "Done",
        titleStyle = TextStyle(
            fontSize = 18.sp,
            fontWeight = FontWeight.Bold,
            color = Color(0xFF333333),
        ),
        doneLabelStyle = TextStyle(
            fontSize = 16.sp,
            fontWeight = FontWeight(600),
            color = Color(0xFF007AFF),
        ),
        dateTextColor = Color(0xff007AFF),
        selectorProperties = WheelPickerDefaults.selectorProperties(
            borderColor = Color.LightGray,
        ),
        rowCount = 5,
        height = 180.dp,
        dateTextStyle = TextStyle(
            fontWeight = FontWeight(600),
        ),
        dragHandle = {
            HorizontalDivider(
                modifier = Modifier.padding(top = 8.dp).width(50.dp).clip(CircleShape),
                thickness = 4.dp,
                color = Color(0xFFE8E4E4)
            )
        },
        shape = RoundedCornerShape(topStart = 18.dp, topEnd = 18.dp),
        dateTimePickerView = DateTimePickerView.BOTTOM_SHEET_VIEW,
        onDoneClick = {
            selectedDate = it.toString()
            showDatePicker = false
        },
        onDismiss = {
            showDatePicker = false
        }
    )
}

Surface(
    modifier = Modifier.fillMaxSize(),
    color = MaterialTheme.colorScheme.background
) {
    Column(
        modifier = Modifier
            .height(200.dp)
            .fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Button(
            onClick = {
                showDatePicker = true
            },
            colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF007AFF)),
        ) {
            Text(
                text = "Show Date Picker",
                modifier = Modifier.background(Color.Transparent)
                    .padding(horizontal = 12.dp, vertical = 12.dp),
                fontSize = 16.sp
            )
        }
        Text(
            text = selectedDate,
            modifier = Modifier
                .padding(top = 10.dp)
                .fillMaxWidth(),
            textAlign = TextAlign.Center
        )
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

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

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  WheelDateTimePickerView&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fyjwl9w83bti6gk92a0mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fyjwl9w83bti6gk92a0mn.png" alt="WheelDateTimePicker"&gt;&lt;/a&gt;&lt;/p&gt;


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

&lt;p&gt;@Composable&lt;br&gt;
fun WheelDateTimePickerDialog() {&lt;br&gt;
    var showDatePicker by remember { mutableStateOf(false) }&lt;br&gt;
    var selectedDate by remember { mutableStateOf("") }&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (showDatePicker) {
    WheelDateTimePickerView(
        modifier = Modifier.padding(top = 18.dp, bottom = 10.dp).fillMaxWidth(),
        showDatePicker = showDatePicker,
        titleStyle = TextStyle(
            fontSize = 18.sp,
            fontWeight = FontWeight.Bold,
            color = Color(0xFF333333),
        ),
        doneLabelStyle = TextStyle(
            fontSize = 16.sp,
            fontWeight = FontWeight(600),
            color = Color(0xFF007AFF),
        ),
        selectorProperties = WheelPickerDefaults.selectorProperties(
            borderColor = Color.LightGray,
        ),
        timeFormat = TimeFormat.AM_PM,
        dateTextColor = Color(0xff007AFF),
        rowCount = 5,
        height = 170.dp,
        dateTextStyle = TextStyle(
            fontWeight = FontWeight(600),
        ),
        onDoneClick = {
            selectedDate = dateTimeToString(it, "yyyy-MM-dd hh:mm a")
            showDatePicker = false
        },
        dateTimePickerView = DateTimePickerView.DIALOG_VIEW,
        onDismiss = {
            showDatePicker = false
        }
    )
}

Surface(
    modifier = Modifier.fillMaxSize(),
    color = MaterialTheme.colorScheme.background
) {
    Column(
        modifier = Modifier
            .height(200.dp)
            .fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Button(
            onClick = {
                showDatePicker = true
            },
            colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF007AFF)),
        ) {
            Text(
                text = "Show Date Time Picker",
                modifier = Modifier.background(Color.Transparent)
                    .padding(horizontal = 12.dp, vertical = 12.dp),
                fontSize = 16.sp
            )
        }
        Text(
            text = selectedDate,
            modifier = Modifier
                .padding(top = 10.dp)
                .fillMaxWidth(),
            textAlign = TextAlign.Center
        )
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

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

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  WheelTimePickerView&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fea8qxzq2slu6pyokxol4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fea8qxzq2slu6pyokxol4.png" alt="WheelTimePicker"&gt;&lt;/a&gt;&lt;/p&gt;


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

&lt;p&gt;@Composable&lt;br&gt;
fun WheelTimePickerBottomSheet() {&lt;br&gt;
    var showTimePicker by remember { mutableStateOf(false) }&lt;br&gt;
    var selectedTime by remember { mutableStateOf("") }&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (showTimePicker) {
    WheelTimePickerView(
        modifier = Modifier
            .fillMaxWidth()
            .padding(top = 22.dp, bottom = 26.dp),
        showTimePicker = showTimePicker,
        titleStyle = TextStyle(
            fontSize = 18.sp,
            fontWeight = FontWeight.Bold,
            color = Color(0xFF333333),
        ),
        doneLabelStyle = TextStyle(
            fontSize = 16.sp,
            fontWeight = FontWeight(600),
            color = Color(0xFF007AFF),
        ),
        textColor = Color(0xff007AFF),
        timeFormat = TimeFormat.AM_PM,
        selectorProperties = WheelPickerDefaults.selectorProperties(
            borderColor = Color.LightGray,
        ),
        rowCount = 5,
        height = 170.dp,
        textStyle = TextStyle(
            fontWeight = FontWeight(600),
        ),
        dateTimePickerView = DateTimePickerView.BOTTOM_SHEET_VIEW,
        dragHandle = {
            HorizontalDivider(
                modifier = Modifier.padding(top = 8.dp).width(50.dp).clip(CircleShape),
                thickness = 4.dp,
                color = Color(0xFFE8E4E4)
            )
        },
        shape = RoundedCornerShape(topStart = 18.dp, topEnd = 18.dp),
        onDoneClick = {
            selectedTime = timeToString(it, "hh:mm a")
            showTimePicker = false
        },
        onDismiss = {
            showTimePicker = false
        }
    )
}

Surface(
    modifier = Modifier.fillMaxSize(),
    color = MaterialTheme.colorScheme.background
) {
    Column(
        modifier = Modifier.fillMaxSize().height(200.dp),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Button(
            onClick = {
                showTimePicker = true
            },
            colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF007AFF)),
        ) {
            Text(
                text = "Show Time Picker",
                modifier = Modifier.background(Color.Transparent)
                    .padding(horizontal = 12.dp, vertical = 12.dp),
                fontSize = 16.sp
            )
        }
        Text(
            text = selectedTime,
            style = MaterialTheme.typography.titleMedium,
            color = Color.Black,
            textAlign = TextAlign.Center,
            modifier = Modifier
        )
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

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

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Conclusion&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Efficient and user-friendly, Easy Wheel Date Time Picker simplifies date and time selection with intuitive controls, enhancing user experience and productivity seamlessly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork/compose_multiplatform_date_time_picker.git" rel="noopener noreferrer"&gt;https://github.com/ChainTechNetwork/compose_multiplatform_date_time_picker.git&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Connect with us 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.linkedin.com/showcase/mobile-innovation-network" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>QRKit — QRCode Scanning in Compose Multiplatform for Android and iOS</title>
      <dc:creator>Mobile innovation Network</dc:creator>
      <pubDate>Mon, 20 May 2024 11:16:11 +0000</pubDate>
      <link>https://forem.com/mobileinnovation/qrkit-qrcode-scanning-in-compose-multiplatform-for-android-and-ios-4g0p</link>
      <guid>https://forem.com/mobileinnovation/qrkit-qrcode-scanning-in-compose-multiplatform-for-android-and-ios-4g0p</guid>
      <description>&lt;p&gt;QRKit is a Kotlin Multiplatform library for Qr Scan in your Android or iOS App.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Add the dependency to your &lt;code&gt;build.gradle.kts&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commonMain.dependencies {
    implementation("network.chaintech:qr-kit:1.0.2")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  QrScanner :- Add Permissions in Android and iOS
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Android : Include this at root level in your AndroidManifest.xml:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;uses-feature android:name="android.hardware.camera"/&amp;gt;
&amp;lt;uses-feature android:name="android.hardware.camera.autofocus"/&amp;gt;
&amp;lt;uses-permission android:name="android.permission.CAMERA"/&amp;gt;
&amp;lt;uses-permission android:name="android.permission.FLASHLIGHT"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;iOS : Add below key to the Info.plist in your xcode project:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;key&amp;gt;NSCameraUsageDescription&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;$(PRODUCT_NAME) camera description.&amp;lt;/string&amp;gt;
&amp;lt;key&amp;gt;NSPhotoLibraryUsageDescription&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;$(PRODUCT_NAME)photos description.&amp;lt;/string&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QrScanner(
    modifier: Modifier,
    flashlightOn: Boolean,
    launchGallery: Boolean,
    onCompletion: (String) -&amp;gt; Unit,
    onGalleryCallBackHandler: (Boolean) -&amp;gt; Unit,
    onFailure: (String) -&amp;gt; Unit
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;modifier&lt;/code&gt;: Modifier for modifying the layout of the QR scanner.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flashlightOn&lt;/code&gt;: Boolean indicating whether the flashlight is turned on.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;launchGallery&lt;/code&gt;: Boolean indicating whether to launch the gallery for selecting images.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;onCompletion&lt;/code&gt;: Callback invoked when a QR code is successfully scanned.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;onGalleryCallBackHandler&lt;/code&gt;: Callback invoked to indicate the status of the gallery, whether it's open or closed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;onFailure&lt;/code&gt;: Callback invoked when there's a failure during QR code scanning.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Composable
fun QrScannerCompose() {
    var qrCodeURL by remember { mutableStateOf("") }
    var startBarCodeScan by remember { mutableStateOf(false) }
    var flashlightOn by remember { mutableStateOf(false) }
    var launchGallery by remember { mutableStateOf(value = false) }
    val snackBarHostState = LocalSnackBarHostState.current
    val coroutineScope = rememberCoroutineScope()

    Box(modifier = Modifier.fillMaxSize().statusBarsPadding()) {
        Column(
            modifier = Modifier
                .background(color = Color.White)
                .windowInsetsPadding(WindowInsets.safeDrawing)
                .fillMaxSize(),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            if (qrCodeURL.isEmpty() &amp;amp;&amp;amp; startBarCodeScan) {
                Column(
                    modifier = Modifier
                        .background(color = Color.Black)
                        .fillMaxSize(),
                    verticalArrangement = Arrangement.Center,
                    horizontalAlignment = Alignment.CenterHorizontally
                ) {
                    Box(
                        modifier = Modifier
                            .size(250.dp)
                            .clip(shape = RoundedCornerShape(size = 14.dp))
                            .clipToBounds()
                            .border(2.dp, Color.Gray, RoundedCornerShape(size = 14.dp)),
                        contentAlignment = Alignment.Center
                    ) {
                        QrScanner(
                            modifier = Modifier
                                .clipToBounds()
                                .clip(shape = RoundedCornerShape(size = 14.dp)),
                            flashlightOn = flashlightOn,
                            launchGallery = launchGallery,
                            onCompletion = {
                                qrCodeURL = it
                                startBarCodeScan = false
                            },
                            onGalleryCallBackHandler = {
                                launchGallery = it
                            },
                            onFailure = {
                                coroutineScope.launch {
                                    if (it.isEmpty()) {
                                        snackBarHostState.showSnackbar("Invalid qr code")
                                    } else {
                                        snackBarHostState.showSnackbar(it)
                                    }
                                }
                            }
                        )
                    }

                    Box(
                        modifier = Modifier
                            .padding(start = 20.dp, end = 20.dp, top = 30.dp)
                            .background(
                                color = Color(0xFFF9F9F9),
                                shape = RoundedCornerShape(25.dp)
                            )
                            .height(35.dp),
                        contentAlignment = Alignment.Center
                    ) {
                        Row(
                            modifier = Modifier
                                .padding(vertical = 5.dp, horizontal = 18.dp),
                            verticalAlignment = Alignment.CenterVertically,
                            horizontalArrangement = Arrangement.spacedBy(11.dp)
                        ) {
                            Icon(imageVector = if (flashlightOn) Icons.Filled.FlashOn else Icons.Filled.FlashOff,
                                "flash",
                                modifier = Modifier
                                    .size(24.dp)
                                    .clickable {
                                        flashlightOn = !flashlightOn
                                    })

                            VerticalDivider(
                                modifier = Modifier,
                                thickness = 1.dp,
                                color = Color(0xFFD8D8D8)
                            )

                            Image(
                                painter = painterResource(Res.drawable.ic_gallery_icon),
                                contentDescription = "gallery",
                                contentScale = ContentScale.Fit,
                                modifier = Modifier
                                    .size(24.dp)
                                    .clickable {
                                        launchGallery = true
                                    }
                            )
                        }
                    }
                }
            } else {
                Column(
                    verticalArrangement = Arrangement.Center,
                    horizontalAlignment = Alignment.CenterHorizontally
                ) {
                    Button(
                        onClick = {
                            startBarCodeScan = true
                            qrCodeURL = ""
                        },
                        colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF007AFF)),
                    ) {
                        Text(
                            text = "Scan Qr",
                            modifier = Modifier.background(Color.Transparent)
                                .padding(horizontal = 12.dp, vertical = 12.dp),
                            fontSize = 16.sp
                        )
                    }

                    Text(
                        text = qrCodeURL,
                        color = Color.Black,
                        modifier = Modifier.padding(top = 12.dp)
                    )
                }
            }
        }
        if (startBarCodeScan) {
            Icon(
                imageVector = Icons.Filled.Close,
                "Close",
                modifier = Modifier
                    .padding(top = 12.dp, end = 12.dp)
                    .size(24.dp)
                    .clickable {
                        startBarCodeScan = false
                    }.align(Alignment.TopEnd),
                tint = Color.White
            )
        }
    }

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Compose Multiplatform&lt;/li&gt;
&lt;li&gt;CameraX Jetpack library&lt;/li&gt;
&lt;li&gt;ML Kit&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Integrating a QR code scanner library enhances functionality, streamlines processes, and improves user experience in your application.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork/QRKitComposeMultiplatform.git"&gt;https://github.com/ChainTechNetwork/QRKitComposeMultiplatform.git&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Connect with us 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.linkedin.com/showcase/mobile-innovation-network"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork"&gt;GitHub&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ios</category>
      <category>compose</category>
      <category>composemultiplatform</category>
      <category>android</category>
    </item>
    <item>
      <title>QRKit — QRCode Generator in Compose Multiplatform for Android and iOS</title>
      <dc:creator>Mobile innovation Network</dc:creator>
      <pubDate>Mon, 20 May 2024 10:51:34 +0000</pubDate>
      <link>https://forem.com/mobileinnovation/qrkit-qrcode-generator-in-compose-multiplatform-for-android-and-ios-47cn</link>
      <guid>https://forem.com/mobileinnovation/qrkit-qrcode-generator-in-compose-multiplatform-for-android-and-ios-47cn</guid>
      <description>&lt;p&gt;QRKit is a Kotlin Multiplatform library for Qr Generator in your Android or iOS App.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Add the dependency to your &lt;code&gt;build.gradle.kts&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commonMain.dependencies {
    implementation("network.chaintech:qr-kit:1.0.2")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QRCodeImage(
    url: String,
    contentDescription: String?,
    modifier: Modifier = Modifier,
    alignment: Alignment = Alignment.Center,
    contentScale: ContentScale = ContentScale.Fit,
    alpha: Float = DefaultAlpha,
    colorFilter: ColorFilter? = null,
    filterQuality: FilterQuality = DrawScope.DefaultFilterQuality,
    onSuccess: (ImageBitmap) -&amp;gt; Unit = { qrImage -&amp;gt; },
    onFailure: (String) -&amp;gt; Unit = { message -&amp;gt; }
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;url&lt;/code&gt;: The URL of the QR code image to be displayed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;contentDescription&lt;/code&gt;: A textual description of the image content for accessibility purposes. It's optional.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;modifier&lt;/code&gt;: Modifier for modifying the layout of the QR code image.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;alignment&lt;/code&gt;: Alignment of the QR code image within its layout bounds. Default is Alignment.Center.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;contentScale&lt;/code&gt;: The scale strategy for fitting the QR code image content within its layout bounds. Default is ContentScale.Fit.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;alpha&lt;/code&gt;: The opacity of the QR code image, ranging from 0.0 (fully transparent) to 1.0 (fully opaque). Default is DefaultAlpha.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;colorFilter&lt;/code&gt;: A color filter to apply to the QR code image. Default is null.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;filterQuality&lt;/code&gt;: The quality of the filtering applied to the QR code image. Default is DrawScope.DefaultFilterQuality.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;onSuccess&lt;/code&gt;: Callback invoked when the QR code image is successfully loaded and decoded, passing the decoded ImageBitmap as a parameter.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;onFailure&lt;/code&gt;: Callback invoked when there's a failure during loading or decoding the QR code image, passing an error message as a parameter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Composable
fun QrGeneratorCompose(paddingValues: PaddingValues) {
    val scope = rememberCoroutineScope()
    var inputText by rememberSaveable { mutableStateOf("") }
    var isInputTextError by rememberSaveable { mutableStateOf(false) }
    val generatedQRCode = remember { mutableStateOf&amp;lt;ImageBitmap?&amp;gt;(null) }
    val focusManager = LocalFocusManager.current
    val snackBarHostState = LocalSnackBarHostState.current

    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier
            .fillMaxSize()
            .padding(paddingValues)
            .padding(horizontal = 16.dp)
            .padding(top = 22.dp)
            .verticalScroll(rememberScrollState())
    ) {
        QRCodeImage(
            url = "https://www.google.com/",
            contentScale = ContentScale.Fit,
            contentDescription = "QR Code",
            modifier = Modifier
                .size(150.dp),
            onSuccess = { qrImage -&amp;gt;

            },
            onFailure = {
                scope.launch {
                    snackBarHostState.showSnackbar("Something went wrong")
                }
            }
        )

        OutlinedTextField(
            value = inputText,
            onValueChange = {
                inputText = it
                isInputTextError = inputText.isBlank()
            },
            label = { Text("Please enter text", style = MaterialTheme.typography.titleMedium) },
            textStyle = MaterialTheme.typography.bodyLarge,
            singleLine = false,
            isError = isInputTextError,
            modifier = Modifier.padding(top = 14.dp).fillMaxWidth(),
            shape = RoundedCornerShape(10),
            trailingIcon = {
                if (isInputTextError) {
                    Icon(
                        imageVector = Icons.Default.Error,
                        contentDescription = "Error",
                        tint = Color.Red
                    )
                }
            }
        )
        Spacer(modifier = Modifier.height(22.dp))
        Button(
            onClick = {
                if (inputText.isBlank()) {
                    isInputTextError = true
                    return@Button
                } else {
                    focusManager.clearFocus()
                    generateQrCode(
                        inputText,
                        onSuccess = { info, qrCode -&amp;gt;
                            generatedQRCode.value = qrCode
                        },
                        onFailure = {
                            scope.launch {
                                snackBarHostState.showSnackbar("Something went wrong")
                            }
                        }
                    )
                }
            },
            modifier = Modifier
                .fillMaxWidth()
                .height(54.dp),
            colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF007AFF)),
            shape = RoundedCornerShape(25)
        ) {
            Text(
                text = "Generate code",
                style = MaterialTheme.typography.bodyLarge,
                color = Color.White
            )
        }
        generatedQRCode.value?.let { qrCode -&amp;gt;
            QRCodeViewer(qrCode)
        }
    }
}
&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;@Composable
fun QRCodeViewer(qrCode: ImageBitmap) {
    var isLoading by rememberSaveable { mutableStateOf(true) }
    LaunchedEffect(Unit) {
        delay(500)
        isLoading = false
    }

    Column(
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier.fillMaxSize()
            .padding(vertical = 22.dp),
    ) {
        Box(
            contentAlignment = Alignment.Center,
            modifier = Modifier
                .background(Color.White)
                .border(BorderStroke(3.dp, Color.Black))
                .size(250.dp)
        ) {
            if (isLoading) {
                QRCodeShimmer()
                return@Column
            }

            Image(
                bitmap = qrCode,
                contentScale = ContentScale.Fit,
                contentDescription = "QR Code",
                modifier = Modifier
                    .fillMaxSize(1f)
            )
        }
    }
}
&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;@Composable
fun QRCodeShimmer() {
    val shimmerColorShades = listOf(
        Color.Gray.copy(0.5f),
        Color.LightGray.copy(0.2f),
        Color.Gray.copy(0.5f),
    )

    val transition = rememberInfiniteTransition()
    val transitionAnim by transition.animateFloat(
        initialValue = 0f,
        targetValue = 1000f,
        animationSpec = infiniteRepeatable(
            tween(durationMillis = 1200, easing = FastOutSlowInEasing),
            RepeatMode.Reverse
        )
    )

    val brush = Brush.linearGradient(
        colors = shimmerColorShades,
        start = Offset(10f, 10f),
        end = Offset(transitionAnim, transitionAnim)
    )

    Surface(
        color = Color.Transparent,
        modifier = Modifier.alpha(.3f)
    ) {
        Box(
            contentAlignment = Alignment.Center,
            modifier = Modifier.size(300.dp)
        ) {
            Spacer(
                modifier = Modifier
                    .fillMaxSize()
                    .background(brush = brush)
            )
            Spacer(
                modifier = Modifier
                    .fillMaxSize(.8f)
                    .background(brush = brush)
            )
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Final Demo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fytw9be2sw63ljrvpr4e8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fytw9be2sw63ljrvpr4e8.png" alt="QRKit" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Integrating a QR code generator library enhances functionality, streamlines processes, and improves user experience in your application.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork/QRKitComposeMultiplatform.git"&gt;https://github.com/ChainTechNetwork/QRKitComposeMultiplatform.git&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Connect with us 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.linkedin.com/showcase/mobile-innovation-network"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork"&gt;GitHub&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>CMPPreference - Compose Multiplatform</title>
      <dc:creator>Mobile innovation Network</dc:creator>
      <pubDate>Mon, 20 May 2024 10:32:44 +0000</pubDate>
      <link>https://forem.com/mobileinnovation/cmppreference-compose-multiplatform-1jbf</link>
      <guid>https://forem.com/mobileinnovation/cmppreference-compose-multiplatform-1jbf</guid>
      <description>&lt;p&gt;A CMPPreference enables shared preference management in Android and iOS apps using Compose Multiplatform, ensuring seamless cross-platform functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Add the dependency to your build.gradle.kts file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commonMain.dependencies {
    implementation("network.chaintech:cmp-preference:1.0.0")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add the following line in onCreate of your Activity class in Android:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class AppActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        AppContext.apply { set(this@AppActivity) }
        ...
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Composable
fun App() = AppTheme {
    LocalPreferenceProvider {
        val preference = LocalPreference.current
        var value by remember { mutableStateOf("---") }
        var text by remember { mutableStateOf("") }

        Column(
            modifier = Modifier
                .fillMaxSize()
                .windowInsetsPadding(WindowInsets.safeDrawing)
                .padding(top = 36.dp, start = 16.dp, end = 16.dp),
            horizontalAlignment = Alignment.CenterHorizontally,
            verticalArrangement = Arrangement.Center
        ) {
            TextField(
                value = text,
                onValueChange = { text = it },
                label = { Text("Enter text") },
                modifier = Modifier
                    .fillMaxWidth()
                    .height(60.dp),
            )

            Row(
                modifier = Modifier
                    .padding(top = 30.dp),
                horizontalArrangement = Arrangement.spacedBy(12.dp)
            ) {
                Button(
                    modifier = Modifier
                        .height(54.dp)
                        .weight(1f),
                    onClick = {
                        if (text.isNotEmpty())
                            preference.put("ENTER_YOUR_KEY", text)
                    },
                    colors = ButtonDefaults.buttonColors(Color(0xFF007AFF)),
                ) {
                    Text(
                        "Store value",
                        style = MaterialTheme.typography.bodyLarge,
                        fontSize = 17.sp
                    )
                }

                Button(
                    modifier = Modifier
                        .height(54.dp)
                        .weight(1f),
                    onClick = {
                        value = preference.getString("ENTER_YOUR_KEY") ?: "---"
                    },
                    colors = ButtonDefaults.buttonColors(Color(0xFF007AFF)),
                ) {
                    Text(
                        "Get value",
                        style = MaterialTheme.typography.bodyLarge,
                        fontSize = 17.sp
                    )
                }
            }

            Text(
                text = "Stored value: $value",
                style = MaterialTheme.typography.titleLarge,
                textAlign = TextAlign.Center,
                fontSize = 20.sp,
                modifier = Modifier
                    .padding(top = 30.dp)
                    .fillMaxWidth()
            )
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Screenshot
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6ckdic9mn8fzdvexb3a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6ckdic9mn8fzdvexb3a.png" alt="CMPPreference" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork/CMP-shared-preference.git"&gt;Github Repo Link&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conlusion
&lt;/h2&gt;

&lt;p&gt;A CMPPreference enables shared preference management in Android and iOS apps using Compose Multiplatform, ensuring seamless cross-platform functionality. By unifying preference handling, developers can deliver a cohesive user experience and streamline app maintenance across both platforms.&lt;/p&gt;

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

&lt;p&gt;Connect with us 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.linkedin.com/showcase/mobile-innovation-network"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork"&gt;GitHub&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>android</category>
      <category>ios</category>
      <category>compose</category>
      <category>composemultiplatform</category>
    </item>
    <item>
      <title>SDP-SSP-Compose-Multiplatform</title>
      <dc:creator>Mobile innovation Network</dc:creator>
      <pubDate>Wed, 15 May 2024 09:55:09 +0000</pubDate>
      <link>https://forem.com/mobileinnovation/sdp-ssp-compose-multiplatform-6po</link>
      <guid>https://forem.com/mobileinnovation/sdp-ssp-compose-multiplatform-6po</guid>
      <description>&lt;p&gt;A scalable size unit for Compose Multiplatform for Android &amp;amp; iOS App&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Add the dependency to your build.gradle.kts file:&lt;/p&gt;


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

&lt;p&gt;commonMain.dependencies {&lt;br&gt;
    implementation("network.chaintech:sdp-ssp-compose-multiplatform:1.0.4")&lt;br&gt;
}&lt;/p&gt;

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

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Usage&lt;br&gt;
&lt;/h2&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;@Composable&lt;br&gt;
fun App() = AppTheme {&lt;br&gt;
    Box(&lt;br&gt;
        modifier = Modifier&lt;br&gt;
            .statusBarsPadding()&lt;br&gt;
            .fillMaxSize()&lt;br&gt;
            .background(Color.White),&lt;br&gt;
        contentAlignment = Alignment.Center&lt;br&gt;
    ) {&lt;br&gt;
        Card(&lt;br&gt;
            modifier = Modifier.fillMaxWidth(0.82f),&lt;br&gt;
            shape = RoundedCornerShape(16.sdp),&lt;br&gt;
            colors = CardDefaults.cardColors(Color(0xFFFBF3E8)),&lt;br&gt;
        ) {&lt;br&gt;
            Column(&lt;br&gt;
                modifier = Modifier.fillMaxWidth(),&lt;br&gt;
                horizontalAlignment = Alignment.CenterHorizontally,&lt;br&gt;
            ) {&lt;br&gt;
                Column(&lt;br&gt;
                    modifier = Modifier&lt;br&gt;
                        .fillMaxWidth()&lt;br&gt;
                        .background(Color(0xFF585DDB))&lt;br&gt;
                        .padding(vertical = 16.sdp),&lt;br&gt;
                    horizontalAlignment = Alignment.CenterHorizontally,&lt;br&gt;
                ) {&lt;br&gt;
                    Image(&lt;br&gt;
                        modifier = Modifier&lt;br&gt;
                            .size(80.sdp),&lt;br&gt;
                        painter = painterResource(Res.drawable.ic_user),&lt;br&gt;
                        contentDescription = null,&lt;br&gt;
                        contentScale = ContentScale.FillBounds&lt;br&gt;
                    )&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                Text(
                    text = "Emily Dounger",
                    fontSize = 16.ssp,
                    color = Color.White,
                    fontWeight = FontWeight.Bold,
                    modifier = Modifier.padding(top = 12.sdp)
                )
            }

            Text(
                text = "Hi there \uD83D\uDC4B , We are Boards to share initital Goals and ideas.",
                fontSize = 14.ssp,
                textAlign = TextAlign.Center,
                color = Color.Black,
                lineHeight = 18.ssp,
                fontWeight = FontWeight.Bold,
                modifier = Modifier.padding(top = 30.sdp).padding(horizontal = 20.sdp)
            )

            Button(
                onClick = {},
                colors = ButtonDefaults.buttonColors(Color(0xFF007AFF)),
                modifier = Modifier.padding(top = 24.sdp, bottom = 20.sdp)
                    .padding(horizontal = 20.sdp).fillMaxWidth().height(40.sdp)
            ) {
                Text(text = "Say Hello", fontSize = 16.ssp)
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

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

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Android&lt;br&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;with using &lt;strong&gt;dp&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.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%2F8nx7z1biggjlp29tlv41.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F8nx7z1biggjlp29tlv41.png" alt="Android dp"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;with using &lt;strong&gt;sdp&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fnv5os5altabr5ks6mvz6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fnv5os5altabr5ks6mvz6.png" alt="Android sdp"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  iOS
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;with using &lt;strong&gt;dp&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fx2m9ypii0wnwxr3zhvgq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fx2m9ypii0wnwxr3zhvgq.png" alt="iOS dp"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;with using &lt;strong&gt;sdp&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ff6ur9d1ud8fid17c8vr8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ff6ur9d1ud8fid17c8vr8.png" alt="iOS sdp"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Desktop
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;with using &lt;strong&gt;sdp&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fu3cv3haz1y3e7qlijhzg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fu3cv3haz1y3e7qlijhzg.png" alt="Desktop sdp"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork/sdp-ssp-compose-multiplatform.git" rel="noopener noreferrer"&gt;https://github.com/ChainTechNetwork/sdp-ssp-compose-multiplatform.git&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Connect with us 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/showcase/mobile-innovation-network" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/r?url=https%3A%2F%2Fgithub.com%2FChainTechNetwork" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>android</category>
      <category>ios</category>
      <category>compose</category>
      <category>composemultiplatform</category>
    </item>
    <item>
      <title>Navigation in Compose Multiplatform with Animations</title>
      <dc:creator>Mobile innovation Network</dc:creator>
      <pubDate>Fri, 26 Apr 2024 10:43:29 +0000</pubDate>
      <link>https://forem.com/mobileinnovation/navigation-in-compose-multiplatform-with-animations-212j</link>
      <guid>https://forem.com/mobileinnovation/navigation-in-compose-multiplatform-with-animations-212j</guid>
      <description>&lt;p&gt;Greetings developers! Today, I’ll guide you through designing a bottom navigation bar in Compose Multiplatform using the Navigation component, which includes the Nav Controller and Nav Host.&lt;/p&gt;

&lt;p&gt;Let’s get started by adding the following dependency to your Gradle file and rebuilding your app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;implementation "org.jetbrains.androidx.navigation:navigation-compose:2.8.0-alpha02"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create Navigation.kt class&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import androidx.compose.animation.AnimatedContentTransitionScope
import androidx.compose.animation.core.tween
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.selection.selectableGroup
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.BottomAppBarDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import androidx.navigation.NavDestination
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import composemultiplatformmediaplayer.composeapp.generated.resources.Res
import composemultiplatformmediaplayer.composeapp.generated.resources.ic_camera_reels_fill
import composemultiplatformmediaplayer.composeapp.generated.resources.ic_home
import composemultiplatformmediaplayer.composeapp.generated.resources.ic_profile_circle
import network.chaintech.cmpmediaplayer.ui.DetailsView
import network.chaintech.cmpmediaplayer.ui.HomeView
import network.chaintech.cmpmediaplayer.ui.ProfileView
import network.chaintech.cmpmediaplayer.ui.ReelsView
import network.chaintech.cmpmediaplayer.utils.AppConstants
import org.jetbrains.compose.resources.DrawableResource
import org.jetbrains.compose.resources.painterResource

sealed class AppScreen(val route: String) {
    data object Detail : AppScreen("nav_detail")
}

sealed class BottomBarScreen(
    val route: String,
    var title: String,
    val defaultIcon: DrawableResource
) {
    data object Home : BottomBarScreen(
        route = "HOME",
        title = "Home",
        defaultIcon = Res.drawable.ic_home,
    )

    data object Reels : BottomBarScreen(
        route = "REELS",
        title = "Reels",
        defaultIcon = Res.drawable.ic_camera_reels_fill,
    )

    data object Profile : BottomBarScreen(
        route = "PROFILE",
        title = "Profile",
        defaultIcon = Res.drawable.ic_profile_circle,
    )
}

@Composable
fun HomeNav() {
    val navController = rememberNavController()

    NavHostMain(
        navController = navController,
        onNavigate = { routeName -&amp;gt;
            navigateTo(routeName, navController)
        }
    )
}

@Composable
fun NavHostMain(
    navController: NavHostController = rememberNavController(),
    onNavigate: (rootName: String) -&amp;gt; Unit,
) {
    val backStackEntry by navController.currentBackStackEntryAsState()
    val currentScreen = backStackEntry?.destination

    Scaffold(
        topBar = {
            val title = getTitle(currentScreen)
            TopBar(
                title = title,
                canNavigateBack = currentScreen?.route == AppScreen.Detail.route,
                navigateUp = { navController.navigateUp() }
            )
        },
        bottomBar = {
            BottomNavigationBar(navController)
        }
    ) { innerPadding -&amp;gt;
        NavHost(
            navController = navController,
            startDestination = BottomBarScreen.Home.route,
            modifier = Modifier
                .fillMaxSize()
                .padding(innerPadding),
            enterTransition = {
                slideIntoContainer(
                    AnimatedContentTransitionScope.SlideDirection.Left,
                    animationSpec = tween(500)
                )
            },
            exitTransition = {
                slideOutOfContainer(
                    AnimatedContentTransitionScope.SlideDirection.Left,
                    animationSpec = tween(500)
                )
            },
            popEnterTransition = {
                slideIntoContainer(
                    AnimatedContentTransitionScope.SlideDirection.Right,
                    animationSpec = tween(500)
                )
            },
            popExitTransition = {
                slideOutOfContainer(
                    AnimatedContentTransitionScope.SlideDirection.Right,
                    animationSpec = tween(500)
                )
            }
        ) {
            composable(route = BottomBarScreen.Home.route) {
                HomeView(onNavigate = onNavigate)
            }
            composable(route = BottomBarScreen.Reels.route) {
                ReelsView(onNavigate = onNavigate)
            }
            composable(route = BottomBarScreen.Profile.route) {
                ProfileView(onNavigate = onNavigate)
            }
            composable(route = AppScreen.Detail.route) {
                DetailsView(onNavigate = onNavigate)
            }
        }
    }
}

fun getTitle(currentScreen: NavDestination?): String {
    return when (currentScreen?.route) {
        BottomBarScreen.Home.route -&amp;gt; {
            "Home"
        }

        BottomBarScreen.Reels.route -&amp;gt; {
            "Reels"
        }

        BottomBarScreen.Profile.route -&amp;gt; {
            "Profile"
        }

        AppScreen.Detail.route -&amp;gt; {
            "Detail"
        }

        else -&amp;gt; {
            ""
        }
    }
}

fun navigateTo(
    routeName: String,
    navController: NavController
) {
    when (routeName) {
        AppConstants.BACK_CLICK_ROUTE -&amp;gt; {
            navController.popBackStack()
        }

        else -&amp;gt; {
            navController.navigate(routeName)
        }
    }
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TopBar(
    title: String,
    canNavigateBack: Boolean,
    navigateUp: () -&amp;gt; Unit,
    modifier: Modifier = Modifier
) {
    TopAppBar(
        title = { Text(title) },
        colors = TopAppBarDefaults.mediumTopAppBarColors(
            containerColor = MaterialTheme.colorScheme.primaryContainer
        ),
        modifier = modifier,
        navigationIcon = {
            if (canNavigateBack) {
                IconButton(onClick = navigateUp) {
                    Icon(
                        imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                        contentDescription = "back_button"
                    )
                }
            }
        }
    )
}

@Composable
fun BottomNavigationBar(
    navController: NavHostController,
) {
    val homeItem = BottomBarScreen.Home
    val reelsItem = BottomBarScreen.Reels
    val profileItem = BottomBarScreen.Profile

    val screens = listOf(
        homeItem,
        reelsItem,
        profileItem
    )

    AppBottomNavigationBar(show = navController.shouldShowBottomBar) {
        screens.forEach { item -&amp;gt;
            AppBottomNavigationBarItem(
                icon = item.defaultIcon,
                label = item.title,
                onClick = {
                    navigateBottomBar(navController, item.route)
                },
                selected = navController.currentBackStackEntry?.destination?.route == item.route
            )
        }
    }
}

@Composable
fun AppBottomNavigationBar(
    modifier: Modifier = Modifier,
    show: Boolean,
    content: @Composable (RowScope.() -&amp;gt; Unit),
) {
    Surface(
        color = MaterialTheme.colorScheme.background,
        contentColor = MaterialTheme.colorScheme.onBackground,
        modifier = modifier.windowInsetsPadding(BottomAppBarDefaults.windowInsets)
    ) {
        if (show) {
            Column {
                HorizontalDivider(
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(1.dp),
                    color = MaterialTheme.colorScheme.outline.copy(alpha = 0.2f)
                )

                Row(
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(65.dp)
                        .selectableGroup(),
                    verticalAlignment = Alignment.CenterVertically,
                    content = content
                )
            }
        }
    }
}

@Composable
fun RowScope.AppBottomNavigationBarItem(
    modifier: Modifier = Modifier,
    icon: DrawableResource,
    label: String,
    onClick: () -&amp;gt; Unit,
    selected: Boolean,
) {
    Column(
        modifier = modifier
            .weight(1f)
            .clickable(
                onClick = onClick,
            ),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.spacedBy(4.dp)
    ) {
        Image(
            painter = painterResource(icon),
            contentDescription = icon.toString(),
            contentScale = ContentScale.Crop,
            colorFilter = if (selected) {
                ColorFilter.tint(MaterialTheme.colorScheme.primary)
            } else {
                ColorFilter.tint(MaterialTheme.colorScheme.outline)
            },
            modifier = modifier.then(
                Modifier.clickable {
                    onClick()
                }
                    .size(24.dp)
            )
        )

        Text(
            text = label,
            style = MaterialTheme.typography.bodyMedium,
            fontWeight = if (selected) {
                FontWeight.SemiBold
            } else {
                FontWeight.Normal
            },
            color = if (selected) {
                MaterialTheme.colorScheme.primary
            } else {
                MaterialTheme.colorScheme.outline
            }
        )
    }
}

private fun navigateBottomBar(navController: NavController, destination: String) {
    navController.navigate(destination) {
        navController.graph.startDestinationRoute?.let { route -&amp;gt;
            popUpTo(BottomBarScreen.Home.route) {
                saveState = true
            }
        }
        launchSingleTop = true
        restoreState = true
    }
}

private val NavController.shouldShowBottomBar
    get() = when (this.currentBackStackEntry?.destination?.route) {
        BottomBarScreen.Home.route,
        BottomBarScreen.Reels.route,
        BottomBarScreen.Profile.route,
        -&amp;gt; true

        else -&amp;gt; false
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Screens create ScreenView.kt&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import network.chaintech.cmpmediaplayer.navigation.AppScreen
import network.chaintech.cmpmediaplayer.utils.AppConstants

@Composable
fun HomeView(onNavigate: (String) -&amp;gt; Unit) {
    Column(
        modifier = Modifier
            .fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center
    ) {
        Text("Home")

        Spacer(modifier = Modifier.height(50.dp))

        Text(
            text = "Go to Detail screen",
            modifier = Modifier.clickable {
                onNavigate(AppScreen.Detail.route)
            }
        )
    }
}

@Composable
fun ReelsView(onNavigate: (String) -&amp;gt; Unit) {
    Column(
        modifier = Modifier
            .fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center
    ) {
        Text("Reels")

        Spacer(modifier = Modifier.height(50.dp))

        Text(
            text = "Go to Detail screen",
            modifier = Modifier.clickable {
                onNavigate(AppScreen.Detail.route)
            }
        )
    }
}

@Composable
fun ProfileView(onNavigate: (String) -&amp;gt; Unit) {
    Column(
        modifier = Modifier
            .fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center
    ) {
        Text("Profile")

        Spacer(modifier = Modifier.height(50.dp))

        Text(
            text = "Go to Detail screen",
            modifier = Modifier.clickable {
                onNavigate(AppScreen.Detail.route)
            }
        )
    }
}

@Composable
fun DetailsView(onNavigate: (String) -&amp;gt; Unit) {
    Column(
        modifier = Modifier
            .clickable {

            }
            .fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center
    ) {
        Text("Details")

        Text(
            text = "Back",
            modifier = Modifier.clickable {
                onNavigate(AppConstants.BACK_CLICK_ROUTE)
            }
        )
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Composable&lt;br&gt;
internal fun App() = AppTheme {&lt;br&gt;
    HomeNav()&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Structure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffqtnddjlkxx09xcfx6b8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffqtnddjlkxx09xcfx6b8.png" alt="Structure" width="680" height="1436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finally the output:&lt;/strong&gt;&lt;br&gt;
Android Demo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7079em7w2f1p2kb95li2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7079em7w2f1p2kb95li2.gif" alt="Android" width="354" height="758"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;iOS Demo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvwmk7555ckq7zzyxgnu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvwmk7555ckq7zzyxgnu.gif" alt="iOS" width="358" height="748"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Connect with us 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/showcase/mobile-innovation-network"&gt;Linkedin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ChainTechNetwork"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>composemultiplatform</category>
      <category>compose</category>
      <category>navigatio</category>
      <category>ios</category>
    </item>
    <item>
      <title>ScreenCapture -Compose Multiplatform(KMP)</title>
      <dc:creator>Mobile innovation Network</dc:creator>
      <pubDate>Thu, 25 Apr 2024 12:11:51 +0000</pubDate>
      <link>https://forem.com/mobileinnovation/screencapture-compose-multiplatformkmp-2ep1</link>
      <guid>https://forem.com/mobileinnovation/screencapture-compose-multiplatformkmp-2ep1</guid>
      <description>&lt;p&gt;ScreenCapture is a Compose Multiplatform library for capturing screens in your Android or iOS App.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4540dg2vmyg72phxjwed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4540dg2vmyg72phxjwed.png" alt="ScreenCapture" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Add the dependency to your &lt;code&gt;build.gradle.kts&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commonMain.dependencies {
    implementation("network.chaintech:compose-multiplatform-screen-capture:1.0.2")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Android&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Include this in your &lt;code&gt;AndroidManifest.xml&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="network.chaintech.cmp.screenshot.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true"&amp;gt;
    &amp;lt;meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" /&amp;gt;
&amp;lt;/provider&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create &lt;code&gt;file_paths.xml&lt;/code&gt; in androidMain-&amp;gt;res-&amp;gt;xml and add the following code:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;paths xmlns:android="http://schemas.android.com/apk/res/android"&amp;gt;
    &amp;lt;files-path
        name="screen_shots"
        path="share_images" /&amp;gt;
    &amp;lt;external-path
        name="external_files"
        path="." /&amp;gt;
&amp;lt;/paths&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add the following line in onCreate of your Activity class:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class AppActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        AppContext.apply { set(this@AppActivity) }
        ...
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Composable Usage&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;@Composable
internal fun App() = AppTheme {
    PaymentReceived()
}

@Composable
fun PaymentReceived() {
    val captureController = rememberScreenCaptureController()
    Column(
        modifier = Modifier
            .fillMaxSize()
            .background(Color(0xFF004DEF))
    ) {
        Row(
            modifier = Modifier.padding(top = 20.dp).statusBarsPadding(),
            verticalAlignment = Alignment.CenterVertically
        ) {
            Spacer(modifier = Modifier.weight(1f))
            Icon(
                Icons.Filled.Share,
                "Share",
                modifier = Modifier.padding(end = 12.dp).size(28.dp)
                    .clickable { captureController.capture() },
                tint = Color.White
            )
        }

        ScreenCaptureComposable(
            modifier = Modifier,
            screenCaptureController = captureController,
            shareImage = true,
            onCaptured = { img, throwable -&amp;gt;

            }
        ) {
            AppTheme {
                Column(modifier = Modifier.background(Color.White)) {
                    PaymentReceivedView()
                }
            }
        }
    }
}

@Composable
fun ColumnScope.PaymentReceivedView() {
    Box(modifier = Modifier.fillMaxWidth()) {
        Box(modifier = Modifier.height(200.dp).fillMaxWidth().background(Color(0xFF004DEF))) {
            Text(
                text = "Invoice",
                style = TextStyle(fontSize = 20.sp, color = Color.White),
                fontWeight = FontWeight.Medium,
                modifier = Modifier.padding(top = 18.dp).align(Alignment.TopCenter)
            )
        }
        Card(
            modifier = Modifier
                .padding(top = 96.dp, start = 16.dp, end = 16.dp, bottom = 30.dp)
                .fillMaxWidth(),
            colors = CardDefaults.cardColors(Color.White),
            shape = RoundedCornerShape(6.dp),
            elevation = CardDefaults.cardElevation(2.dp)
        ) {
            Column(
                modifier = Modifier
                    .fillMaxWidth()
            ) {
                Text(
                    text = "Money Transfer",
                    style = TextStyle(fontSize = 20.sp, color = Color.Black),
                    fontWeight = FontWeight.Medium,
                    modifier = Modifier.padding(top = 50.dp).align(Alignment.CenterHorizontally)
                )
                Text(
                    text = "Powered by MobiKwik",
                    style = TextStyle(fontSize = 20.sp, color = Color.Black),
                    fontWeight = FontWeight.Medium,
                    modifier = Modifier.padding(top = 4.dp).align(Alignment.CenterHorizontally)
                )

                Column(
                    modifier = Modifier
                        .fillMaxWidth(0.8f)
                        .padding(top = 16.dp)
                        .background(Color(0xFFF7F7F7), RoundedCornerShape(8.dp))
                        .padding(bottom = 10.dp).align(Alignment.CenterHorizontally),
                ) {
                    Text(
                        text = "Order ID: OMK25e9ef4ed5005544",
                        style = TextStyle(fontSize = 14.sp, color = Color.Gray),
                        modifier = Modifier.padding(top = 10.dp, start = 16.dp, end = 16.dp)
                    )

                    DashedLine(modifier = Modifier.padding(top = 10.dp).height(2.dp).fillMaxWidth())

                    Text(
                        text = "UPI Transaction ID: 4320692331397",
                        style = TextStyle(fontSize = 14.sp, color = Color.Gray),
                        modifier = Modifier.padding(top = 10.dp, start = 16.dp, end = 16.dp)
                    )
                }
                Text(
                    text = "Fri, 04 Feb 2024, 8:12 pm",
                    style = TextStyle(fontSize = 14.sp, color = Color.Gray),
                    modifier = Modifier.padding(top = 16.dp, bottom = 16.dp)
                        .align(Alignment.CenterHorizontally)
                )
            }
        }
        Column(modifier = Modifier.fillMaxWidth()) {
            Card(
                modifier = Modifier
                    .padding(top = 66.dp)
                    .size(60.dp)
                    .align(Alignment.CenterHorizontally),
                colors = CardDefaults.cardColors(Color.White),
                shape = CircleShape,
                elevation = CardDefaults.cardElevation(0.dp)
            ) {
                Box(
                    modifier = Modifier
                        .padding(3.dp)
                        .fillMaxSize()
                        .border(2.dp, Color(0xFF004DEF), CircleShape)
                        .clip(CircleShape)
                        .align(Alignment.CenterHorizontally)
                ) {
                    Icon(
                        Icons.Filled.Done,
                        "Share",
                        modifier = Modifier.size(36.dp).align(Alignment.Center),
                        tint = Color.Green
                    )
                }
            }
        }
    }
    Column(
        modifier = Modifier.background(Color(0xFFE6EBE5))
            .padding(horizontal = 14.dp, vertical = 18.dp)
    ) {
        Row(modifier = Modifier.fillMaxWidth()) {
            Text(
                text = "Total Amount Paid",
                style = TextStyle(fontSize = 20.sp, color = Color.Black),
                fontWeight = FontWeight.Medium,
                modifier = Modifier
            )
            Spacer(modifier = Modifier.width(1.dp).weight(1f))
            Text(
                text = "₹395",
                style = TextStyle(fontSize = 20.sp, color = Color.Black),
                fontWeight = FontWeight.Medium,
                modifier = Modifier
            )
        }
        Text(
            text = "Paid from UPI: ₹395",
            style = TextStyle(fontSize = 14.sp, color = Color.Gray),
            modifier = Modifier.padding(top = 8.dp)
        )
    }

    Text(
        text = "Billed To",
        style = TextStyle(fontSize = 16.sp, color = Color.Black),
        modifier = Modifier.padding(top = 20.dp, start = 14.dp, end = 14.dp)
    )

    Row(modifier = Modifier.padding(top = 8.dp, start = 14.dp, end = 14.dp).fillMaxWidth()) {
        Text(
            text = "Name",
            style = TextStyle(fontSize = 16.sp, color = Color.Gray),
            modifier = Modifier
        )
        Spacer(modifier = Modifier.width(1.dp).weight(1f))
        Text(
            text = "Robert Jhon Castillo",
            style = TextStyle(fontSize = 16.sp, color = Color.Black),
            modifier = Modifier
        )
    }
    Row(modifier = Modifier.padding(top = 8.dp, start = 14.dp, end = 14.dp).fillMaxWidth()) {
        Text(
            text = "Mobile No.",
            style = TextStyle(fontSize = 16.sp, color = Color.Gray),
            modifier = Modifier
        )
        Spacer(modifier = Modifier.width(1.dp).weight(1f))
        Text(
            text = "7896554456",
            style = TextStyle(fontSize = 16.sp, color = Color.Black),
            modifier = Modifier
        )
    }
    Row(modifier = Modifier.padding(top = 8.dp, start = 14.dp, end = 14.dp).fillMaxWidth()) {
        Text(
            text = "VPA",
            style = TextStyle(fontSize = 16.sp, color = Color.Gray),
            modifier = Modifier
        )
        Spacer(modifier = Modifier.width(1.dp).weight(1f))
        Text(
            text = "7896554456@ikwik",
            style = TextStyle(fontSize = 16.sp, color = Color.Black),
            modifier = Modifier
        )
    }

    Text(
        text = "Received By",
        style = TextStyle(fontSize = 16.sp, color = Color.Black),
        modifier = Modifier.padding(top = 20.dp, start = 14.dp, end = 14.dp)
    )

    Row(modifier = Modifier.padding(top = 8.dp, start = 14.dp, end = 14.dp).fillMaxWidth()) {
        Text(
            text = "Name",
            style = TextStyle(fontSize = 16.sp, color = Color.Gray),
            modifier = Modifier
        )
        Spacer(modifier = Modifier.width(1.dp).weight(1f))
        Text(
            text = "Robert Jhon Castillo",
            style = TextStyle(fontSize = 16.sp, color = Color.Black),
            modifier = Modifier
        )
    }
    Row(modifier = Modifier.padding(top = 8.dp, start = 14.dp, end = 14.dp).fillMaxWidth()) {
        Text(
            text = "Mobile No.",
            style = TextStyle(fontSize = 16.sp, color = Color.Gray),
            modifier = Modifier
        )
        Spacer(modifier = Modifier.width(1.dp).weight(1f))
        Text(
            text = "NA",
            style = TextStyle(fontSize = 16.sp, color = Color.Black),
            modifier = Modifier
        )
    }
    Row(modifier = Modifier.padding(top = 8.dp, start = 14.dp, end = 14.dp).fillMaxWidth()) {
        Text(
            text = "VPA",
            style = TextStyle(fontSize = 16.sp, color = Color.Gray),
            modifier = Modifier
        )
        Spacer(modifier = Modifier.width(1.dp).weight(1f))
        Text(
            text = "paytm-jiomobility@paytm",
            style = TextStyle(fontSize = 16.sp, color = Color.Black),
            modifier = Modifier
        )
    }
    Image(
        modifier = Modifier
            .padding(top = 26.dp, bottom = 40.dp)
            .size(90.dp)
            .align(Alignment.CenterHorizontally),
        painter = painterResource(Res.drawable.qr_code),
        contentDescription = null,
        contentScale = ContentScale.Crop
    )
}

@Composable
private fun DashedLine(modifier: Modifier) {
    val pathEffect = PathEffect.dashPathEffect(floatArrayOf(10f, 10f), 0f)
    Canvas(modifier) {

        drawLine(
            color = Color.Gray,
            start = Offset(0f, 0f),
            end = Offset(size.width, 0f),
            pathEffect = pathEffect
        )
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;modifier&lt;/strong&gt;: Modifier for modifying the layout of the screen capture component.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;screenCaptureController&lt;/strong&gt;: Controller for managing the screen capture functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;shareImage&lt;/strong&gt;: Boolean indicating whether the user intends to share the captured image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;onCaptured&lt;/strong&gt;: Callback invoked when an image is successfully captured or when there's a failure during the capture process. It provides an ImageBitmap representing the captured image and a Throwable in case of any errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;content&lt;/strong&gt;: A composable function that defines the content to be displayed within the screen capture component. This could include buttons, text, or any other UI elements related to screen capture functionality.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork/ComposeMultiplatformScreenCapture.git"&gt;Repository link&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Android Demo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybulujw06ovga88wrjqk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybulujw06ovga88wrjqk.gif" alt="Android" width="400" height="849"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;iOS Demo&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu3ywo3laqwn2c9noevkg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu3ywo3laqwn2c9noevkg.gif" alt="iOS" width="358" height="748"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect with us 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.linkedin.com/showcase/mobile-innovation-network"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/ChainTechNetwork"&gt;GitHub&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>screencapture</category>
      <category>composemultiplatform</category>
      <category>android</category>
      <category>ios</category>
    </item>
  </channel>
</rss>
