Flutter - Escrevendo código específico para Android
Flutter fornece uma estrutura geral para acessar recursos específicos da plataforma. Isso permite que o desenvolvedor estenda a funcionalidade da estrutura Flutter usando código específico da plataforma. Funcionalidades específicas da plataforma, como câmera, nível de bateria, navegador, etc., podem ser acessadas facilmente por meio da estrutura.
A ideia geral de acessar o código específico da plataforma é por meio de um protocolo de mensagens simples. O código de flutuação, o cliente e o código da plataforma e o host se ligam a um canal de mensagem comum. O cliente envia uma mensagem ao Host através do Canal de Mensagens. O Host escuta no Canal de Mensagem, recebe a mensagem e faz a funcionalidade necessária e, por fim, retorna o resultado ao Cliente através do Canal de Mensagem.
A arquitetura de código específica da plataforma é mostrada no diagrama de blocos fornecido abaixo -
O protocolo de mensagens usa um codec de mensagem padrão (classe StandardMessageCodec) que oferece suporte à serialização binária de valores semelhantes a JSON, como números, strings, booleano, etc. A serialização e desserialização funcionam de forma transparente entre o cliente e o host.
Vamos escrever um aplicativo simples para abrir um navegador usando Android SDK e entender como
Crie um novo aplicativo Flutter no Android Studio, flutter_browser_app
Substitua o código main.dart pelo código abaixo -
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatelessWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(this.title),
),
body: Center(
child: RaisedButton(
child: Text('Open Browser'),
onPressed: null,
),
),
);
}
}
Aqui, criamos um novo botão para abrir o navegador e definir seu método onPressed como nulo.
Agora, importe os seguintes pacotes -
import 'dart:async';
import 'package:flutter/services.dart';
Aqui, services.dart inclui a funcionalidade para invocar o código específico da plataforma.
Crie um novo canal de mensagem no widget MyHomePage.
static const platform = const
MethodChannel('flutterapp.tutorialspoint.com/browser');
Escreva um método, _openBrowser para invocar o método específico da plataforma, o método openBrowser através do canal de mensagem.
Future<void> _openBrowser() async {
try {
final int result = await platform.invokeMethod(
'openBrowser', <String, String>{
'url': "https://flutter.dev"
}
);
}
on PlatformException catch (e) {
// Unable to open the browser
print(e);
}
}
Aqui, usamos platform.invokeMethod para invocar openBrowser (explicado nas próximas etapas). openBrowser tem um argumento, url, para abrir um url específico.
Altere o valor da propriedade onPressed do RaisedButton de null para _openBrowser.
onPressed: _openBrowser,
Abra MainActivity.java (dentro da pasta android) e importe a biblioteca necessária -
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugins.GeneratedPluginRegistrant;
Escreva um método, openBrowser para abrir um navegador
private void openBrowser(MethodCall call, Result result, String url) {
Activity activity = this;
if (activity == null) {
result.error("ACTIVITY_NOT_AVAILABLE",
"Browser cannot be opened without foreground
activity", null);
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
activity.startActivity(intent);
result.success((Object) true);
}
Agora, defina o nome do canal na classe MainActivity -
private static final String CHANNEL = "flutterapp.tutorialspoint.com/browser";
Escreva o código específico do Android para definir o tratamento de mensagens no método onCreate -
new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
new MethodCallHandler() {
@Override
public void onMethodCall(MethodCall call, Result result) {
String url = call.argument("url");
if (call.method.equals("openBrowser")) {
openBrowser(call, result, url);
} else {
result.notImplemented();
}
}
});
Aqui, criamos um canal de mensagem usando a classe MethodChannel e usamos a classe MethodCallHandler para lidar com a mensagem. onMethodCall é o método real responsável por chamar o código específico da plataforma correto verificando a mensagem. O método onMethodCall extrai o url da mensagem e, em seguida, invoca o openBrowser apenas quando a chamada do método é openBrowser. Caso contrário, ele retorna o método notImplemented.
O código-fonte completo do aplicativo é o seguinte -
main.dart
MainActivity.java
package com.tutorialspoint.flutterapp.flutter_browser_app;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "flutterapp.tutorialspoint.com/browser";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
new MethodCallHandler() {
@Override
public void onMethodCall(MethodCall call, Result result) {
String url = call.argument("url");
if (call.method.equals("openBrowser")) {
openBrowser(call, result, url);
} else {
result.notImplemented();
}
}
}
);
}
private void openBrowser(MethodCall call, Result result, String url) {
Activity activity = this; if (activity == null) {
result.error(
"ACTIVITY_NOT_AVAILABLE", "Browser cannot be opened without foreground activity", null
);
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
activity.startActivity(intent);
result.success((Object) true);
}
}
main.dart
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(
title: 'Flutter Demo Home Page'
),
);
}
}
class MyHomePage extends StatelessWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
static const platform = const MethodChannel('flutterapp.tutorialspoint.com/browser');
Future<void> _openBrowser() async {
try {
final int result = await platform.invokeMethod('openBrowser', <String, String>{
'url': "https://flutter.dev"
});
}
on PlatformException catch (e) {
// Unable to open the browser print(e);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(this.title),
),
body: Center(
child: RaisedButton(
child: Text('Open Browser'),
onPressed: _openBrowser,
),
),
);
}
}
Execute o aplicativo e clique no botão Abrir navegador e você verá que o navegador foi iniciado. O aplicativo do navegador - página inicial é mostrado na imagem aqui -