NativeScript - APIs nativas usando JavaScript

Esta seção explica sobre a visão geral de acessar APIs nativas usando JavaScript.

Marshalling

O NativeScript Runtime fornece conversão de tipo implícita para plataformas Android e iOS. Esse conceito é conhecido como marshalling. Por exemplo, a paltform NativeScript-iOS pode converter implicitamente os tipos de dados JavaScript e Objective-C de maneira semelhante, Java / Kotlin pode ser facilmente mapeado para tipos e valores de projeto JavaScript. Vamos entender como realizar o marshalling em cada tipo um por um brevemente.

Valores Numéricos

Podemos converter facilmente os tipos de dados numéricos do iOS e do Android em números de JavaScript. A conversão numérica simples para iOS em JavaScript é definida abaixo -

console.log(`max(7,9) = ${max(7,9)}`);

Aqui,

A função nativa max () é convertida em número JavaScript.

Ambiente Android

Java oferece suporte a diferentes tipos numéricos como byte, short, int, float, double e long. JavaScript tem apenas tipo de número.

Considere uma classe Java simples mostrada abaixo -

class Demo extends java.lang.Object {
   public int maxMethod(int a,int b) {
      if(a>b) {
         return a;
      } else {
         return b;
      }
   }
}

Aqui,

O código acima contém dois argumentos inteiros. Podemos chamar o objeto de código acima usando JavaScript, conforme mostrado abaixo -

//Create an instance for Demo class 
var obj = new Demo(); 

//implicit integer conversion for calling the above method 
obj.maxMethod(7,9);

Cordas

As strings do Android são definidas em java.lang.string e as strings do iOS são definidas no NSSring. Vamos ver como realizar o marshalling em ambas as plataformas.

Android

Strings são imutáveis, mas os buffers de String suportam strings mutáveis.

O código abaixo é um exemplo de mapeamento simples -

//Create android label widget 
var label = new android.widget.Label(); 

//Create JavaScript string 
var str = "Label1";  

//Convert JavaScript string into java label.setText(str); 
// text is converted to java.lang.String

A classe booleana é definida em java.lang.Boolean. Esta classe envolve um valor booleano em um objeto. Podemos facilmente converter booleano em String e vice-versa. Um exemplo simples é definido conforme abaixo -

//create java string 
let data = new java.lang.String('NativeScript'); 

//map java String to JavaScript string, 
let result = data.startsWith('N'); 

//return result 
console.log(result);// true

ambiente iOS

A classe NSString é imutável, mas sua subclasse NSMutableString é imutável. Esta classe contém uma coleção de métodos para trabalhar com strings. É declarado como abaixo -

class NSString : NSObject

Considere uma declaração object-c simples conforme mostrado abaixo -

NSString *str = @"nativescript"; 
//convert the string to uppercase
NSString *str1; 
str1 = [str uppercaseString]; 
NSLog(@"Uppercase String : %@\n", str1 );

NSStrings podem ser facilmente mapeados para strings JavaScript.

Array

Esta seção explica como realizar o marshalling em matrizes. Vamos primeiro dar um exemplo de ambiente iOS.

Declaração de Array

class NSArray : NSObject

Aqui,

NSArray é usado para gerenciar uma coleção ordenada de objetos chamados arrays. É usado para criar array estático. Sua subclasseNSMutableArray é usado para criar matrizes dinâmicas.

Considere que os objetos NSArray podem ser criados usando literais de matriz, conforme mostrado abaixo -

let array: NSArray = ["React","Vue","TypeScript"]

Agora, podemos mapear essa matriz em JavaScript, conforme mostrado abaixo -

//create native array 
let nsArr = NSArray.arrayWithArray("React","Vue","TypeScript"]); 

//create simple javascript array 
let jsArr = ["Hello,World","NativeScript"]; 

//Now compare the two arrays, 
let compare = nsArr.isEqual(jsArr); 
console.log(comapre);

Isso retornará a saída como falsa.

Declaração de array Android

Arrays Java são definidos em java.util.Arrays. Esta classe contém vários métodos para manipular matrizes. Um exemplo é mostrado abaixo -

//javascript array 
let data = [12,45,23,56,34,78,50]; 

//create java array 
let result = ns.example.Math.maxElement(data);
console.log(result);

Classes e Objetos

Classes e objetos são conceitos básicos da Programação Orientada a Objetos. Classe é um protótipo definido pelo usuário. O objeto é uma instância de classe. Classe representa o conjunto de propriedades ou métodos comuns a todos os objetos de um tipo. Vamos entender as classes e objetos nativos para ambos os ambientes de desenvolvimento móvel.

Ambiente Android

As classes Java e Kotlin têm identificadores exclusivos indicados pelo nome completo do pacote.

Por exemplo,

android.view.View- É uma classe de interface de usuário básica para layout de tela e interação com o usuário. Podemos acessar essa classe em JavaScript conforme mostrado abaixo -

const View = android.view.View;

Primeiro, importamos a classe usando a instrução abaixo -

import android.view.View;

Em seguida, crie uma classe conforme fornecido abaixo -

public class MyClass {
   public static void staticMethod(context) {
      //create view instance
      android.view.View myview = new android.view.View(context);
   }
}

Na mesma classe acima, podemos acessar a função JavaScript usando o código abaixo -

const myview = new android.view.View(context);

Da mesma forma, podemos acessar interfaces, constantes e enumerações nos pacotes java.lang.

Ambiente iOS

As classes Objective-C são definidas em duas seções @interface e @implementation. A definição da classe começa com a palavra-chave@interface seguido pelo interface(class)nome. Em Objective-C, todas as classes são derivadas da classe base chamada NSObject.

É a superclasse de todas as classes Objective-C. A classe Simple Circle é definida conforme mostrado abaixo -

@interface Circle:NSObject {
   //Instance variable
   int radius;
}
@end

Considere uma classe com um método conforme mostrado abaixo -

@interface MyClass : NSObject 
+ (void)baseStaticMethod; 
@end

Esta classe pode ser convertida para javascript usando o código abaixo -

function MyClass() { /* native call */ }; 
Object.setPrototypeOf(MyClass, NSObject); 
BaseClass.baseStaticMethod = function () { /* native call */ };

JavaScript instanceofoperador é usado para verificar se um objeto herda de uma determinada classe. Isso pode ser definido como -

var obj = MyClass.alloc().init(); // object creation 
console.log(obj instanceof NSObject); //return true

Aqui,

Instâncias Objective-C são criadas usando aloc, init ou novos métodos. No exemplo acima, podemos criar facilmente a inicialização do objeto usando o novo método abaixo -

var obj = MyClass.new();

Da mesma forma, você pode acessar métodos e propriedades estáticos.