โ† ํ™ˆ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

๋น ๋ฅธ ์‹œ์ž‘

5๋ถ„ ์•ˆ์— Flutter-Web Bridge ์‹œ์ž‘ํ•˜๊ธฐ

1๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

ํ”„๋กœ์ ํŠธ์— ํŒŒ์ผ ๋ณต์‚ฌ

# JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
cp lib/flutter-bridge.js your-project/src/utils/

# TypeScript ์‚ฌ์šฉ ์‹œ
cp lib/flutter-bridge.d.ts your-project/src/utils/

2์›น์•ฑ์—์„œ ์‚ฌ์šฉ

Vanilla JavaScript

<script src="./flutter-bridge.js"></script>
<script>
    const bridge = new FlutterBridge({ debug: true });
    
    async function getLocation() {
        const location = await bridge.getLocation();
        console.log('์œ„์น˜:', location);
    }
</script>

Vue 3

<script setup>
import FlutterBridge from './utils/flutter-bridge.js';

const bridge = new FlutterBridge({ debug: true });

async function getLocation() {
  const location = await bridge.getLocation();
  console.log('์œ„์น˜:', location);
}
</script>

React

import FlutterBridge from './utils/flutter-bridge.js';

const bridge = new FlutterBridge({ debug: true });

function App() {
  const getLocation = async () => {
    const loc = await bridge.getLocation();
    console.log(loc);
  };
  
  return <button onClick={getLocation}>์œ„์น˜</button>;
}

3Flutter ์•ฑ ์„ค์ •

pubspec.yaml ์˜์กด์„ฑ

dependencies:
  flutter:
    sdk: flutter
  webview_flutter: ^4.4.2
  flutter_local_notifications: ^16.3.0
  geolocator: ^10.1.0
  permission_handler: ^11.1.0
  image_picker: ^1.0.5
  home_widget: ^0.4.1
  device_info_plus: ^9.1.1
  shared_preferences: ^2.2.2

ํŒจํ‚ค์ง€ ์„ค์น˜

cd flutter_project
flutter pub get

AndroidManifest.xml ๊ถŒํ•œ

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

4์ฃผ์š” ๊ธฐ๋Šฅ ์‚ฌ์šฉ

๐Ÿ“ ์œ„์น˜ ๊ฐ€์ ธ์˜ค๊ธฐ

const location = await bridge.getLocation();
// { lat: 37.123, lng: 127.456, accuracy: 10 }

๐Ÿ“ท ์‚ฌ์ง„ ์ดฌ์˜

const photo = await bridge.takePhoto();
// Base64 ์ธ์ฝ”๋”ฉ๋œ ์ด๋ฏธ์ง€

๐Ÿ“ข ์•Œ๋ฆผ ํ‘œ์‹œ

await bridge.showNotification('์ œ๋ชฉ', '๋‚ด์šฉ');

๐Ÿ’พ ๋ฐ์ดํ„ฐ ์ €์žฅ

await bridge.saveData('user', { name: 'John' });
const user = await bridge.loadData('user');

๐Ÿ“ฑ ๋””๋ฐ”์ด์Šค ์ •๋ณด

const info = await bridge.getDeviceInfo();
// { platform: 'android', model: 'SM-G991N', version: '13' }

๐Ÿ› ๋ฌธ์ œ ํ•ด๊ฒฐ

๋ธŒ๋ฆฟ์ง€ ์—ฐ๊ฒฐ ํ™•์ธ

if (bridge.isAvailable()) {
    console.log('Flutter ๋ธŒ๋ฆฟ์ง€ ์—ฐ๊ฒฐ๋จ');
} else {
    console.log('๋ธŒ๋ผ์šฐ์ € ๋ชจ๋“œ');
}

ํƒ€์ž„์•„์›ƒ ์„ค์ •

const bridge = new FlutterBridge({ 
    debug: true,
    timeout: 20000 // 20์ดˆ
});

๐Ÿ“š ๋‹ค์Œ ๋‹จ๊ณ„

๐ŸŽ‰ ์™„๋ฃŒ!
์ด์ œ ์›น ๊ฐœ๋ฐœ ์ง€์‹๋งŒ์œผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!