ããã«ã¡ã¯ãæè¡æšé²èª²ã®t_okkanã§ãã æè¿æ¥åã§Flutterã䜿çšããããšã«ãªããå°ããã€ã§ããFlutterãåŠç¿ããŠããŸãã ããã§ä»åã¯Flutterã§ã宿©ïŒ iPhone ïŒã®ã«ã¡ã©ãå©çšããŠã¿ãŸãããã«ã¡ã©ã䜿çšããããã® ãã©ã°ã€ã³ ã®è¿œå ãããã«ã¡ã©ã§ã®ç»åã®æ®åœ±ãšä¿åãä¿åããç»åã®è¡šç€ºãŸã§ãè¡ããŸãã ç°å¢ Flutterã«ã€ã㊠ã¢ããªäœæããã©ã°ã€ã³ã®ã€ã³ã¹ããŒã« å®è£
䜿çšã§ããã«ã¡ã©ã®ååŸ ã«ã¡ã©å¶åŸ¡ã®åæå ã«ã¡ã©ã®ãã¬ãã¥ãŒã®å®è£
ç»åã®æ®åœ±ãšä¿åã®å®è£
æ®åœ±ããç»åã衚瀺ãã å
šäœã®ãœãŒã¹ã³ãŒã ãŸãšã åè ç°å¢ 䜿çšããç°å¢ã¯ä»¥äžã«ãªããŸãã Flutter 1.22.0 Visual Studio Code macOS Catalina 10.15.6 iOS 13.7 Flutterã®ç°å¢æ§ç¯ã¯ãå
¬åŒHPã«è©³ããèšèŒãããŠããŸãã https://flutter.dev/docs/get-started/install äžèšãåèã«ã macOS + VSCode ã®ç°å¢ãæ§ç¯ããŠãã ããã Flutterã«ã€ã㊠Flutterã«ã€ããŠå°ãã ã玹ä»ããŸãã Google ãæäŸããŠããUIããŒã«ãããã§ã䞻㫠iOS ã» Android ã¢ããªã® ã¯ãã¹ãã©ãããã©ãŒã ããŒã«ãšããŠå©çšãããŠããŸããæè¿ã¯Web察å¿ãé²ã¿ãã¢ãã€ã«ã»ãŠã§ãã»ãã¹ã¯ããããšçã® ã¯ãã¹ãã©ãããã©ãŒã ãç®æããŠããæ³šç®ã®ããŒã«ã§ãã Flutter㯠Dart ãšããèšèªã§å®è£
ãããŠããŸããã«ã¡ã©ãªã©ã®ã ãã€ã¹ åºæã®æ©èœã«ã¢ã¯ã»ã¹ããã«ã¯ãåãã©ãããã©ãŒã ã®ãã€ãã£ãã®å®è£
ãå¿
èŠãšããŸãã Flutterã§ã¯ãã®ãããªåãã€ãã£ãã®å®è£
ãå¿
èŠãšãã ãã©ã°ã€ã³ ãPluginããã±ãŒãžãšããŠæäŸããŠããŸãã ãã©ã°ã€ã³ 㯠pub.dev ã§å
¬éãããŠããŸãã ã¢ããªäœæã ãã©ã°ã€ã³ ã®ã€ã³ã¹ããŒã« Flutterã®ãããžã§ã¯ããäœæããŠã camera ã® ãã©ã°ã€ã³ ãšãã«ã¡ã©ãšãã€ã¯ãžã®ã¢ã¯ã»ã¹èš±å¯ã®ç¢ºèªãŸã§ãèšå®ããŸãããŸããç»åãä¿åããããã«åãã©ãããã©ãŒã ã®ãã¹ãååŸããå¿
èŠãããã®ã§ã path_provider ãš path ãã©ã°ã€ã³ ãã€ã³ã¹ããŒã«ããŸãã ãŸãã¯ã³ãã³ãã§Flutterã®ãããžã§ã¯ããäœæããŸãã $ flutter create camera_app ãã®åŸ ãã©ã°ã€ã³ ã远å ããŸããFlutterã§ã¯ pubspec.yaml ãã¡ã€ã«ã«äœ¿çšãã ãã©ã°ã€ã³ ãèšèŒããŸããä»åã¯ä»¥äžã®ããã«ããŸãã dependencies : camera : ^0.5.8+5 path_provider : ^1.6.14 path : ^1.7.0 flutter : sdk : flutter 次ã«ãã«ã¡ã©ã䜿çšã®èš±å¯ãä¿ãã¡ãã»ãŒãžã衚瀺ããããã®èšå®ãè¡ããŸãã ios/Runner/Info.plist ãã¡ã€ã«ã«ä»¥äžã远å ããŸãã <key> NSCameraUsageDescription </key> <string> Can I use the camera please? </string> <key> NSMicrophoneUsageDescription </key> <string> Can I use the mic please? </string> ãŸã Android ã§äœ¿çšããå Žåã¯ã SDK ã®æäœããŒãžã§ã³ã 21 ãæå®ããå¿
èŠããããŸãã android/app/build.gradle ã«ä»¥äžã远å ããŸãã defaultConfig { // TODO : Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.camera_app" minSdkVersion 21 targetSdkVersion 29 versionCode flutterVersionCode. toInteger () versionName flutterVersionName } æºåã¯ä»¥äžã§ããã§ã¯å®éã«ã³ãŒããæžããŠãããŸãã å®è£
ãŸã㯠camera ãã©ã°ã€ã³ ã§äœ¿çšããã¯ã©ã¹ã玹ä»ããŸãã CameraController 端æ«ã®ã«ã¡ã©ãå¶åŸ¡ããã¯ã©ã¹ããã®ã¯ã©ã¹ã«å¶åŸ¡ãããã«ã¡ã©ãæž¡ãããšã§ããã¬ãã¥ãŒã®è¡šç€ºããåçã»åç»ã®æ®åœ±ãè¡ãããšãã§ããŸãã CameraDescription ã«ã¡ã©ã®æ
å ±ïŒããã³ãã»ããã¯ïŒã管çããŠããã¯ã©ã¹ã CameraController ã¯ã©ã¹ã«ãã®ã¯ã©ã¹ãæž¡ãããšã§ãã«ã¡ã©ã®å¶åŸ¡ãè¡ãããšãã§ããŸãã CameraPreview ã«ã¡ã©ãååŸããŠããæ åïŒéæ¢ç»ã®é£ç¶ïŒãç»é¢ã«è¡šç€ºãã ãŠã£ãžã§ãã ã ä»åã¯ã«ã¡ã©ã§ç»åãæ®åœ±ã»ä¿åã衚瀺ãããŸã§ã®æé ãé çªã«èª¬æããŸããæåŸã«å¿
èŠãªã³ãŒããå
šãŠèŒããŸãã®ã§ãå
ã«èŠããæ¹ã¯ãã¡ãããã©ããã ã§ã¯ã以äžã®æé ã§å®è£
ããŠãããŸãã 䜿çšã§ããã«ã¡ã©ã®ååŸ ã«ã¡ã©å¶åŸ¡ã®åæå ã«ã¡ã©ã®ãã¬ãã¥ãŒã®å®è£
ç»åã®æ®åœ±ãšä¿åã®å®è£
æ®åœ±ããç»åã衚瀺ãã 䜿çšã§ããã«ã¡ã©ã®ååŸ ãŸãã¯ç«¯æ«ãã䜿çšã§ããã«ã¡ã©ãååŸããŸãã ä»åã¯ååŸããã«ã¡ã©ãããèé¢ã®ã«ã¡ã©ã䜿çšããŸãã // runAppãå®è¡ãããåã«ãcameraãã©ã°ã€ã³ãåæå WidgetsFlutterBinding . ensureInitialized (); // ããã€ã¹ã§äœ¿çšå¯èœãªã«ã¡ã©ã®äžèЧãååŸãã final cameras = await availableCameras (); // å©çšå¯èœãªã«ã¡ã©ã®äžèЧãããæå®ã®ã«ã¡ã©ãååŸãã final firstCamera = cameras.first; ãã©ã°ã€ã³ ã® availableCameras ã¡ãœããã§ã端æ«ã§äœ¿çšå¯èœãªã«ã¡ã©ãé
åã§ååŸã§ããŸãã ããã§ååŸããã«ã¡ã©ãã衚瀺ãã ãŠã£ãžã§ãã ã«æž¡ãããšã§ãã«ã¡ã©ã䜿çšã§ããŸãã ã§ã¯æ¬¡ã«ãååŸããã«ã¡ã©ãå¶åŸ¡ããããã®æºåãããŸãã ã«ã¡ã©å¶åŸ¡ã®åæå ååŸããã«ã¡ã©ã®å¶åŸ¡ãè¡ãããã«ã CameraController ã¯ã©ã¹ãåæåããå¿
èŠããããŸãã ããã§ã¯ã«ã¡ã©çšã®ç»é¢ CameraHome ã®æ§ç¯ããã CameraController ã¯ã©ã¹ã®åæåãŸã§ãå®è£
ããŸãã // â class CameraHome extends StatefulWidget { final CameraDescription camera; const CameraHome ({ Key key, @required this .camera}) : super (key : key); @override State < StatefulWidget > createState () => CameraHomeState (); } class CameraHomeState extends State < CameraHome > { // ããã€ã¹ã®ã«ã¡ã©ãå¶åŸ¡ããã³ã³ãããŒã© CameraController _cameraController; // ã³ã³ãããŒã©ãŒã«èšå®ãããã«ã¡ã©ãåæåãã颿° Future < void > _initializeCameraController; @override void initState () { super . initState (); // â¡ // ã³ã³ãããŒã©ãåæå _cameraController = CameraController ( // 䜿çšããã«ã¡ã©ãã³ã³ãããŒã©ã«èšå® widget.camera, // 䜿çšããè§£å床ãèšå® // low : 352x288 on iOS, 240p (320x240) on Android // medium : 480p (640x480 on iOS, 720x480 on Android) // high : 720p (1280x720) // veryHigh : 1080p (1920x1080) // ultraHigh : 2160p (3840x2160) // max : å©çšå¯èœãªæå€§ã®è§£å床 ResolutionPreset .max); // ⢠// ã³ã³ãããŒã©ãŒã«èšå®ãããã«ã¡ã©ãåæå _initializeCameraController = _cameraController. initialize (); } // ⣠@override void dispose () { // ãŠã£ãžã§ãããç Žæ£ãããã¿ã€ãã³ã°ã§ãã«ã¡ã©ã®ã³ã³ãããŒã©ãç Žæ£ãã _cameraController. dispose (); super . dispose (); } @override Widget build ( BuildContext context) {} } ã«ã¡ã©ãèµ·åããç»é¢ãæ§ç¯ãã ã«ã¡ã©ãèµ·åããç»é¢ãšã㊠StatefulWidget ã䜿çšããç»é¢ãæ§ç¯ããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒ ã§ CameraDescription ã¯ã©ã¹ãåãåãã䜿çšããã«ã¡ã©ãèšå®ããŸãã ã«ã¡ã©ã³ã³ãããŒã©ãŒãåæåããŸã CameraController ã® ã³ã³ã¹ãã©ã¯ã¿ãŒ ã®ç¬¬äžåŒæ°ã« CameraDescription ãæå®ããå¶åŸ¡å¯Ÿè±¡ã®ã«ã¡ã©ãèšå®ããŸãã第äºåŒæ°ã«ãåæå ResolutionPreset ããã«ã¡ã©ã®è§£å床ãæå®ããŸããä»åã¯äœ¿çšã§ããæå€§ã®è§£å床ãæå®ããŸãã ã«ã¡ã©ã³ã³ãããŒã©ãŒã«èšå®ãããã«ã¡ã©ãåæåããŸã CameraController ã¯ã©ã¹ã«èšå®ããã端æ«ã®ã«ã¡ã©ãã initialize ã¡ãœãããå®è¡ããŠåæåããŸãã initialize ã¡ãœããã¯éåæåŠçãè¡ãã¡ãœããã®ããã Feature ãªããžã§ã¯ããè¿ããŸãã ãŠã£ãžã§ãã ç Žæ£ã®ã¡ãœããã®è¿œå StatefulWidget ã® dispose ã¡ãœããå
ã§ã CameraController ã¯ã©ã¹ã® dispose ã¡ãœãããåŒã³åºããŸãã ãŠã£ãžã§ãã ãç Žæ£ãããã¿ã€ãã³ã°ã§ã CameraController ã¯ã©ã¹ãç Žæ£ããçšã«ãªããŸãã 以äžãã«ã¡ã©ã®åæèšå®ã«ãªããŸããæ¬¡ã¯ãã«ã¡ã©ãååŸããç»åãç»é¢ã«è¡šç€ºãã ãã¬ãã¥ãŒæ©èœ ãå®è£
ããŸãã ã«ã¡ã©ã®ãã¬ãã¥ãŒã®å®è£
camera ãã©ã°ã€ã³ ã® CameraPreview ã¯ã©ã¹ãå©çšããŠãã«ã¡ã©ãååŸããç»åããã¬ãã¥ãŒãšããŠç»é¢ã«è¡šç€ºããŸããå
ã»ã©ã® CameraHomeState ã¯ã©ã¹ã®ã build ã¡ãœããã«ä»¥äžã®ã³ãŒãã远å ããŸãã @override Widget build ( BuildContext context) { return Scaffold ( appBar : AppBar ( title : const Text ( '' ), ), // FutureBuilderãå®è£
body : FutureBuilder < void > ( future : _initializeCameraController, builder : (context, snapshot) { if (snapshot.connectionState == ConnectionState .done) { // ã«ã¡ã©ã®åæåãå®äºãããããã¬ãã¥ãŒã衚瀺 return CameraPreview (_cameraController); } else { // ã«ã¡ã©ã®åæåäžã¯ã€ã³ãžã±ãŒã¿ãŒã衚瀺 return const Center (child : CircularProgressIndicator ()); } }, ), ); } FutureBuilder ã¯ã©ã¹ã¯ãéåæã§ç»é¢ãæ§ç¯ã§ããŸããåŒæ°ã® future ã§éåæåŠçãèšå®ãã builder ã§éåæåŠçãå®äºããå Žåãšå®äºããŠããªãå Žåã®åŠçãå®è£
ããŸããä»åã¯ãéåæåŠçãšããŠã«ã¡ã©ã®åæåãè¡ã initialize ã¡ãœãããå®è¡ããã«ã¡ã©ã®åæåãå®äºãããšãã¬ãã¥ãŒç»é¢ããå®äºããŠããªãå Žåã¯ã€ã³ãžã±ãŒã¿ãŒã衚瀺ããããã«ããŸãã 以äžãã«ã¡ã©ã®ãã¬ãã¥ãŒã衚瀺ããããã®å®è£
ã§ãã ç»åã®æ®åœ±ãšä¿åã®å®è£
次ã¯ãã«ã¡ã©ã®ã·ã£ãã¿ãŒãã¿ã³ãå®è£
ããç»åã®æ®åœ±ãšä¿åãè¡ããŸããã«ã¡ã©ã®ã·ã£ãã¿ãŒãã¿ã³ã¯ FloatingActionButton ã§å®è£
ããŸãã FloatingActionButton ã® onPressed åŒæ°ã§ãã¿ã³ãæŒäžãããå Žåã®å®è£
ãããŸãã @override Widget build ( BuildContext context) { return Scaffold ( appBar : AppBar ( title : const Text ( '' ), ), body : FutureBuilder < void > ( // çç¥ ), floatingActionButton : FloatingActionButton ( child : const Icon ( Icons .camera_alt), // ãã¿ã³ãæŒäžãããéã®åŠç onPressed : () async { try { // â ç»åãä¿åãããã¹ãäœæãã final path = join ( ( await getApplicationDocumentsDirectory ()).path, ' ${DateTime.now()} .png' , ); // â¡ã«ã¡ã©ã§ç»åãæ®åœ±ãã await _cameraController. takePicture (path); // â¢ç»åã衚瀺ããç»é¢ã«é·ç§» Navigator . push ( context, MaterialPageRoute ( builder : (context) => CameraDisplay (imgPath : path), ), ); } catch (e) { print (e); } }, ), } ç»åãä¿åãããã¹ãäœæ path ãã©ã°ã€ã³ ã® join ã¡ãœããã䜿çšããŠãç»åãä¿åãããã¹ãäœæããŸãã path_provider ãã©ã°ã€ã³ ã® getApplicationDocumentsDirectory ã¡ãœããã䜿çšããããšã§ãã¢ããªå°çšã® ãã£ã¬ã¯ã ãªãååŸã§ããŸãã åçãæ®åœ±ããäœæãããã¹ã«ä¿å CameraController ã¯ã©ã¹ã® takePicture ã¡ãœããã§ç»åã®æ®åœ±ãè¡ãããšãã§ããŸããåŒæ°ã«æå®ãããã¹ã«ç»åãä¿åã§ããŸãã æ®åœ±ããç»åã衚瀺ããç»é¢ã«é·ç§» ç»åã衚瀺ããç»é¢ã¯æ¬¡ã§å®è£
ããŸããããã§ã¯ãç»é¢ã® ã³ã³ã¹ãã©ã¯ã¿ãŒ ã«å
ã»ã©ç»åãä¿åãããã¹ãæž¡ããŸãã 以äžãç»åã®æ®åœ±ããä¿åãŸã§ã®å®è£
ã§ãã ãããŸã§ã®å®è£
ã§ã以äžã®ãããªã«ã¡ã©ããååŸããç»åã衚瀺ããæ®åœ±çšã®ãã¿ã³ã衚瀺ããç»é¢ãåºæ¥äžãããŸãã ã«ã¡ã©æ®åœ±ç»é¢ æåŸã«æ®åœ±ãã¿ã³ãæŒäžåŸãä¿åããç»åã衚瀺ããç»é¢ãäœæããŸãã æ®åœ±ããç»åã衚瀺ãã æåŸã«ãæ®åœ±ãä¿åããç»åã衚瀺ããç»é¢ãäœæããŸãã ç»åã衚瀺ããããã«ã¯ã Image ãŠã£ãžã§ãã ã䜿çšããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒ ã«è¡šç€ºãããç»åã®ãã¹ãæå®ããããšã§ç»åã衚瀺ã§ããŸãã class CameraDisplay extends StatelessWidget { // 衚瀺ããç»åã®ãã¹ final String imgPath; // ç»é¢ã®ã³ã³ã¹ãã©ã¯ã¿ const CameraDisplay ({ Key key, this .imgPath}) : super (key : key); @override Widget build ( BuildContext context) { return Scaffold ( appBar : AppBar ( title : const Text ( 'Picture' ), ), body : Column ( // ImageãŠã£ãžã§ããã§ç»åã衚瀺ãã children : [ Expanded (child : Image . file ( File (imgPath)))], ) ); } } ããã§ä»¥äžã®ãããªç»åã衚瀺ããç»é¢ãäœæã§ããŸãã ç»å衚瀺 å®è£
ã¯ä»¥äžã«ãªããŸããå
šäœã® ãœãŒã¹ã³ãŒã ã¯ä»¥äžã«ãªããŸãã å
šäœã® ãœãŒã¹ã³ãŒã å
šäœã®ãœãŒã¹ã³ãŒã import 'dart:async' ; import 'dart:io' ; import 'package:camera/camera.dart' ; import 'package:flutter/material.dart' ; import 'package:path/path.dart' show join; import 'package:path_provider/path_provider.dart' ; Future < void > main () async { // runAppãå®è¡ãããåã«ãcameraãã©ã°ã€ã³ãåæå WidgetsFlutterBinding . ensureInitialized (); // ããã€ã¹ã§äœ¿çšå¯èœãªã«ã¡ã©ã®äžèЧãååŸãã final cameras = await availableCameras (); // å©çšå¯èœãªã«ã¡ã©ã®äžèЧãããæå®ã®ã«ã¡ã©ãååŸãã final firstCamera = cameras.first; runApp ( MyApp (camera : firstCamera)); } class MyApp extends StatelessWidget { final CameraDescription camera; const MyApp ({ Key key, @required this .camera}) : super (key : key); // This widget is the root of your application. @override Widget build ( BuildContext context) { return MaterialApp ( title : 'Flutter Demo' , theme : ThemeData ( primarySwatch : Colors .blue, visualDensity : VisualDensity .adaptivePlatformDensity, ), home : MyHomePage ( camera : camera, ), ); } } class MyHomePage extends StatelessWidget { final CameraDescription camera; const MyHomePage ({ Key key, @required this .camera}) : super (key : key); @override Widget build ( BuildContext context) { return Scaffold ( appBar : AppBar ( title : const Text ( 'Camera Example' ), ), body : Wrap ( children : [ RaisedButton ( child : const Text ( 'Camera' ), onPressed : () { Navigator . push (context, MaterialPageRoute (builder : (context) { return CameraHome (camera : camera,); })); }), ], ), ); } } class CameraHome extends StatefulWidget { final CameraDescription camera; const CameraHome ({ Key key, @required this .camera}) : super (key : key); @override State < StatefulWidget > createState () => CameraHomeState (); } class CameraHomeState extends State < CameraHome > { // ããã€ã¹ã®ã«ã¡ã©ãå¶åŸ¡ããã³ã³ãããŒã© CameraController _cameraController; // ã³ã³ãããŒã©ãŒã«èšå®ãããã«ã¡ã©ãåæåãã颿° Future < void > _initializeCameraController; @override void initState () { super . initState (); // ã³ã³ãããŒã©ãåæå _cameraController = CameraController ( // 䜿çšããã«ã¡ã©ãã³ã³ãããŒã©ã«èšå® widget.camera, // 䜿çšããè§£å床ãèšå® // low : 352x288 on iOS, 240p (320x240) on Android // medium : 480p (640x480 on iOS, 720x480 on Android) // high : 720p (1280x720) // veryHigh : 1080p (1920x1080) // ultraHigh : 2160p (3840x2160) // max : å©çšå¯èœãªæå€§ã®è§£å床 ResolutionPreset .max); // ã³ã³ãããŒã©ãŒã«èšå®ãããã«ã¡ã©ãåæå _initializeCameraController = _cameraController. initialize (); } @override void dispose () { // ãŠã£ãžã§ãããç Žæ£ãããã¿ã€ãã³ã°ã§ãã«ã¡ã©ã®ã³ã³ãããŒã©ãç Žæ£ãã _cameraController. dispose (); super . dispose (); } @override Widget build ( BuildContext context) { return Scaffold ( appBar : AppBar ( title : const Text ( '' ), ), // FutureBuilderãå®è£
body : FutureBuilder < void > ( future : _initializeCameraController, builder : (context, snapshot) { if (snapshot.connectionState == ConnectionState .done) { // ã«ã¡ã©ã®åæåãå®äºãããããã¬ãã¥ãŒã衚瀺 return CameraPreview (_cameraController); } else { // ã«ã¡ã©ã®åæåäžã¯ã€ã³ãžã±ãŒã¿ãŒã衚瀺 return const Center (child : CircularProgressIndicator ()); } }, ), floatingActionButton : FloatingActionButton ( child : const Icon ( Icons .camera_alt), // ãã¿ã³ãæŒäžãããéã®åŠç onPressed : () async { try { // ç»åãä¿åãããã¹ãäœæãã final path = join ( ( await getApplicationDocumentsDirectory ()).path, ' ${DateTime.now()} .png' , ); // ã«ã¡ã©ã§ç»åãæ®åœ±ãã await _cameraController. takePicture (path); // ç»åã衚瀺ããç»é¢ã«é·ç§» Navigator . push ( context, MaterialPageRoute ( builder : (context) => CameraDisplay (imgPath : path), ), ); } catch (e) { print (e); } }, ), ); } } class CameraDisplay extends StatelessWidget { // 衚瀺ããç»åã®ãã¹ final String imgPath; // ç»é¢ã®ã³ã³ã¹ãã©ã¯ã¿ const CameraDisplay ({ Key key, this .imgPath}) : super (key : key); @override Widget build ( BuildContext context) { return Scaffold ( appBar : AppBar ( title : const Text ( 'Picture' ), ), body : Column ( // ImageãŠã£ãžã§ããã§ç»åã衚瀺ãã children : [ Expanded (child : Image . file ( File (imgPath)))], ) ); } } ãŸãšã Flutterã§ã«ã¡ã©æ©èœãå®è£
ããŠã¿ãŸããã以åã Swiftã§ã«ã¡ã©æ©èœãå®è£
ããããš ãããã®ã§ããããã®æãšæ¯ã¹å¿
èŠãªã¯ã©ã¹ã ãã©ã°ã€ã³ ã§ãã§ã«å®è£
ãããŠããã®ã§ãã·ã³ãã«ã«å®è£
ããããšãã§ããŸããã ãŸãFlutterã®ç¹åŸŽãšããŠå®£èšçã«UIãæ§ç¯ã§ããã®ã§ã楜ã«éçºã§ããŸãã ä»åã¯ã·ã³ãã«ãªã«ã¡ã©æ©èœã ãã®ç޹ä»ã§ãããã GitHub ã«ã€ã³ã«ã¡ã®åãæ¿ãã®ã§ããã³ãŒãã眮ããŠããŸããèå³ãããã°ç¢ºèªããŠã¿ãŠãã ããã åè Take a picture using the camera | Flutter ãšã³ãžã㢠äžéæ¡çš ãµã€ã ã©ã¯ ã¹ã§ã¯ããšã³ãžãã¢ã»ãã¶ã€ããŒã® äžéæ¡çš ãç©æ¥µçã«è¡ã£ãŠãããŸãïŒ ãèå³ãããŸãããæ¯éã確èªããé¡ãããŸãã https://career-recruit.rakus.co.jp/career_engineer/ ã«ãžã¥ã¢ã«é¢è«ãç³èŸŒã¿ãã©ãŒã ã©ã®è·çš®ã«å¿åããã°è¯ããããããªããšããæ¹ã¯ãã«ãžã¥ã¢ã«é¢è«ãéæè¡ã£ãŠãããŸãã 以äžãã©ãŒã ãããç³èŸŒã¿ãã ããã rakus.hubspotpagebuilder.com ã©ã¯ ã¹Developersç»é²ãã©ãŒã https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ ã€ãã³ãæ
å ± äŒç€Ÿã®é°å²æ°ãç¥ãããæ¹ã¯ãæ¯é±éå¬ããŠããã€ãã³ãã«ãåå ãã ããïŒ âTECH PLAY techplay.jp âconnpass rakus.connpass.com