開発環境 windows10, vscode
- 参考
https://www.flutter-study.dev/firebase/authentication
https://zenn.dev/maropook/articles/f82c98a56b14ca
- 試したこと
エラー"FirebaseOptions cannot be null when creating the default app." の対処
Firebase.initializeApp() に初期値を与えることで解決した
登録NG: NoSuchMethodError: tried to call a non-function, such as null: 'dart.global.firebase.auth'
未解決
index.html
<!DOCTYPE html> <html> <head> <!-- If you are serving your web app in a path other than the root, change the href value below to reflect the base path you are serving from. The path provided below has to start and end with a slash "/" in order for it to work correctly. For more details: * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base This is a placeholder for base href that will be replaced by the value of the `--base-href` argument provided to `flutter build`. --> <base href="$FLUTTER_BASE_HREF"> <meta charset="UTF-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="description" content="A new Flutter project."> <!-- iOS meta tags & icons --> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="apple-mobile-web-app-title" content="mychatapp"> <link rel="apple-touch-icon" href="icons/Icon-192.png"> <!-- Favicon --> <link rel="icon" type="image/png" href="favicon.png"/> <title>mychatapp</title> <link rel="manifest" href="manifest.json"> <script> // The value below is injected by flutter build, do not touch. var serviceWorkerVersion = null; </script> <!-- This script adds the flutter initialization JS code --> <script src="flutter.js" defer></script> </head> <body> <script> window.addEventListener('load', function(ev) { // Download main.dart.js _flutter.loader.loadEntrypoint({ serviceWorker: { serviceWorkerVersion: serviceWorkerVersion, } }).then(function(engineInitializer) { return engineInitializer.initializeEngine(); }).then(function(appRunner) { return appRunner.runApp(); }); }); </script> <script src="https://www.gstatic.com/firebasejs/9.8.3/firebase-app.js"></script> <script src="https://www.gstatic.com/firebasejs/9.8.3/firebase-auth.js"></script> <script> const firebaseConfig = { apiKey: "AIzaSyDd55SAcL-qBGe0iidvrEelD0Lxd2FJbBo", authDomain: "myapp-47093.firebaseapp.com", projectId: "myapp-47093", storageBucket: "myapp-47093.appspot.com", messagingSenderId: "202117038660", appId: "1:202117038660:web:6fecd6df4a33756b63b211", measurementId: "G-D4MXME2D3W" }; firebase.initializeApp(firebaseConfig); </script> <script src="main.dart.js" type="application/javascript"></script> </body> </html>
config.dart
class Configurations { static const _apiKey = "AIzaSyDd55SAcL-qBGe0iidvrEelD0Lxd2FJbBo"; static const _authDomain = "myapp-47093.firebaseapp.com"; static const _projectId = "myapp-47093"; static const _storageBucket = "myapp-47093.appspot.com"; static const _messagingSenderId = "202117038660"; static const _appId = "1:202117038660:web:6fecd6df4a33756b63b211"; String get apiKey => _apiKey; String get authDomain => _authDomain; String get projectId => _projectId; String get storageBucket => _storageBucket; String get messagingSenderId => _messagingSenderId; String get appId => _appId; }
main.dart
import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'config.dart'; final configurations = Configurations(); Future<void> main() async { // Firebase初期化 await Firebase.initializeApp( options: FirebaseOptions( apiKey: configurations.apiKey, appId: configurations.appId, messagingSenderId: configurations.messagingSenderId, projectId: configurations.projectId)); runApp(MyApp()); } class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyAuthPage(), ); } } class MyAuthPage extends StatefulWidget { @override _MyAuthPageState createState() => _MyAuthPageState(); } class _MyAuthPageState extends State<MyAuthPage> { // 入力されたメールアドレス String newUserEmail = ""; // 入力されたパスワード String newUserPassword = ""; // 登録・ログインに関する情報を表示 String infoText = ""; @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Container( padding: EdgeInsets.all(32), child: Column( children: <Widget>[ TextFormField( // テキスト入力のラベルを設定 decoration: InputDecoration(labelText: "メールアドレス"), onChanged: (String value) { setState(() { newUserEmail = value; }); }, ), const SizedBox(height: 8), TextFormField( decoration: InputDecoration(labelText: "パスワード(6文字以上)"), // パスワードが見えないようにする obscureText: true, onChanged: (String value) { setState(() { newUserPassword = value; }); }, ), const SizedBox(height: 8), ElevatedButton( onPressed: () async { try { // メール/パスワードでユーザー登録 final FirebaseAuth auth = FirebaseAuth.instance; final UserCredential result = await auth.createUserWithEmailAndPassword( email: newUserEmail, password: newUserPassword, ); // 登録したユーザー情報 final User user = result.user!; setState(() { infoText = "登録OK:${user.email}"; }); } catch (e) { // 登録に失敗した場合 setState(() { infoText = "登録NG:${e.toString()}"; }); } }, child: Text("ユーザー登録"), ), const SizedBox(height: 8), Text(infoText) ], ), ), ), ); } }