dt_car_auto, Flutter uygulamanizdaki verileri Android Auto ve Apple CarPlay arayuzlerine tasiyan bir eklentidir.
Bu paketle:
- Sarj istasyonlarini arac ekraninda listeleyebilir,
- Yetkili servis noktalarini gosterebilir,
- Istasyon detay ve soket bilgilerini acabilir,
- Yol yardim / acil cagri aksiyonlari sunabilir,
- Konum izni durumuna gore uygun ekran akislarini yonetebilirsiniz.
Paket, Flutter ile native taraf arasinda dt_carplay_channel method channel'i uzerinden haberlesir ve veriyi uygulamanizin sagladigi callback'lerden alir.
- Android Auto POI (Point of Interest) tabanli ekran akisi
- Apple CarPlay list/POI/sunum akisi
- Marka bilgisi ve yol yardim destegi
- Konum
- Istasyon detay/soket bilgisi
- Flutter tarafinda tek bir servis ile entegrasyon:
DtCarPlayService.init(...)
| Ana Ekran | Istasyonlar |
|---|---|
![]() |
![]() |
| Istasyon Detay | Soketler |
|---|---|
![]() |
![]() |
| Servisler | Servis Detay |
|---|---|
![]() |
![]() |
| Yol Yardim |
|---|
![]() |
| Istasyonlar | Istasyon Detay |
|---|---|
![]() |
![]() |
| Soketler | Servisler |
|---|---|
![]() |
![]() |
| Servis Detay | Yol Yardim |
|---|---|
![]() |
![]() |
dependencies:
dt_car_auto: ^0.0.1Ardindan:
flutter pub getAsagidaki akis example/lib/main.dart ile birebir ayni yaklasimi kullanir.
import 'package:dt_car_auto/dt_brand_enum.dart';
import 'package:dt_car_auto/dt_car_auto.dart';
import 'package:flutter/material.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await DtCarPlayService.init(
brand: Brands.audi,
getChargeStations: () async {
// Kendi API sonucunuz: { "items": [ ... ] }
return {"items": []};
},
getAuthorizedServices: () async {
// Kendi API sonucunuz: { "items": [ ... ] }
return {"items": []};
},
getDChargeStationById: (String id) async {
// Kendi API sonucunuz: { "result": { ... } }
return {"result": {}};
},
// Simulator gelistirme surecinde gecici olarak true yapilabilir.
ignoreLocationError: true,
);
runApp(const MyApp());
}Native taraf bu methodlari Flutter'dan bekler:
getChargeStationsgetAuthorizedServicesgetDChargeStationByIdcheckLocationgetBrand
{
"items": [
{
"id": "unique-station-id",
"name": "Station Name",
"address": "Address",
"latitude": 41.0,
"longitude": 29.0,
"isAcSupported": true,
"isDcSupported": true,
"distance": 12.3,
"distanceUnit": "km",
"totalAcCount": 2,
"totalDcCount": 1,
"isFavourite": false
}
]
}{ "items": [...] } formatinda servis listesi beklenir. example projesindeki DtCarAutoExampleDataProvider.getAuthorizedServices() methodu referans alinmalidir.
{ "result": { ... } } formatinda detay beklenir. Ozellikle result.units[].connectors[] alani soket ekrani icin kullanilir.
Asagidaki adimlar example/android/app/src/main/AndroidManifest.xml ve example/android/app/src/main/res/xml/automotive_app_desc.xml dosyalarini referans alir.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="androidx.car.app.ACCESS_SURFACE" />
<uses-permission android:name="androidx.car.app.MAP_TEMPLATES" /><meta-data
android:name="com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc" />
<meta-data
android:name="androidx.car.app.metadata"
android:value="true" />
<meta-data
android:name="androidx.car.app.minCarApiLevel"
android:value="1"/>
<service
android:name="com.example.dt_car_auto.AndroidAutoService"
android:exported="true"
android:icon="@mipmap/ic_launcher">
<intent-filter>
<action android:name="androidx.car.app.CarAppService" />
<category android:name="androidx.car.app.category.POI"/>
</intent-filter>
</service><?xml version="1.0" encoding="utf-8"?>
<automotiveApp>
<uses name="template" />
</automotiveApp>Not: Android Auto tarafinda konum tabanli gorunumler icin runtime permission akisinizin uygulama acilisinda dogru calistigindan emin olun.
Asagidaki blok, example/ios/Runner/Info.plist dosyasindaki ilgili kisimdir:
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Size en yakın istasyonları görebilmeniz için konum izni vermeniz gerekmektedir</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Size en yakın istasyonları görebilmeniz için konum izni vermeniz gerekmektedir</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Size en yakın istasyonları görebilmeniz için konum izni vermeniz gerekmektedir</string>
<key>UISupportsCarPlay</key>
<true/>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<true/>
<key>UISceneConfigurations</key>
<dict>
<key>CPTemplateApplicationSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>CarPlay Configuration</string>
<key>UISceneDelegateClassName</key>
<string>DtCarAutoSceneDelegate</string>
</dict>
</array>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
</dict>
</array>
</dict>
</dict>Runner.entitlements icine su anahtari ekleyin:
<dict>
<key>com.apple.developer.carplay-charging</key>
<true/>
</dict>AppDelegate.swift:
import Flutter
import UIKit
import dt_car_auto
@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FlutterHelper.shared.pluginRegistrant = { engine in
GeneratedPluginRegistrant.register(with: engine)
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}SceneDelegate.swift:
import Flutter
import dt_car_auto
import UIKit
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = scene as? UIWindowScene else { return }
FlutterHelper.shared.pluginRegistrant = { engine in
GeneratedPluginRegistrant.register(with: engine)
}
let window = UIWindow(windowScene: windowScene)
let controller = FlutterHelper.shared.makeFlutterViewController()
window.rootViewController = controller
self.window = window
window.makeKeyAndVisible()
}
}Bu adim, headless/shared FlutterEngine kullaniminda pluginlerin (ornegin geolocator) dogru register edilmesi icin kritiktir.
Paket icinde hazir gelen markalar:
Brands.audiBrands.porscheBrands.seatBrands.skodaBrands.cupraBrands.volkswagen
Marka bilgisi native tarafta yol yardim ekrani gibi alanlarda kullanilir (brandId, brandName, phoneRoadHelp).
cd example
flutter pub get
flutter runCarPlay/Android Auto akisini test etmek icin:
- iOS tarafinda CarPlay simulator veya destekli cihaz/provisioning
- Android tarafinda Android Auto Desktop Head Unit (DHU) veya uyumlu cihaz
DtCarPlayService.init(...)uygulama baslangicinda cagrilmis olmali.- Donen JSON formatlari yukaridaki kontratla birebir uyumlu olmali.
- iOS'ta
Alwayskonum izninin verildigini kontrol edin. - Gelistirme/simulator ortaminda gecici olarak
ignoreLocationError: truekullanabilirsiniz.
FlutterHelper.shared.pluginRegistrant = { GeneratedPluginRegistrant.register(with: $0) }enjeksiyonunun hem uygulama acilisinda hem scene akisinda yapildigini dogrulayin.












