🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Q&A

解決済

1回答

2761閲覧

flutter ページ遷移先のカメラがうまく作動しない

sugoroku

総合スコア5

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

0グッド

0クリップ

投稿2021/03/02 16:12

前提・実現したいこと

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にしました。
どなたかご回答お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

final firstCamera = cameras.first;
は、main() {}の中でのみ有効になっているので、引数として渡していく必要があるかと思います。

dart

1List<CameraDescription> cameras; 2 3Future<void> main() async{ 4 WidgetsFlutterBinding.ensureInitialized(); 5 final cameras = await availableCameras(); 6 final firstCamera = cameras.first; 7 runApp(MyApp(camera: firstCamera,)); 8} 9 10class MyApp extends StatelessWidget { 11 final CameraDescription camera; 12 const MyApp({Key key, this.camera}) : super(key: key); 13 14 15 Widget build (BuildContext context){ 16 return MaterialApp( 17 title: 'Sort cam', 18 theme: ThemeData( 19 primarySwatch:Colors.blue, 20 ), 21 home: MyHomePage(camera: camera) 22 ); 23 } 24} 25 26class MyHomePage extends StatelessWidget{ 27 final CameraDescription camera; 28 const MyHomePage({Key key, this.camera}) : super(key: key); 29 30 31 Widget build(BuildContext context){ 32 return Scaffold( 33 appBar:AppBar( 34 title: const Text('sort cam'), 35 actions: <Widget>[ 36 IconButton(icon: Icon(Icons.settings), 37 onPressed:(){}, 38 ) 39 ] 40 ), 41 body: Center( 42 child: RaisedButton(onPressed: () { 43 // Navigator.push( 44 // context, 45 // MaterialPageRoute( 46 // builder: (contest) => TakePictureScreen()), 47 // ); 48 Navigator.push(context, MaterialPageRoute(builder: (context) => TakePictureScreen(camera: camera))); 49 }, child: Text('カメラを起動')) 50 ), 51 ); 52 } 53}

もう少し良い書き方がある気がしますが、取り急ぎ動きました。

投稿2021/03/02 23:59

Rassy

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sugoroku

2021/03/03 02:52

無事動きました!引数として渡していくことが重要なんですね... 的確でわかりやすい回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問