| import 'package:flutter/material.dart';
import 'auth_gate.dart';
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const AuthGate(),
);
}
}
|
這段代碼是一個使用 Flutter 框架構建的應用程序的入口:
-
import 'package:flutter/material.dart';:這行代碼是導入 Flutter 框架的 Material 組件庫,它包含了構建應用程序所需的各種視覺組件和功能。
-
import 'auth_gate.dart';:這行代碼是導入自定義的 auth_gate.dart 文件,該文件可能包含了應用程序的身份驗證網關或其他自定義組件。
-
class MyApp extends StatelessWidget { ... }:這是一個名為 MyApp 的類,它繼承自 StatelessWidget 類。在 Flutter 中,一個應用程序通常從一個 Widget 開始構建,而 StatelessWidget 是一個不可變的 Widget,意味著一旦構建完成,就不能更改其狀態或屬性。
-
const MyApp({super.key});:這是 MyApp 類的構造函數,使用了可選的參數 key,這個參數通常用於在 Widget 樹中標識不同的 Widget。
-
Widget build(BuildContext context) { ... }:這是 StatelessWidget 的一個必需的方法,用於構建 Widget 的 UI。BuildContext 是一個包含有關 Widget 在樹中位置和主題的信息的對象。
-
return MaterialApp(...);:這是一個 MaterialApp Widget 的實例,它是一個定義了應用程序 UI 的頂層 Widget。它包含了主題和應用程序的主頁。
-
theme: ThemeData(...):這里設置了應用程序的主題,包括顏色方案和是否使用 Material Design 3.0。
-
home: const AuthGate(),:這里指定了應用程序的主頁為一個名為 AuthGate 的 Widget,通常是用戶登錄或身份驗證的界面。
這段代碼的作用是創建一個基本的 Flutter 應用程序,並指定了應用程序的主題和主頁。
| import 'package:firebase_auth/firebase_auth.dart' hide EmailAuthProvider;
import 'package:firebase_ui_auth/firebase_ui_auth.dart';
import 'package:firebase_ui_oauth_google/firebase_ui_oauth_google.dart';
import 'package:flutter/material.dart';
import 'home.dart';
import 'main.dart';
class AuthGate extends StatelessWidget {
const AuthGate({super.key});
@override
Widget build(BuildContext context) {
return StreamBuilder<User?>(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return SignInScreen(
providers: [
EmailAuthProvider(),
GoogleProvider(clientId: clientId),
],
headerBuilder: (context, constraints, shrinkOffset) {
return Padding(
padding: const EdgeInsets.all(20),
child: AspectRatio(
aspectRatio: 1,
child: Image.asset('assets/flutterfire_300x.png'),
),
);
},
subtitleBuilder: (context, action) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: action == AuthAction.signIn
? const Text('Welcome to FlutterFire, please sign in!')
: const Text('Welcome to Flutterfire, please sign up!'),
);
},
footerBuilder: (context, action) {
return const Padding(
padding: EdgeInsets.only(top: 16),
child: Text(
'By signing in, you agree to our terms and conditions.',
style: TextStyle(color: Colors.grey),
),
);
},
);
}
return const HomeScreen();
},
);
}
}
|
這段 Dart 程式碼定義了一個名為
AuthGate 的 Flutter widget,該 widget 是
StatelessWidget 的子類,這意味著它的 UI 在生命週期內不會改變。
在 build 方法中,我們返回一個 StreamBuilder widget,它會根據 FirebaseAuth.instance.authStateChanges() 的結果來構建 UI。authStateChanges() 是一個 Stream,當 Firebase Auth 的認證狀態發生變化時,它會發出事件。
StreamBuilder 的 builder 方法會根據 Stream 的最新事件來構建 UI。如果 Stream 尚未發出事件(即 snapshot.hasData 為 false),則返回一個 SignInScreen widget,該 widget 提供用戶登入的界面。在這個界面中,用戶可以選擇使用 Email 或 Google 進行登入。
如果 Stream 已經發出事件,這意味著用戶的認證狀態已經確定,則返回 HomeScreen widget,這是用戶已登入後看到的主頁面。
這個 AuthGate widget 的主要功能是根據用戶的認證狀態來決定顯示哪個界面。如果用戶未登入,則顯示登入界面;如果用戶已登入,則顯示主頁面。
| import 'package:firebase_ui_auth/firebase_ui_auth.dart';
import 'package:flutter/material.dart';
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
actions: [
IconButton(
icon: const Icon(Icons.person),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute<ProfileScreen>(
builder: (context) => ProfileScreen(
appBar: AppBar(
title: const Text('User Profile'),
),
actions: [
SignedOutAction((context) {
Navigator.of(context).pop();
})
],
children: [
const Divider(),
Padding(
padding: const EdgeInsets.all(2),
child: AspectRatio(
aspectRatio: 1,
child: Image.asset('flutterfire_300x.png'),
),
),
],
),
),
);
},
)
],
automaticallyImplyLeading: false,
),
body: Center(
child: Column(
children: [
Image.asset('dash.png'),
Text(
'Welcome!',
style: Theme.of(context).textTheme.displaySmall,
),
const SignOutButton(),
],
),
),
);
}
}
|
這段 Dart 程式碼定義了一個名為
HomeScreen 的 Flutter widget,該 widget 是
StatelessWidget 的子類,這意味著它的 UI 在生命週期內不會改變。
在 build 方法中,我們返回一個 Scaffold widget,這是一個基本的視覺布局結構,包含了應用程序的主要元素,如 appBar 和 body。
appBar 是一個 AppBar widget,其中包含一個 IconButton。當按下這個按鈕時,會使用 Navigator.push 方法導航到 ProfileScreen 頁面。ProfileScreen 頁面包含一個 AppBar,一個 SignedOutAction,以及一個顯示圖片的 AspectRatio widget,請注意ProfileScreen是Firebase的package提供的widget
body 是一個 Center widget,其中包含一個 Column widget。Column widget 包含一個圖片,一個歡迎文字,以及一個 SignOutButton。
這個 HomeScreen widget 的主要功能是提供一個主頁面,用戶可以從這裡導航到他們的個人資料頁面,或者登出。
| import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'app.dart';
import 'firebase_options.dart';
// TODO(codelab user): Get API key
const clientId = 'YOUR_CLIENT_ID';
void main() async {
WidgetsFlutterBinding.ensureInitialized(); // 初始化 Flutter 應用程序綁定
await Firebase.initializeApp( // 初始化 Firebase 應用
options: DefaultFirebaseOptions.currentPlatform, // 使用默認 Firebase 選項
);
runApp(const MyApp()); // 運行我們的 Flutter 應用程序
}
|
這段代碼是一個Flutter應用程序的主入口:
-
import 'package:firebase_core/firebase_core.dart'; 和 import 'package:flutter/material.dart';:這些語句用於導入Flutter和Firebase庫,以便我們可以使用它們的功能。
-
WidgetsFlutterBinding.ensureInitialized();:這行代碼確保Flutter應用程序已經初始化綁定。這是因為Flutter應用程序在運行之前需要綁定到操作系統。
-
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);:這是初始化Firebase應用程序的關鍵部分。我們使用await關鍵字等待初始化完成,以確保我們在繼續之前已經準備好使用Firebase。
-
const clientId = 'YOUR_CLIENT_ID';:這是一個常量,存儲著你的客戶端ID。在這個示例中,你需要替換YOUR_CLIENT_ID為你的實際客戶端ID。