Flutter - Android'e Özel Kod Yazma

Flutter, platforma özgü özelliğe erişmek için genel bir çerçeve sağlar. Bu, geliştiricinin platforma özel kod kullanarak Flutter çerçevesinin işlevselliğini genişletmesini sağlar . Kamera, pil seviyesi, tarayıcı vb. Gibi platforma özgü işlevlere çerçeve aracılığıyla kolayca erişilebilir.

Platforma özel koda erişmenin genel fikri basit mesajlaşma protokolüdür. Flutter kodu, İstemci ve platform kodu ve Ana Bilgisayar, ortak bir Mesaj Kanalına bağlanır. Müşteri, Mesaj Kanalı üzerinden Toplantı Sahibine mesaj gönderir. Host, Mesaj Kanalını dinler, mesajı alır ve gerekli işlevselliği yapar ve son olarak, sonucu Mesaj Kanalı üzerinden Müşteriye geri gönderir.

Platforma özgü kod mimarisi, aşağıda verilen blok şemada gösterilmiştir -

Mesajlaşma protokolü, sayılar, dizeler, boole vb. Gibi JSON benzeri değerlerin ikili serileştirmesini destekleyen standart bir mesaj codec bileşeni (StandardMessageCodec sınıfı) kullanır. Serileştirme ve serileştirmeden çıkarma, istemci ve ana bilgisayar arasında şeffaf bir şekilde çalışır.

Android SDK kullanarak bir tarayıcı açmak için basit bir uygulama yazalım ve nasıl olduğunu anlayalım

  • Android stüdyosunda yeni bir Flutter uygulaması oluşturun, flutter_browser_app

  • Main.dart kodunu aşağıdaki kodla değiştirin -

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, 
            ), 
         ), 
      ); 
   }
}
  • Burada, tarayıcıyı açmak ve onPressed yöntemini null olarak ayarlamak için yeni bir düğme oluşturduk.

  • Şimdi, aşağıdaki paketleri içe aktarın -

import 'dart:async'; 
import 'package:flutter/services.dart';
  • Burada services.dart, platforma özel kodu çağırma işlevini içerir.

  • MyHomePage widget'ında yeni bir mesaj kanalı oluşturun.

static const platform = const 
MethodChannel('flutterapp.tutorialspoint.com/browser');
  • İleti kanalı aracılığıyla platforma özel yöntemi, openBrowser yöntemini çağırmak için bir yöntem, _openBrowser yazın.

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); 
   }
}

Burada openBrowser'ı çağırmak için platform.invokeMethod'u kullandık (sonraki adımlarda açıklanmıştır). openBrowser'ın belirli bir url'yi açmak için bir url'si var.

  • RaisedButton öğesinin onPressed özelliğinin değerini null iken _openBrowser olarak değiştirin.

onPressed: _openBrowser,
  • MainActivity.java'yı (android klasörünün içinde) açın ve gerekli kitaplığı içe aktarın -

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;
  • Bir yöntem yazın, tarayıcı açmak için tarayıcı açın

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); 
}
  • Şimdi, MainActivity sınıfında kanal adını ayarlayın -

private static final String CHANNEL = "flutterapp.tutorialspoint.com/browser";
  • OnCreate yönteminde mesaj işlemeyi ayarlamak için android'e özel kod yazın -

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(); 
      } 
   } 
});

Burada MethodChannel sınıfını kullanarak bir mesaj kanalı oluşturduk ve mesajı işlemek için MethodCallHandler sınıfını kullandık. onMethodCall, mesajı kontrol ederek doğru platforma özel kodu çağırmaktan sorumlu gerçek yöntemdir. onMethodCall yöntemi, url'yi mesajdan çıkarır ve ardından openBrowser'ı yalnızca yöntem çağrısı openBrowser olduğunda çağırır. Aksi takdirde notImplemented yöntemini döndürür.

Uygulamanın tam kaynak kodu aşağıdaki gibidir -

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, 
            ), 
         ),
      );
   }
}

Uygulamayı çalıştırın ve Tarayıcıyı Aç düğmesine tıklayın ve tarayıcının başlatıldığını görebilirsiniz. Tarayıcı uygulaması - Ana sayfa, buradaki ekran görüntüsünde gösterildiği gibidir -