flutter_twitter_clone
一个使用 Firebase 身份验证、实时数据库和存储用 Flutter 编写的有效 Twitter 克隆。
下载应用
屏幕截图
| 欢迎页面 | 登录页面 | 注册页面 | 忘记密码页面 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 首页侧边栏 | 主页 | 主页 | 主页 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 撰写推文页面 | 回复推文 | 回复推文 | 带评论的转推 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 推文详情页 | 推文线 | 嵌套推文线 | 推文选项 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 通知页面 | 通知页面 | 通知页面 | 通知设置页面 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 个人资料页面 | 个人资料页面 | 个人资料页面 | 个人资料页面 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 选择用户页面 | 聊天页面 | 聊天用户列表 | 对话信息页 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 搜索页面 | 搜索设置页面 | 推文选项 - 1 | 推文选项 - 2 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 设置页面 | 账户设置页面 | 隐私设置页面 | 隐私设置页面 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 内容偏好设置页面 | 显示设置页面 | 数据设置页面 | 辅助功能设置 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 喜欢推文的用户 | 关于设置页面 | 许可证设置 | 设置 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
入门
1. 设置 Flutter
2. 克隆仓库
$ git https://github.com/TheAlphamerc/flutter_twitter_clone.git
$ cd flutter_twitter_clone/
3. 设置 Firebase 应用
- 您需要创建一个 Firebase 实例。请按照 https://console.firebase.google.com 上的说明操作。
- 创建 Firebase 实例后,您需要启用 Google 身份验证。
- 转到新实例的 Firebase 控制台。
- 在左侧菜单中点击“身份验证”。
- 点击“登录方法”选项卡。
- 点击“Google”并启用它。
- 点击“电子邮件/密码”并启用它。
- 启用 Firebase 数据库。
- 转到 Firebase 控制台。
- 在左侧菜单中点击“数据库”。
- 点击“创建数据库”按钮(实时)。
- 选择“以测试模式开始”并“启用”。
- (如果不在 Android 上运行,则跳过)
- 在 Firebase 实例中为 Android 创建一个应用,包名为 com.thealphamerc.flutter_twitter_clone。
- 运行以下命令获取您的 SHA-1 密钥。
keytool -exportcert -list -v \
-alias androiddebugkey -keystore ~/.android/debug.keystore
- 在 Firebase 控制台中,在您的 Android 应用的设置中,通过点击“添加指纹”来添加您的 SHA-1 密钥。
- 按照说明下载 google-services.json。
- 将
google-services.json放入/android/app/。
- (如果不在 iOS 上运行,则跳过)
- 在 Firebase 实例中为 iOS 创建一个应用,使用您的应用包名。
- 按照说明下载 GoogleService-Info.plist。
- 在 Xcode 中打开,右键单击 Runner 文件夹,选择“将文件添加到‘Runner’”菜单,然后选择 GoogleService-Info.plist 文件,将其添加到 Xcode 中的 /ios/Runner。
- 在文本编辑器中打开 /ios/Runner/Info.plist。找到 CFBundleURLSchemes 键。此键的值数组中的第二个项目特定于 Firebase 实例。将其替换为 GoogleService-Info.plist 中 REVERSED_CLIENT_ID 的值。
目录结构
|-- lib
| |-- helper
| | |-- constant.dart
| | |-- customRoute.dart
| | |-- enum.dart
| | |-- routes.dart
| | |-- theme.dart
| | |-- utility.dart
| | '-- validator.dart
| |-- main.dart
| |-- model
| | |-- chatModel.dart
| | |-- commentModel.dart
| | |-- feedModel.dart
| | |-- notificationModel.dart
| | '-- user.dart
| |-- page
| | |-- Auth
| | | |-- forgetPasswordPage.dart
| | | |-- selectAuthMethod.dart
| | | |-- signin.dart
| | | |-- signup.dart
| | | '-- verifyEmail.dart
| | |-- common
| | | |-- sidebar.dart
| | | |-- splash.dart
| | | |-- usersListPage.dart
| | | '-- widget
| | | '-- userListWidget.dart
| | |-- feed
| | | |-- composeTweet
| | | | |-- composeTweet.dart
| | | | |-- createFeed.dart
| | | | '-- widget
| | | | |-- composeBottomIconWidget.dart
| | | | '-- composeTweetImage.dart
| | | |-- feedPage.dart
| | | |-- feedPostDetail.dart
| | | '-- imageViewPage.dart
| | |-- homePage.dart
| | |-- message
| | | |-- chatListPage.dart
| | | |-- chatScreenPage.dart
| | | |-- conversationInformation
| | | | '-- conversationInformation.dart
| | | '-- newMessagePage.dart
| | |-- notification
| | | '-- notificationPage.dart
| | |-- profile
| | | |-- EditProfilePage.dart
| | | |-- follow
| | | | |-- followerListPage.dart
| | | | '-- followingListPage.dart
| | | '-- profilePage.dart
| | |-- search
| | | '-- SearchPage.dart
| | '-- settings
| | |-- accountSettings
| | | |-- about
| | | | '-- aboutTwitter.dart
| | | |-- accessibility
| | | | '-- accessibility.dart
| | | |-- accountSettingsPage.dart
| | | |-- contentPrefrences
| | | | |-- contentPreference.dart
| | | | '-- trends
| | | | '-- trendsPage.dart
| | | |-- dataUsage
| | | | '-- dataUsagePage.dart
| | | |-- displaySettings
| | | | '-- displayAndSoundPage.dart
| | | |-- notifications
| | | | '-- notificationPage.dart
| | | |-- privacyAndSafety
| | | | |-- directMessage
| | | | | '-- directMessage.dart
| | | | '-- privacyAndSafetyPage.dart
| | | '-- proxy
| | | '-- proxyPage.dart
| | |-- settingsAndPrivacyPage.dart
| | '-- widgets
| | |-- headerWidget.dart
| | |-- settingsAppbar.dart
| | '-- settingsRowWidget.dart
| |-- state
| | |-- appState.dart
| | |-- authState.dart
| | |-- chats
| | | '-- chatState.dart
| | |-- feedState.dart
| | |-- notificationState.dart
| | '-- searchState.dart
| '-- widgets
| |-- bottomMenuBar
| | |-- HalfPainter.dart
| | |-- bottomMenuBar.dart
| | '-- tabItem.dart
| |-- customAppBar.dart
| |-- customWidgets.dart
| |-- newWidget
| | |-- customClipper.dart
| | |-- customLoader.dart
| | |-- customProgressbar.dart
| | |-- customUrlText.dart
| | |-- emptyList.dart
| | |-- rippleButton.dart
| | '-- title_text.dart
| '-- tweet
| |-- tweet.dart
| '-- widgets
| |-- tweetBottomSheet.dart
| |-- tweetIconsRow.dart
| '-- tweetImage.dart
|-- pubspec.yaml












































