Trung  Nguyen

Trung Nguyen

1657870620

Triển Khai Các Lệnh Gọi Lại Tùy Chọn Trong Kotlin

Kết quả tác vụ rất quan trọng trong một chương trình, vì chúng xác định xem tác vụ tiếp theo có được thực thi hay không. Các chương trình tốt nhất là những chương trình có thể thăm dò và tìm nạp kết quả một cách tự động và đồng bộ.

Android có một cơ chế được gọi là gọi lại tùy chọn cho phép các phương thức và lớp của bạn nhận kết quả thất bại và thành công của một tác vụ khác mà không cần phải gọi đi gọi lại lớp khác chỉ để nhận kết quả.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về các lệnh gọi lại tùy chọn và cách triển khai chúng trong Kotlin . Ngoài ra, chúng tôi sẽ khám phá các thư viện triển khai chức năng này cho bạn.

Gọi lại tùy chọn là gì?

Các lệnh gọi lại của Android cho phép phương thức của bạn tìm nạp kết quả từ một phương pháp khác một cách đồng bộ. Gọi lại hoạt động như sứ giả; chúng là trung tâm giao tiếp trong một chương trình và được chuyển vào các hàm dưới dạng đối số. Chúng giúp hoàn thành nhiệm vụ của một chức năng bằng cách cung cấp kết quả, hoặc tiêu cực hoặc tích cực. Một lệnh gọi lại tùy chọn nêu rõ điều gì sẽ xảy ra khi các kết quả khác nhau được tìm nạp từ một phương thức hoặc hàm khác.

Các lệnh gọi lại tùy chọn cũng cho phép các chức năng dựa vào lệnh gọi lại tiếp tục ngay cả khi lệnh gọi lại trả về lỗi, hỗ trợ bảo trì và độ tin cậy ở mức cao.

Các lệnh gọi lại tùy chọn rất quan trọng vì chúng đảm bảo rằng người dùng có thể thưởng thức ứng dụng của bạn mà không bị gián đoạn bằng cách ngăn ứng dụng bị đóng băng và chặn. Giao diện người dùng bị đóng băng có thể khiến nhiều người gỡ cài đặt ứng dụng của bạn.

Sự khác biệt giữa lệnh gọi lại tùy chọn và tiêu chuẩn là gì?

Là một nhà phát triển Android, tôi sử dụng các lệnh gọi lại hàng ngày, bắt đầu từ onCreate()phương pháp tạo ra một hoạt động khi một ứng dụng được khởi chạy. Đây là ví dụ điển hình về lệnh gọi lại mà bạn sẽ sử dụng hàng triệu lần trong hành trình phát triển Android của mình.

Khi ứng dụng của bạn gặp sự cố ở thời điểm bắt đầu, bạn có thể tìm thấy sự cố trong lần gọi lại này:

override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   setContentView(R.layout.activity_main)
}

Dưới đây là một ví dụ khác về lệnh gọi lại điển hình được gọi khi hoạt động bị tạm dừng:

override fun onPause() {
        super.onPause()
        print("onPause")
    }

Các lệnh gọi lại ở trên hoạt động rất tốt trong vòng đời hoạt động và vòng đời phân mảnh của Android . Nhưng, vấn đề nảy sinh khi phương thức được thực hiện trong cuộc onPause()gọi lại không hoạt động. Một lệnh gọi lại tùy chọn sẽ cho biết điều gì sẽ xảy ra nếu lỗi đó xảy ra.

 

Triển khai các lệnh gọi lại tùy chọn trong Kotlin từ đầu

Việc sử dụng các lệnh gọi lại tùy chọn trong chương trình của bạn không nên là tùy chọn. Các lệnh gọi lại tùy chọn giúp hoạt động của bạn diễn ra liên tục ngay cả khi các trường hợp ngoại lệ xảy ra và các tác vụ tạo ra kết quả tiêu cực.

Bây giờ, đây là một ví dụ về một lệnh gọi lại tùy chọn:

Result.of<T, Throwable>(doTask())
      .flatMap { normalizedData(it) }
      .map { createRequestFromData(it) }
      .flatMap { database.updateFromRequest(it) }

Thêm các trường hợp thất bại và thành công:

//if successful
result.success {
}

//if failed
result.failure {
}

Gọi lại tùy chọn ở trên có các điều kiện: chuyển đổi thất bại và thành công. Bạn phải nêu rõ điều gì sẽ xảy ra nếu kết quả từ một lớp khác là tiêu cực hoặc tích cực. Bằng cách này, bạn sẽ có thể đóng các quy trình và chức năng có thể làm hỏng ứng dụng khi gọi lại trả về kết quả âm.

Đây là một ví dụ khác về một lệnh gọi lại tùy chọn không sử dụng thư viện. Lệnh gọi lại tùy chọn được hiển thị bên dưới cung cấp ba trường hợp sẽ được kích hoạt khi kết quả được thông qua. Bạn có cơ hội để làm điều gì đó nếu hoạt ảnh lặp lại, kết thúc hoặc bắt đầu:

animation.setAnimationListener(object : Animation.AnimationListener {
   override fun onAnimationRepeat(animation: Animation?) {

   }

   override fun onAnimationEnd(animation: Animation?) {
       doSomething()
   }

   override fun onAnimationStart(animation: Animation?) {
          }
})

Một cấu trúc gọi lại tùy chọn chủ yếu bao gồm một khối mã tìm nạp kết quả, theo sau là trường hợp thất bại và thành công (hoặc bất kỳ trường hợp nào bạn muốn được thực thi khi nhận được một số kết quả nhất định). Tuy nhiên, bạn có thể thêm các trường hợp khác nếu bạn đang thực hiện chúng bắt đầu từ đầu mà không có sự can thiệp của thư viện.

Một thư viện (như Kết quả ) giúp bạn dễ dàng hơn bằng cách đưa ra hai trường hợp: thất bại và thành công. Tất cả những gì bạn phải làm là thêm mã sẽ được thêm vào khi trường hợp thành công hoặc thất bại xảy ra.

Các trường hợp thất bại và thành công là những gì làm cho các lệnh gọi lại tùy chọn khác với các lệnh gọi lại thông thường:

//if successful
result.success {

}
//if failed
result.failure {

}

Triển khai các lệnh gọi lại tùy chọn trong Kotlin bằng cách sử dụng Kết quả

Kết quả là một thư viện Kotlin cho phép bạn triển khai các lệnh gọi lại tùy chọn và giúp bạn xử lý lỗi nhanh chóng.

Để bắt đầu, hãy thêm các phần phụ thuộc sau vào gradle.buildtệp và đồng bộ hóa Gradle để tải xuống thư viện của bên thứ ba:

implementation("com.github.kittinunf.result:result-jvm:5.2.1")
implementation ("com.github.kittinunf.result:result:5.2.1")

Hãy xem kết quả hoạt động như thế nào trong trường hợp chúng ta muốn mở một tệp văn bản và đọc nó. Để nhận được kết quả của việc mở tác vụ tệp văn bản, chúng tôi sử dụng đối tượng Kotlin Result, đối tượng này tìm nạp giá trị thành công và thất bại của readText task:

val operation = { File("/path/to/file/foo.txt").readText() }
Result.of { operation() }  

Tiếp theo, chúng tôi tạo một normalizedData(foo)chức năng sắp xếp và đơn giản hóa dữ liệu được thu thập từ hoạt động. Chuẩn hóa dữ liệu bằng cách gọi normalize()hàm:

fun normalizedData(foo): Result<Boolean, NormalizedThrowable> {
    Result.of { foo.normalize() }
}

Tiếp theo, tạo một yêu cầu từ dữ liệu mà chúng tôi đã chuẩn hóa ở trên:

fun createRequestFromData(foo): Request {
    return createRequest(foo)
}

Sau khi yêu cầu dữ liệu, hãy tạo một hàm cơ sở dữ liệu như hình dưới đây để cập nhật các giá trị của đối tượng Kết quả. Nếu giao dịch cập nhật không thành công thì một ngoại lệ sẽ được đưa ra:

fun database.updateFromRequest(request): Result<Boolean, DBThrowable> {
    val transaction = request.transaction
    return Result.of { 
        db.openTransaction {
            val success = db.execute(transaction)
            if (!success) {
                throw DBThrowable("Error")
            }
            return success
        }
    }
}

Sau khi bạn đã tìm nạp thông tin bằng đối tượng Kết quả, đã đến lúc thêm các trường hợp thành công và thất bại. Bắt đầu bằng cách khai báo giá trị:

val (value, error) = result

Bây giờ, lấy giá trị kết quả:

val value: Int = result.get()

Bây giờ thêm các trường hợp thành công và thất bại:

result.success {
//Add code that does something when the task is successful here
}

result.failure {
//add code that warns the user that an error has occurred here.
}

Triển khai các lệnh gọi lại tùy chọn trong Kotlin bằng cách sử dụng callback-ktx

Thư viện callback-ktx bao bọc và chuyển đổi các API dựa trên callback thành tạm ngưng các chức năng mở rộng. Hiện tại, callback-ktx chỉ hỗ trợ các API sau:

  • Hoạt hình
  • Địa điểm
  • RecyclerView
  • cảm biến
  • Lượt xem
  • Tiện ích con (TextView)

Sử dụng mã sau để tải xuống phần phụ thuộc callback-ktx:

implementation("io.github.sagar-viradiya:callback-core-ktx:1.0.0")

Sau khi bạn đã tải xuống thư viện, Bạn có thể theo dõi các hoạt ảnh bằng cách gọi lifecycleScopeđối tượng để lấy phạm vi của vòng đời. Tiếp theo, gọi awaitStart()phương thức, phương thức này sẽ được kích hoạt khi hoạt ảnh.

Bây giờ, bạn có cơ hội để nêu và thêm mã cụ thể sẽ chỉ được thực thi khi hoạt ảnh bắt đầu:

viewLifecycleOwner.lifecycleScope.launch {
  animator.awaitStart()
  // insert code that does something when the animation starts here.
 }

Bạn có thể xem thêm các trường hợp sử dụng của thư viện callback-ktx tại đây . Nếu bạn vẫn có cơ sở mã Android sử dụng Java, bạn có thể sử dụng Vulture để triển khai các lệnh gọi lại một cách an toàn.

Sự kết luận

Trong bài viết này, chúng ta đã tìm hiểu về lợi ích của các lệnh gọi lại tùy chọn, sự khác biệt giữa lệnh gọi lại tùy chọn và thông thường cũng như cách triển khai lệnh gọi lại bằng cách sử dụng Result và callback-ktx.

Các cuộc gọi lại tùy chọn chắc chắn sẽ cung cấp cho bạn nhiều khả năng và sự lựa chọn hơn khi nói rõ điều gì sẽ xảy ra khi lỗi và kết quả thành công được trả về bởi cuộc gọi lại.

Nếu bạn có bất kỳ câu hỏi hoặc ý kiến ​​nào, đừng ngại để lại trong phần bình luận bên dưới.

Nguồn: https://blog.logrocket.com/implecting-optional-callbacks-kotlin-scratch/

#kotlin 

What is GEEK

Buddha Community

Triển Khai Các Lệnh Gọi Lại Tùy Chọn Trong Kotlin
Trung  Nguyen

Trung Nguyen

1657870620

Triển Khai Các Lệnh Gọi Lại Tùy Chọn Trong Kotlin

Kết quả tác vụ rất quan trọng trong một chương trình, vì chúng xác định xem tác vụ tiếp theo có được thực thi hay không. Các chương trình tốt nhất là những chương trình có thể thăm dò và tìm nạp kết quả một cách tự động và đồng bộ.

Android có một cơ chế được gọi là gọi lại tùy chọn cho phép các phương thức và lớp của bạn nhận kết quả thất bại và thành công của một tác vụ khác mà không cần phải gọi đi gọi lại lớp khác chỉ để nhận kết quả.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về các lệnh gọi lại tùy chọn và cách triển khai chúng trong Kotlin . Ngoài ra, chúng tôi sẽ khám phá các thư viện triển khai chức năng này cho bạn.

Gọi lại tùy chọn là gì?

Các lệnh gọi lại của Android cho phép phương thức của bạn tìm nạp kết quả từ một phương pháp khác một cách đồng bộ. Gọi lại hoạt động như sứ giả; chúng là trung tâm giao tiếp trong một chương trình và được chuyển vào các hàm dưới dạng đối số. Chúng giúp hoàn thành nhiệm vụ của một chức năng bằng cách cung cấp kết quả, hoặc tiêu cực hoặc tích cực. Một lệnh gọi lại tùy chọn nêu rõ điều gì sẽ xảy ra khi các kết quả khác nhau được tìm nạp từ một phương thức hoặc hàm khác.

Các lệnh gọi lại tùy chọn cũng cho phép các chức năng dựa vào lệnh gọi lại tiếp tục ngay cả khi lệnh gọi lại trả về lỗi, hỗ trợ bảo trì và độ tin cậy ở mức cao.

Các lệnh gọi lại tùy chọn rất quan trọng vì chúng đảm bảo rằng người dùng có thể thưởng thức ứng dụng của bạn mà không bị gián đoạn bằng cách ngăn ứng dụng bị đóng băng và chặn. Giao diện người dùng bị đóng băng có thể khiến nhiều người gỡ cài đặt ứng dụng của bạn.

Sự khác biệt giữa lệnh gọi lại tùy chọn và tiêu chuẩn là gì?

Là một nhà phát triển Android, tôi sử dụng các lệnh gọi lại hàng ngày, bắt đầu từ onCreate()phương pháp tạo ra một hoạt động khi một ứng dụng được khởi chạy. Đây là ví dụ điển hình về lệnh gọi lại mà bạn sẽ sử dụng hàng triệu lần trong hành trình phát triển Android của mình.

Khi ứng dụng của bạn gặp sự cố ở thời điểm bắt đầu, bạn có thể tìm thấy sự cố trong lần gọi lại này:

override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   setContentView(R.layout.activity_main)
}

Dưới đây là một ví dụ khác về lệnh gọi lại điển hình được gọi khi hoạt động bị tạm dừng:

override fun onPause() {
        super.onPause()
        print("onPause")
    }

Các lệnh gọi lại ở trên hoạt động rất tốt trong vòng đời hoạt động và vòng đời phân mảnh của Android . Nhưng, vấn đề nảy sinh khi phương thức được thực hiện trong cuộc onPause()gọi lại không hoạt động. Một lệnh gọi lại tùy chọn sẽ cho biết điều gì sẽ xảy ra nếu lỗi đó xảy ra.

 

Triển khai các lệnh gọi lại tùy chọn trong Kotlin từ đầu

Việc sử dụng các lệnh gọi lại tùy chọn trong chương trình của bạn không nên là tùy chọn. Các lệnh gọi lại tùy chọn giúp hoạt động của bạn diễn ra liên tục ngay cả khi các trường hợp ngoại lệ xảy ra và các tác vụ tạo ra kết quả tiêu cực.

Bây giờ, đây là một ví dụ về một lệnh gọi lại tùy chọn:

Result.of<T, Throwable>(doTask())
      .flatMap { normalizedData(it) }
      .map { createRequestFromData(it) }
      .flatMap { database.updateFromRequest(it) }

Thêm các trường hợp thất bại và thành công:

//if successful
result.success {
}

//if failed
result.failure {
}

Gọi lại tùy chọn ở trên có các điều kiện: chuyển đổi thất bại và thành công. Bạn phải nêu rõ điều gì sẽ xảy ra nếu kết quả từ một lớp khác là tiêu cực hoặc tích cực. Bằng cách này, bạn sẽ có thể đóng các quy trình và chức năng có thể làm hỏng ứng dụng khi gọi lại trả về kết quả âm.

Đây là một ví dụ khác về một lệnh gọi lại tùy chọn không sử dụng thư viện. Lệnh gọi lại tùy chọn được hiển thị bên dưới cung cấp ba trường hợp sẽ được kích hoạt khi kết quả được thông qua. Bạn có cơ hội để làm điều gì đó nếu hoạt ảnh lặp lại, kết thúc hoặc bắt đầu:

animation.setAnimationListener(object : Animation.AnimationListener {
   override fun onAnimationRepeat(animation: Animation?) {

   }

   override fun onAnimationEnd(animation: Animation?) {
       doSomething()
   }

   override fun onAnimationStart(animation: Animation?) {
          }
})

Một cấu trúc gọi lại tùy chọn chủ yếu bao gồm một khối mã tìm nạp kết quả, theo sau là trường hợp thất bại và thành công (hoặc bất kỳ trường hợp nào bạn muốn được thực thi khi nhận được một số kết quả nhất định). Tuy nhiên, bạn có thể thêm các trường hợp khác nếu bạn đang thực hiện chúng bắt đầu từ đầu mà không có sự can thiệp của thư viện.

Một thư viện (như Kết quả ) giúp bạn dễ dàng hơn bằng cách đưa ra hai trường hợp: thất bại và thành công. Tất cả những gì bạn phải làm là thêm mã sẽ được thêm vào khi trường hợp thành công hoặc thất bại xảy ra.

Các trường hợp thất bại và thành công là những gì làm cho các lệnh gọi lại tùy chọn khác với các lệnh gọi lại thông thường:

//if successful
result.success {

}
//if failed
result.failure {

}

Triển khai các lệnh gọi lại tùy chọn trong Kotlin bằng cách sử dụng Kết quả

Kết quả là một thư viện Kotlin cho phép bạn triển khai các lệnh gọi lại tùy chọn và giúp bạn xử lý lỗi nhanh chóng.

Để bắt đầu, hãy thêm các phần phụ thuộc sau vào gradle.buildtệp và đồng bộ hóa Gradle để tải xuống thư viện của bên thứ ba:

implementation("com.github.kittinunf.result:result-jvm:5.2.1")
implementation ("com.github.kittinunf.result:result:5.2.1")

Hãy xem kết quả hoạt động như thế nào trong trường hợp chúng ta muốn mở một tệp văn bản và đọc nó. Để nhận được kết quả của việc mở tác vụ tệp văn bản, chúng tôi sử dụng đối tượng Kotlin Result, đối tượng này tìm nạp giá trị thành công và thất bại của readText task:

val operation = { File("/path/to/file/foo.txt").readText() }
Result.of { operation() }  

Tiếp theo, chúng tôi tạo một normalizedData(foo)chức năng sắp xếp và đơn giản hóa dữ liệu được thu thập từ hoạt động. Chuẩn hóa dữ liệu bằng cách gọi normalize()hàm:

fun normalizedData(foo): Result<Boolean, NormalizedThrowable> {
    Result.of { foo.normalize() }
}

Tiếp theo, tạo một yêu cầu từ dữ liệu mà chúng tôi đã chuẩn hóa ở trên:

fun createRequestFromData(foo): Request {
    return createRequest(foo)
}

Sau khi yêu cầu dữ liệu, hãy tạo một hàm cơ sở dữ liệu như hình dưới đây để cập nhật các giá trị của đối tượng Kết quả. Nếu giao dịch cập nhật không thành công thì một ngoại lệ sẽ được đưa ra:

fun database.updateFromRequest(request): Result<Boolean, DBThrowable> {
    val transaction = request.transaction
    return Result.of { 
        db.openTransaction {
            val success = db.execute(transaction)
            if (!success) {
                throw DBThrowable("Error")
            }
            return success
        }
    }
}

Sau khi bạn đã tìm nạp thông tin bằng đối tượng Kết quả, đã đến lúc thêm các trường hợp thành công và thất bại. Bắt đầu bằng cách khai báo giá trị:

val (value, error) = result

Bây giờ, lấy giá trị kết quả:

val value: Int = result.get()

Bây giờ thêm các trường hợp thành công và thất bại:

result.success {
//Add code that does something when the task is successful here
}

result.failure {
//add code that warns the user that an error has occurred here.
}

Triển khai các lệnh gọi lại tùy chọn trong Kotlin bằng cách sử dụng callback-ktx

Thư viện callback-ktx bao bọc và chuyển đổi các API dựa trên callback thành tạm ngưng các chức năng mở rộng. Hiện tại, callback-ktx chỉ hỗ trợ các API sau:

  • Hoạt hình
  • Địa điểm
  • RecyclerView
  • cảm biến
  • Lượt xem
  • Tiện ích con (TextView)

Sử dụng mã sau để tải xuống phần phụ thuộc callback-ktx:

implementation("io.github.sagar-viradiya:callback-core-ktx:1.0.0")

Sau khi bạn đã tải xuống thư viện, Bạn có thể theo dõi các hoạt ảnh bằng cách gọi lifecycleScopeđối tượng để lấy phạm vi của vòng đời. Tiếp theo, gọi awaitStart()phương thức, phương thức này sẽ được kích hoạt khi hoạt ảnh.

Bây giờ, bạn có cơ hội để nêu và thêm mã cụ thể sẽ chỉ được thực thi khi hoạt ảnh bắt đầu:

viewLifecycleOwner.lifecycleScope.launch {
  animator.awaitStart()
  // insert code that does something when the animation starts here.
 }

Bạn có thể xem thêm các trường hợp sử dụng của thư viện callback-ktx tại đây . Nếu bạn vẫn có cơ sở mã Android sử dụng Java, bạn có thể sử dụng Vulture để triển khai các lệnh gọi lại một cách an toàn.

Sự kết luận

Trong bài viết này, chúng ta đã tìm hiểu về lợi ích của các lệnh gọi lại tùy chọn, sự khác biệt giữa lệnh gọi lại tùy chọn và thông thường cũng như cách triển khai lệnh gọi lại bằng cách sử dụng Result và callback-ktx.

Các cuộc gọi lại tùy chọn chắc chắn sẽ cung cấp cho bạn nhiều khả năng và sự lựa chọn hơn khi nói rõ điều gì sẽ xảy ra khi lỗi và kết quả thành công được trả về bởi cuộc gọi lại.

Nếu bạn có bất kỳ câu hỏi hoặc ý kiến ​​nào, đừng ngại để lại trong phần bình luận bên dưới.

Nguồn: https://blog.logrocket.com/implecting-optional-callbacks-kotlin-scratch/

#kotlin 

Juned Ghanchi

1621508255

Kotlin App Development Company in India, Hire Kotlin Developers

We are a prime Kotlin app developer in India. We build and provide the best personalized Android apps, migration services, ongoing maintenance, and management.

We have the most efficient Kotlin developers that build ultramodern, interactive, and secure mobile apps. The technologies we use to create the most advanced Kotlin apps are AR/VR, AI/ML, IoT, etc.

Hire Kotlin app developers in India. Meet us, and we will help you meet all of your technology requirements.

#kotlin app development company india #hire kotlin developers india #kotlin app development company #hire kotlin developers #kotlin development agency #kotlin app programmers

Hire Dedicated Kotlin Developer - WebClues Infotech

The most popular language used for Android app development is Kotlin and recently Kotlin also launched its Cross-Platform app development language Kotlin Multiplatform.

So are you looking to launch a mobile using Kotlin as your Programming Language?

Then you are at the right place as WebClues Infotech offers services to Hire a Dedicated Kotlin Developer who can develop an interactive and rich user-experienced mobile app. Also, WebClues has a flexible pricing model that the business can choose according to its most suitable structure.

So what are you waiting for? Hire a dedicated Kotlin developer from a reputed Web & Mobile app development agency that has successfully served more than 600+ clients.

Get in touch with us!!

Book Free Interview: https://bit.ly/3dDShFg

#hire dedicated kotlin developer #hire dedicated kotlin developer #hire kotlin developers #hire kotlin developer #hire dedicated kotlin app developer #hire kotlin app developers india

How to Develop an Android App with Kotlin?

Do you have an idea to develop an android app using Kotlin?

Are you looking for the best Kotlin app development company in the USA? We at AppClues Infotech offering versatile mobile app development services in the USA. We provide custom mobile app development solutions as per your specific business needs with the prevailing market trending technology & features.

Hire our top-notch Kotlin app designers & developers for your project at a cost-effective price.

Our Kotlin App Development Services:
• Custom Android App Development
• Kotlin AR/VR App Development
• Kotlin App UI/UX Design
• Kotlin App QA & Testing- code Optimization
• Kotlin App Migrations
• Kotlin App Maintenance and Upgrades

For more info:
Website: https://www.appcluesinfotech.com/
Email: info@appcluesinfotech.com
Call: +1-978-309-9910

#kotlin android app development company #best kotlin android app development usa #kotlin android app development #kotlin for android app development #kotlin mobile app development service #create android app with kotlin

Top-notch Kotlin App Development Company in USA

Are you looking for the best Kotlin Android App Development Company in USA? We at AppClues Infotech help to create a successful kotlin Android App with creative technology & features at competitive price.

For more info:
Website: https://www.appcluesinfotech.com/
Email: info@appcluesinfotech.com
Call: +1-978-309-9910

#kotlin android app development company #best kotlin android app development usa #kotlin android app development #kotlin for android app development #kotlin mobile app development service #create android app with kotlin