前提・実現したいこと
flutterで、ページの遷移先にカメラを起動させようとしているのですが、カメラが起動していません。みなさまのお知恵をお貸しいただけないでしょうか。カメラのソースコードは、flutter 公式HPのcookbookを参考にしました。
リンク先: https://flutter.dev/docs/cookbook/plugins/picture-using-camera
発生している問題・エラーメッセージ
ページ先のカメラが起動しません。カメラの情報が、ページの遷移先にうまく渡せていないのかもしれません。
エラーメッセージはないのですが、main.dart の下から7行目のTakePictureScreen()のところに「The 'camera' parameter is required.」と警告がでてしまいます。また、main.dartの上から12行目(空白入れて)のcameraFirstにも、「The value of the local variable 'firstCamera' isn't used.」と警告でてしまっています
・The parameter 'camera' is required.
・The value of the local variable 'firstCamera' isn't used.
Try removing the variable, or using it.
該当のソースコード
main.dart
dart
1import 'camera.dart'; 2import 'package:flutter/material.dart'; 3import 'package:camera/camera.dart'; 4 5 6List<CameraDescription> cameras; 7Future<void> main() async{ 8 WidgetsFlutterBinding.ensureInitialized(); 9 10 11 final cameras = await availableCameras(); 12 final firstCamera = cameras.first; 13 runApp(MyApp()); 14 15 16 17} 18 19class MyApp extends StatelessWidget { 20 21 Widget build (BuildContext context){ 22 return MaterialApp( 23 title: 'Sort cam', 24 theme: ThemeData( 25 primarySwatch:Colors.blue, 26 ), 27 home: MyHomePage() 28 ); 29 } 30} 31class MyHomePage extends StatelessWidget{ 32 33 Widget build(BuildContext context){ 34 return Scaffold( 35 appBar:AppBar( 36 title: const Text('sort cam'), 37 actions: <Widget>[ 38 IconButton(icon: Icon(Icons.settings), 39 onPressed:(){}, 40 ) 41 ] 42 ), 43 body: Center( 44 child: RaisedButton(onPressed: () { 45 Navigator.push( 46 context, 47 MaterialPageRoute( 48 builder: (contest) => TakePictureScreen()), 49 ); 50 }, child: Text('カメラを起動')) 51 ), 52 ); 53 } 54}
camera.dart
dart
1import 'dart:io'; 2import 'package:camera/camera.dart'; 3import 'package:flutter/cupertino.dart'; 4import 'package:flutter/material.dart'; 5import 'dart:async'; 6 7 8class TakePictureScreen extends StatefulWidget { 9 10 final CameraDescription camera; 11 12 const TakePictureScreen({ 13 Key key, 14 this.camera, 15 }) : super(key: key); 16 17 18 TakePictureScreenState createState() => TakePictureScreenState(); 19} 20 21class TakePictureScreenState extends State<TakePictureScreen> { 22 CameraController _controller; 23 Future<void> _initializeControllerFuture; 24 25 26 void initState() { 27 super.initState(); 28 // To display the current output from the Camera, 29 // create a CameraController. 30 _controller = CameraController( 31 // Get a specific camera from the list of available cameras. 32 widget.camera, 33 // Define the resolution to use. 34 ResolutionPreset.medium, 35 ); 36 37 // Next, initialize the controller. This returns a Future. 38 _initializeControllerFuture = _controller.initialize(); 39 } 40 41 42 void dispose() { 43 // Dispose of the controller when the widget is disposed. 44 _controller.dispose(); 45 super.dispose(); 46 } 47 48 49 Widget build(BuildContext context) { 50 return Scaffold( 51 appBar: AppBar(title: Text('Take a picture')), 52 // Wait until the controller is initialized before displaying the 53 // camera preview. Use a FutureBuilder to display a loading spinner 54 // until the controller has finished initializing. 55 body: FutureBuilder<void>( 56 future: _initializeControllerFuture, 57 builder: (context, snapshot) { 58 if (snapshot.connectionState == ConnectionState.done) { 59 // If the Future is complete, display the preview. 60 return CameraPreview(_controller); 61 } else { 62 // Otherwise, display a loading indicator. 63 return Center(child: CircularProgressIndicator()); 64 } 65 }, 66 ), 67 floatingActionButton: FloatingActionButton( 68 child: Icon(Icons.camera_alt), 69 // Provide an onPressed callback. 70 onPressed: () async { 71 // Take the Picture in a try / catch block. If anything goes wrong, 72 // catch the error. 73 try { 74 // Ensure that the camera is initialized. 75 await _initializeControllerFuture; 76 77 // Attempt to take a picture and get the file `image` 78 // where it was saved. 79 final image = await _controller.takePicture(); 80 81 // If the picture was taken, display it on a new screen. 82 Navigator.push( 83 context, 84 MaterialPageRoute( 85 builder: (context) => DisplayPictureScreen( 86 // Pass the automatically generated path to 87 // the DisplayPictureScreen widget. 88 imagePath: image?.path, 89 ), 90 ), 91 ); 92 } catch (e) { 93 // If an error occurs, log the error to the console. 94 print(e); 95 } 96 }, 97 ), 98 ); 99 } 100} 101 102// A widget that displays the picture taken by the user. 103class DisplayPictureScreen extends StatelessWidget { 104 final String imagePath; 105 106 const DisplayPictureScreen({Key key, this.imagePath}) : super(key: key); 107 108 109 Widget build(BuildContext context) { 110 return Scaffold( 111 appBar: AppBar(title: Text('Display the Picture')), 112 // The image is stored as a file on the device. Use the `Image.file` 113 // constructor with the given path to display the image. 114 body: Image.file(File(imagePath)), 115 ); 116 } 117} 118
試したこと
main.dart の下から7行目のTakePictureScreen()の中に、camera: firstCameraと入れてみたのですが、「Undefinedname 'firstCamera'」とでてしまいます。(main.dartの、空白入れて上から12行目に宣言しているのにもかかわらず)
補足情報(FW/ツールのバージョンなど)
pubspec.yamlのdependenciesは、
camera: ^0.7.0+2 です。
android > app> build.gradle のminSDKversionは23にしました。
どなたかご回答お願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/03 02:52