Showing preview only (2,700K chars total). Download the full file or copy to clipboard to get everything.
Repository: guozhigq/pilipala
Branch: main
Commit: 06f23f67ca61
Files: 585
Total size: 2.5 MB
Directory structure:
gitextract_2k6f8qif/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-反馈.md
│ │ └── 功能请求.md
│ └── workflows/
│ ├── beta_ci.yml
│ └── release_ci.yml
├── .gitignore
├── .metadata
├── .vscode/
│ ├── launch.json
│ └── settings.json
├── LICENSE
├── README.md
├── analysis_options.yaml
├── android/
│ ├── .gitignore
│ ├── app/
│ │ ├── build.gradle
│ │ └── src/
│ │ ├── debug/
│ │ │ └── AndroidManifest.xml
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin/
│ │ │ │ └── com/
│ │ │ │ └── guozhigq/
│ │ │ │ └── pilipala/
│ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ ├── ic_baseline_forward_10_24.xml
│ │ │ │ ├── ic_baseline_replay_10_24.xml
│ │ │ │ └── launch_background.xml
│ │ │ ├── drawable-v21/
│ │ │ │ └── launch_background.xml
│ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ └── ic_launcher.xml
│ │ │ ├── raw/
│ │ │ │ └── keep.xml
│ │ │ ├── values/
│ │ │ │ ├── colors.xml
│ │ │ │ └── styles.xml
│ │ │ └── values-night/
│ │ │ └── styles.xml
│ │ └── profile/
│ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle/
│ │ └── wrapper/
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ └── settings.gradle
├── assets/
│ ├── loading.json
│ └── trail_loading.json
├── change_log/
│ ├── 1.0.0.0817.md
│ ├── 1.0.1.0817.md
│ ├── 1.0.10.1016.md
│ ├── 1.0.11.1112.md
│ ├── 1.0.12.1114.md
│ ├── 1.0.13.1217.md
│ ├── 1.0.14.1225.md
│ ├── 1.0.15.0101.md
│ ├── 1.0.16.0102.md
│ ├── 1.0.17.0125.md
│ ├── 1.0.18.0130.md
│ ├── 1.0.19.0131.md
│ ├── 1.0.2.0819.md
│ ├── 1.0.20.0303.md
│ ├── 1.0.21.0306.md
│ ├── 1.0.22.0430.md
│ ├── 1.0.23.0504.md
│ ├── 1.0.23.0505.md
│ ├── 1.0.24.0626.md
│ ├── 1.0.25.1010.md
│ ├── 1.0.3.0821.md
│ ├── 1.0.4.0822.md
│ ├── 1.0.5.0826.md
│ ├── 1.0.6.0902.md
│ ├── 1.0.7.0908.md
│ ├── 1.0.8.0917.md
│ └── 1.0.9.1015.md
├── fastlane/
│ └── metadata/
│ └── android/
│ ├── en-US/
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ └── zh-CN/
│ ├── changelogs/
│ │ └── 2001.txt
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
├── ios/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── LaunchImage.imageset/
│ │ │ ├── Contents.json
│ │ │ └── README.md
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── Runner-Bridging-Header.h
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ └── Runner.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ ├── IDEWorkspaceChecks.plist
│ └── WorkspaceSettings.xcsettings
├── lib/
│ ├── common/
│ │ ├── constants.dart
│ │ ├── pages_bottom_sheet.dart
│ │ ├── skeleton/
│ │ │ ├── dynamic_card.dart
│ │ │ ├── media_bangumi.dart
│ │ │ ├── skeleton.dart
│ │ │ ├── video_card_h.dart
│ │ │ ├── video_card_v.dart
│ │ │ └── video_reply.dart
│ │ └── widgets/
│ │ ├── animated_dialog.dart
│ │ ├── app_expansion_panel_list.dart
│ │ ├── appbar.dart
│ │ ├── badge.dart
│ │ ├── content_container.dart
│ │ ├── custom_toast.dart
│ │ ├── html_render.dart
│ │ ├── http_error.dart
│ │ ├── live_card.dart
│ │ ├── network_img_layer.dart
│ │ ├── no_data.dart
│ │ ├── sliver_header.dart
│ │ ├── stat/
│ │ │ ├── danmu.dart
│ │ │ └── view.dart
│ │ ├── video_card_h.dart
│ │ └── video_card_v.dart
│ ├── http/
│ │ ├── api.dart
│ │ ├── bangumi.dart
│ │ ├── black.dart
│ │ ├── common.dart
│ │ ├── constants.dart
│ │ ├── danmaku.dart
│ │ ├── dynamics.dart
│ │ ├── fan.dart
│ │ ├── fav.dart
│ │ ├── follow.dart
│ │ ├── html.dart
│ │ ├── index.dart
│ │ ├── init.dart
│ │ ├── interceptor.dart
│ │ ├── live.dart
│ │ ├── login.dart
│ │ ├── member.dart
│ │ ├── msg.dart
│ │ ├── read.dart
│ │ ├── reply.dart
│ │ ├── search.dart
│ │ ├── user.dart
│ │ └── video.dart
│ ├── main.dart
│ ├── models/
│ │ ├── bangumi/
│ │ │ ├── info.dart
│ │ │ └── list.dart
│ │ ├── common/
│ │ │ ├── action_type.dart
│ │ │ ├── business_type.dart
│ │ │ ├── color_type.dart
│ │ │ ├── dynamic_badge_mode.dart
│ │ │ ├── dynamics_type.dart
│ │ │ ├── gesture_mode.dart
│ │ │ ├── index.dart
│ │ │ ├── nav_bar_config.dart
│ │ │ ├── rank_type.dart
│ │ │ ├── rcmd_type.dart
│ │ │ ├── reply_sort_type.dart
│ │ │ ├── reply_type.dart
│ │ │ ├── search_type.dart
│ │ │ ├── tab_type.dart
│ │ │ ├── theme_type.dart
│ │ │ └── video_episode_type.dart
│ │ ├── danmaku/
│ │ │ ├── dm.pb.dart
│ │ │ ├── dm.pbenum.dart
│ │ │ ├── dm.pbjson.dart
│ │ │ ├── dm.pbserver.dart
│ │ │ └── dm.proto
│ │ ├── dynamics/
│ │ │ ├── result.dart
│ │ │ └── up.dart
│ │ ├── fans/
│ │ │ └── result.dart
│ │ ├── follow/
│ │ │ └── result.dart
│ │ ├── github/
│ │ │ └── latest.dart
│ │ ├── home/
│ │ │ └── rcmd/
│ │ │ └── result.dart
│ │ ├── live/
│ │ │ ├── follow.dart
│ │ │ ├── item.dart
│ │ │ ├── message.dart
│ │ │ ├── quality.dart
│ │ │ ├── room_info.dart
│ │ │ └── room_info_h5.dart
│ │ ├── login/
│ │ │ └── index.dart
│ │ ├── member/
│ │ │ ├── archive.dart
│ │ │ ├── article.dart
│ │ │ ├── coin.dart
│ │ │ ├── info.dart
│ │ │ ├── like.dart
│ │ │ ├── seasons.dart
│ │ │ └── tags.dart
│ │ ├── model_hot_video_item.dart
│ │ ├── model_owner.dart
│ │ ├── model_rec_video_item.dart
│ │ ├── msg/
│ │ │ ├── account.dart
│ │ │ ├── like.dart
│ │ │ ├── reply.dart
│ │ │ ├── session.dart
│ │ │ └── system.dart
│ │ ├── read/
│ │ │ ├── opus.dart
│ │ │ └── read.dart
│ │ ├── search/
│ │ │ ├── all.dart
│ │ │ ├── hot.dart
│ │ │ ├── result.dart
│ │ │ └── suggest.dart
│ │ ├── user/
│ │ │ ├── black.dart
│ │ │ ├── fav_detail.dart
│ │ │ ├── fav_folder.dart
│ │ │ ├── history.dart
│ │ │ ├── info.dart
│ │ │ ├── info.g.dart
│ │ │ ├── stat.dart
│ │ │ ├── sub_detail.dart
│ │ │ └── sub_folder.dart
│ │ ├── video/
│ │ │ ├── ai.dart
│ │ │ ├── later.dart
│ │ │ ├── play/
│ │ │ │ ├── ao_output.dart
│ │ │ │ ├── quality.dart
│ │ │ │ └── url.dart
│ │ │ ├── reply/
│ │ │ │ ├── config.dart
│ │ │ │ ├── content.dart
│ │ │ │ ├── data.dart
│ │ │ │ ├── emote.dart
│ │ │ │ ├── item.dart
│ │ │ │ ├── member.dart
│ │ │ │ ├── page.dart
│ │ │ │ ├── top_replies.dart
│ │ │ │ └── upper.dart
│ │ │ └── subTitile/
│ │ │ ├── content.dart
│ │ │ └── result.dart
│ │ └── video_detail_res.dart
│ ├── pages/
│ │ ├── about/
│ │ │ └── index.dart
│ │ ├── bangumi/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── introduction/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ ├── view.dart
│ │ │ │ └── widgets/
│ │ │ │ └── intro_detail.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── bangumi_panel.dart
│ │ │ └── bangumu_card_v.dart
│ │ ├── blacklist/
│ │ │ └── index.dart
│ │ ├── danmaku/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── dlna/
│ │ │ └── index.dart
│ │ ├── dynamics/
│ │ │ ├── controller.dart
│ │ │ ├── detail/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ └── view.dart
│ │ │ ├── index.dart
│ │ │ ├── up_dynamic/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ ├── route_panel.dart
│ │ │ │ └── view.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── action_panel.dart
│ │ │ ├── additional_panel.dart
│ │ │ ├── article_panel.dart
│ │ │ ├── author_panel.dart
│ │ │ ├── content_panel.dart
│ │ │ ├── dynamic_panel.dart
│ │ │ ├── forward_panel.dart
│ │ │ ├── live_panel.dart
│ │ │ ├── live_rcmd_panel.dart
│ │ │ ├── pic_panel.dart
│ │ │ ├── rich_node_panel.dart
│ │ │ ├── up_panel.dart
│ │ │ └── video_panel.dart
│ │ ├── emote/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── fan/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── fan_item.dart
│ │ ├── fav/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── item.dart
│ │ ├── fav_detail/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widget/
│ │ │ └── fav_video_card.dart
│ │ ├── fav_edit/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── fav_search/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── follow/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── follow_item.dart
│ │ │ ├── follow_list.dart
│ │ │ └── owner_follow_list.dart
│ │ ├── follow_search/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── history/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── item.dart
│ │ ├── history_search/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── home/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── app_bar.dart
│ │ ├── hot/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── html/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── later/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── live/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── live_item.dart
│ │ ├── live_room/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── bottom_control.dart
│ │ ├── login/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── main/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── media/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── member/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── conis.dart
│ │ │ ├── like.dart
│ │ │ ├── profile.dart
│ │ │ └── seasons.dart
│ │ ├── member_archive/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── member_article/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── member_coin/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── item.dart
│ │ ├── member_dynamics/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── member_like/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── item.dart
│ │ ├── member_search/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── member_seasons/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── item.dart
│ │ ├── message/
│ │ │ ├── at/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ └── view.dart
│ │ │ ├── like/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ └── view.dart
│ │ │ ├── reply/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ └── view.dart
│ │ │ └── system/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── mine/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── opus/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── text_helper.dart
│ │ │ └── view.dart
│ │ ├── rank/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── zone/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── rcmd/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── read/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── search/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── hot_keyword.dart
│ │ │ └── search_text.dart
│ │ ├── search_panel/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── article_panel.dart
│ │ │ ├── live_panel.dart
│ │ │ ├── media_bangumi_panel.dart
│ │ │ ├── user_panel.dart
│ │ │ └── video_panel.dart
│ │ ├── search_result/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── setting/
│ │ │ ├── controller.dart
│ │ │ ├── extra_setting.dart
│ │ │ ├── index.dart
│ │ │ ├── pages/
│ │ │ │ ├── action_menu_set.dart
│ │ │ │ ├── color_select.dart
│ │ │ │ ├── display_mode.dart
│ │ │ │ ├── font_size_select.dart
│ │ │ │ ├── home_tabbar_set.dart
│ │ │ │ ├── logs.dart
│ │ │ │ ├── navigation_bar_set.dart
│ │ │ │ ├── play_gesture_set.dart
│ │ │ │ └── play_speed_set.dart
│ │ │ ├── play_setting.dart
│ │ │ ├── privacy_setting.dart
│ │ │ ├── recommend_setting.dart
│ │ │ ├── style_setting.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── select_dialog.dart
│ │ │ ├── select_item.dart
│ │ │ ├── slide_dialog.dart
│ │ │ └── switch_item.dart
│ │ ├── subscription/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── item.dart
│ │ ├── subscription_detail/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widget/
│ │ │ └── sub_video_card.dart
│ │ ├── video/
│ │ │ ├── README.md
│ │ │ └── detail/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── introduction/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ ├── view.dart
│ │ │ │ └── widgets/
│ │ │ │ ├── action_item.dart
│ │ │ │ ├── action_row_item.dart
│ │ │ │ ├── fav_panel.dart
│ │ │ │ ├── group_panel.dart
│ │ │ │ ├── intro_detail.dart
│ │ │ │ ├── menu_row.dart
│ │ │ │ ├── page_panel.dart
│ │ │ │ ├── season_panel.dart
│ │ │ │ └── staff_up_item.dart
│ │ │ ├── related/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ └── view.dart
│ │ │ ├── reply/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ ├── view.dart
│ │ │ │ └── widgets/
│ │ │ │ ├── reply_item.dart
│ │ │ │ ├── reply_save.dart
│ │ │ │ └── zan.dart
│ │ │ ├── reply_new/
│ │ │ │ ├── index.dart
│ │ │ │ ├── toolbar_icon_button.dart
│ │ │ │ └── view.dart
│ │ │ ├── reply_reply/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ └── view.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── ai_detail.dart
│ │ │ ├── app_bar.dart
│ │ │ ├── expandable_section.dart
│ │ │ ├── header_control.dart
│ │ │ ├── right_drawer.dart
│ │ │ └── watch_later_list.dart
│ │ ├── webview/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── whisper/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ └── whisper_detail/
│ │ ├── controller.dart
│ │ ├── index.dart
│ │ ├── view.dart
│ │ └── widget/
│ │ └── chat_item.dart
│ ├── plugin/
│ │ ├── pl_gallery/
│ │ │ ├── custom_dismissible.dart
│ │ │ ├── hero_dialog_route.dart
│ │ │ ├── index.dart
│ │ │ ├── interactive_viewer_boundary.dart
│ │ │ └── interactiveviewer_gallery.dart
│ │ ├── pl_player/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── models/
│ │ │ │ ├── bottom_control_type.dart
│ │ │ │ ├── bottom_progress_behavior.dart
│ │ │ │ ├── data_source.dart
│ │ │ │ ├── data_status.dart
│ │ │ │ ├── duration.dart
│ │ │ │ ├── fullscreen_mode.dart
│ │ │ │ ├── play_repeat.dart
│ │ │ │ ├── play_speed.dart
│ │ │ │ └── play_status.dart
│ │ │ ├── utils/
│ │ │ │ └── fullscreen.dart
│ │ │ ├── utils.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── app_bar_ani.dart
│ │ │ ├── backward_seek.dart
│ │ │ ├── bottom_control.dart
│ │ │ ├── common_btn.dart
│ │ │ ├── control_bar.dart
│ │ │ ├── forward_seek.dart
│ │ │ └── play_pause_btn.dart
│ │ ├── pl_popup/
│ │ │ └── index.dart
│ │ └── pl_socket/
│ │ └── index.dart
│ ├── router/
│ │ └── app_pages.dart
│ ├── scripts/
│ │ └── build.sh
│ ├── services/
│ │ ├── audio_handler.dart
│ │ ├── audio_session.dart
│ │ ├── disable_battery_opt.dart
│ │ ├── loggeer.dart
│ │ ├── service_locator.dart
│ │ └── shutdown_timer_service.dart
│ └── utils/
│ ├── app_scheme.dart
│ ├── binary_writer.dart
│ ├── cache_manage.dart
│ ├── cookie.dart
│ ├── danmaku.dart
│ ├── data.dart
│ ├── download.dart
│ ├── drawer.dart
│ ├── em.dart
│ ├── event_bus.dart
│ ├── extension.dart
│ ├── feed_back.dart
│ ├── global_data_cache.dart
│ ├── highlight.dart
│ ├── id_utils.dart
│ ├── image_save.dart
│ ├── live.dart
│ ├── login.dart
│ ├── main_stream.dart
│ ├── proxy.dart
│ ├── recommend_filter.dart
│ ├── route_push.dart
│ ├── storage.dart
│ ├── subtitle.dart
│ ├── url_utils.dart
│ ├── utils.dart
│ ├── video_utils.dart
│ └── wbi_sign.dart
├── linux/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── flutter/
│ │ └── CMakeLists.txt
│ ├── main.cc
│ ├── my_application.cc
│ └── my_application.h
├── macos/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── Flutter-Debug.xcconfig
│ │ └── Flutter-Release.xcconfig
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── MainMenu.xib
│ │ ├── Configs/
│ │ │ ├── AppInfo.xcconfig
│ │ │ ├── Debug.xcconfig
│ │ │ ├── Release.xcconfig
│ │ │ └── Warnings.xcconfig
│ │ ├── DebugProfile.entitlements
│ │ ├── Info.plist
│ │ ├── MainFlutterWindow.swift
│ │ └── Release.entitlements
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ └── Runner.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ └── IDEWorkspaceChecks.plist
├── pubspec.yaml
├── test/
│ └── widget_test.dart
├── web/
│ ├── index.html
│ └── manifest.json
└── windows/
├── .gitignore
├── CMakeLists.txt
├── flutter/
│ └── CMakeLists.txt
└── runner/
├── CMakeLists.txt
├── Runner.rc
├── flutter_window.cpp
├── flutter_window.h
├── main.cpp
├── resource.h
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug-反馈.md
================================================
---
name: Bug 反馈
about: 描述你所遇到的bug
title: ''
labels: 问题反馈
assignees: guozhigq
---
### 问题描述
请提供一个清晰而简明的问题描述。
### 复现步骤
请提供复现该问题所需的具体步骤。
### 预期行为
请描述你期望的正确行为或结果。
### 系统信息
请提供关于您的环境的详细信息,包括操作系统、浏览器版本等。
### 相关截图或日志
如果有的话,请提供相关的截图、错误日志或其他有助于解决问题的信息。
================================================
FILE: .github/ISSUE_TEMPLATE/功能请求.md
================================================
---
name: 功能请求
about: 对于功能的一些建议
title: ''
labels: 功能
assignees: guozhigq
---
### 功能描述
请提供对所请求功能的清晰描述。
### 目标
请描述你希望通过这个功能实现的目标。
### 解决方案
如果你有任何关于如何实现这个功能的想法或建议,请在这里提供。
### 其他
请提供已实现该功能或类似功能的应用
================================================
FILE: .github/workflows/beta_ci.yml
================================================
name: Pilipala Beta
on:
workflow_dispatch:
push:
branches:
- "x-main"
paths-ignore:
- "**.md"
- "**.txt"
- ".github/**"
- ".idea/**"
- "!.github/workflows/**"
jobs:
update_version:
name: Read and update version
runs-on: ubuntu-latest
outputs:
# 定义输出变量 version,以便在其他job中引用
new_version: ${{ steps.version.outputs.new_version }}
last_commit: ${{ steps.get-last-commit.outputs.last_commit }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.ref_name }}
fetch-depth: 0
- name: 获取first parent commit次数
id: get-first-parent-commit-count
run: |
version=$(yq e .version pubspec.yaml | cut -d "+" -f 1)
recent_release_tag=$(git tag -l | grep $version | egrep -v "[-|+]" || true)
if [[ "x$recent_release_tag" == "x" ]]; then
echo "当前版本tag不存在,请手动生成tag."
exit 1
fi
git log --oneline --first-parent $recent_release_tag..HEAD
first_parent_commit_count=$(git rev-list --first-parent --count $recent_release_tag..HEAD)
echo "count=$first_parent_commit_count" >> $GITHUB_OUTPUT
- name: 获取最后一次提交
id: get-last-commit
run: |
last_commit=$(git log -1 --pretty="%h %s" --first-parent)
echo "last_commit=$last_commit" >> $GITHUB_OUTPUT
- name: 更新版本号
id: version
run: |
# 读取版本号
VERSION=$(yq e .version pubspec.yaml | cut -d "+" -f 1)
# 获取GitHub Actions的run_number
#RUN_NUMBER=${{ github.run_number }}
# 构建新版本号
NEW_VERSION=$VERSION-beta.${{ steps.get-first-parent-commit-count.outputs.count }}
# 输出新版本号
echo "New version: $NEW_VERSION"
# 设置新版本号为输出变量
echo "new_version=$NEW_VERSION" >>$GITHUB_OUTPUT
android:
name: Build CI (Android)
needs: update_version
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.ref_name }}
- name: 构建Java环境
uses: actions/setup-java@v3
with:
distribution: "zulu"
java-version: "17"
token: ${{secrets.GIT_TOKEN}}
- name: 检查缓存
uses: actions/cache@v2
id: cache-flutter
with:
path: /root/flutter-sdk
key: ${{ runner.os }}-flutter-${{ hashFiles('**/pubspec.lock') }}
- name: 安装Flutter
if: steps.cache-flutter.outputs.cache-hit != 'true'
uses: subosito/flutter-action@v2
with:
flutter-version: 3.19.6
channel: any
- name: 下载项目依赖
run: flutter pub get
- name: 解码生成 jks
run: echo $KEYSTORE_BASE64 | base64 -di > android/app/vvex.jks
env:
KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}
- name: 更新版本号
id: version
run: |
# 更新pubspec.yaml文件中的版本号
sed -i "s/version: .*+/version: ${{ needs.update_version.outputs.new_version }}+/g" pubspec.yaml
- name: flutter build apk
run: flutter build apk --release --split-per-abi
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD}}
- name: 重命名应用
run: |
for file in build/app/outputs/flutter-apk/app-*.apk; do
if [[ $file =~ app-(.?*)release.apk ]]; then
new_file_name="build/app/outputs/flutter-apk/Pili-${BASH_REMATCH[1]}v${{ needs.update_version.outputs.new_version }}.apk"
mv "$file" "$new_file_name"
fi
done
- name: 上传
uses: actions/upload-artifact@v3
with:
name: Pilipala-Beta
path: |
build/app/outputs/flutter-apk/Pili-*.apk
iOS:
name: Build CI (iOS)
needs: update_version
runs-on: macos-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.ref_name }}
- name: 安装Flutter
if: steps.cache-flutter.outputs.cache-hit != 'true'
uses: subosito/flutter-action@v2.10.0
with:
cache: true
flutter-version: 3.16.5
- name: 更新版本号
id: version
run: |
# 更新pubspec.yaml文件中的版本号
sed -i "" "s/version: .*+/version: ${{ needs.update_version.outputs.new_version }}+/g" pubspec.yaml
- name: flutter build ipa
run: |
flutter build ios --release --no-codesign
ln -sf ./build/ios/iphoneos Payload
zip -r9 app.ipa Payload/runner.app
- name: 重命名应用
run: |
DATE=${{ steps.date.outputs.date }}
for file in app.ipa; do
new_file_name="build/Pili-v${{ needs.update_version.outputs.new_version }}.ipa"
mv "$file" "$new_file_name"
done
- name: 上传
uses: actions/upload-artifact@v3
with:
if-no-files-found: error
name: Pilipala-Beta
path: |
build/Pili-*.ipa
upload:
runs-on: ubuntu-latest
needs:
- update_version
- android
- iOS
steps:
- uses: actions/download-artifact@v3
with:
name: Pilipala-Beta
path: ./Pilipala-Beta
- name: 发送到Telegram频道
uses: xireiki/channel-post@v1.0.7
with:
bot_token: ${{ secrets.BOT_TOKEN }}
chat_id: ${{ secrets.CHAT_ID }}
large_file: true
api_id: ${{ secrets.TELEGRAM_API_ID }}
api_hash: ${{ secrets.TELEGRAM_API_HASH }}
method: sendFile
path: Pilipala-Beta/*
parse_mode: Markdown
context: "*Beta版本: v${{ needs.update_version.outputs.new_version }}*\n更新内容: [${{ needs.update_version.outputs.last_commit }}]"
================================================
FILE: .github/workflows/release_ci.yml
================================================
name: Pilipala Release
# action事件触发
on:
push:
# push tag时触发
tags:
- "v*.*.*"
# 可以有多个jobs
jobs:
android:
# 运行环境 ubuntu-latest window-latest mac-latest
runs-on: ubuntu-latest
# 每个jobs中可以有多个steps
steps:
- name: 代码迁出
uses: actions/checkout@v3
- name: 构建Java环境
uses: actions/setup-java@v3
with:
distribution: "zulu"
java-version: "17"
token: ${{secrets.GIT_TOKEN}}
- name: 检查缓存
uses: actions/cache@v2
id: cache-flutter
with:
path: /root/flutter-sdk # Flutter SDK 的路径
key: ${{ runner.os }}-flutter-${{ hashFiles('**/pubspec.lock') }}
- name: 安装Flutter
if: steps.cache-flutter.outputs.cache-hit != 'true'
uses: subosito/flutter-action@v2
with:
flutter-version: 3.19.6
channel: any
- name: 下载项目依赖
run: flutter pub get
- name: 解码生成 jks
run: echo $KEYSTORE_BASE64 | base64 -di > android/app/vvex.jks
env:
KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}
- name: flutter build apk
run: flutter build apk --release --split-per-abi
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD}}
- name: flutter build apk
run: flutter build apk --release
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD}}
- name: 获取版本号
id: version
run: echo "version=${GITHUB_REF#refs/tags/v}" >>$GITHUB_OUTPUT
# - name: 获取当前日期
# id: date
# run: echo "date=$(date +'%m%d')" >>$GITHUB_OUTPUT
- name: 重命名应用
run: |
# DATE=${{ steps.date.outputs.date }}
for file in build/app/outputs/flutter-apk/app-*.apk; do
if [[ $file =~ app-(.?*)release.apk ]]; then
new_file_name="build/app/outputs/flutter-apk/Pili-${BASH_REMATCH[1]}${{ steps.version.outputs.version }}.apk"
mv "$file" "$new_file_name"
fi
done
- name: 上传
uses: actions/upload-artifact@v3
with:
name: Pilipala-Release
path: |
build/app/outputs/flutter-apk/Pili-*.apk
iOS:
runs-on: macos-latest
steps:
- name: 代码迁出
uses: actions/checkout@v4
- name: 安装Flutter
if: steps.cache-flutter.outputs.cache-hit != 'true'
uses: subosito/flutter-action@v2.10.0
with:
cache: true
flutter-version: 3.19.6
- name: flutter build ipa
run: |
flutter build ios --release --no-codesign
ln -sf ./build/ios/iphoneos Payload
zip -r9 app.ipa Payload/runner.app
- name: 获取版本号
id: version
run: echo "version=${GITHUB_REF#refs/tags/v}" >>$GITHUB_OUTPUT
- name: 重命名应用
run: |
DATE=${{ steps.date.outputs.date }}
for file in app.ipa; do
new_file_name="build/Pili-${{ steps.version.outputs.version }}.ipa"
mv "$file" "$new_file_name"
done
- name: 上传
uses: actions/upload-artifact@v3
with:
if-no-files-found: error
name: Pilipala-Release
path: |
build/Pili-*.ipa
upload:
runs-on: ubuntu-latest
needs:
- android
- iOS
steps:
- uses: actions/download-artifact@v3
with:
name: Pilipala-Release
path: ./Pilipala-Release
- name: Install dependencies
run: sudo apt-get install tree -y
- name: Get version
id: version
run: echo "version=${GITHUB_REF#refs/tags/v}" >>$GITHUB_OUTPUT
- name: Upload Release
uses: ncipollo/release-action@v1
with:
name: v${{ steps.version.outputs.version }}
token: ${{ secrets.GIT_TOKEN }}
omitBodyDuringUpdate: true
omitNameDuringUpdate: true
omitPrereleaseDuringUpdate: true
allowUpdates: true
artifacts: Pilipala-Release/*
================================================
FILE: .gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter repo-specific
/bin/cache/
/bin/internal/bootstrap.bat
/bin/internal/bootstrap.sh
/bin/mingit/
/dev/benchmarks/mega_gallery/
/dev/bots/.recipe_deps
/dev/bots/android_tools/
/dev/devicelab/ABresults*.json
/dev/docs/doc/
/dev/docs/api_docs.zip
/dev/docs/flutter.docs.zip
/dev/docs/lib/
/dev/docs/pubspec.yaml
/dev/integration_tests/**/xcuserdata
/dev/integration_tests/**/Pods
/packages/flutter/coverage/
version
analysis_benchmark.json
# packages file containing multi-root paths
.packages.generated
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/
flutter_*.png
linked_*.ds
unlinked.ds
unlinked_spec.ds
# Obfuscation related
app.*.map.json
# Android related
**/android/**/gradle-wrapper.jar
.gradle/
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java
**/android/key.properties
*.jks
# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/.last_build_id
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Flutter.podspec
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/ephemeral
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/Flutter/flutter_export_environment.sh
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*
# macOS
**/Flutter/ephemeral/
**/Pods/
**/macos/Flutter/GeneratedPluginRegistrant.swift
**/macos/Flutter/ephemeral
**/xcuserdata/
# Windows
**/windows/flutter/generated_plugin_registrant.cc
**/windows/flutter/generated_plugin_registrant.h
**/windows/flutter/generated_plugins.cmake
# Linux
**/linux/flutter/generated_plugin_registrant.cc
**/linux/flutter/generated_plugin_registrant.h
**/linux/flutter/generated_plugins.cmake
# Coverage
coverage/
# Symbols
app.*.symbols
# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
!/dev/ci/**/Gemfile.lock
!.vscode/settings.json
================================================
FILE: .metadata
================================================
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled.
version:
revision: 4b12645012342076800eb701bcdfe18f87da21cf
channel: stable
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 4b12645012342076800eb701bcdfe18f87da21cf
base_revision: 4b12645012342076800eb701bcdfe18f87da21cf
- platform: android
create_revision: 4b12645012342076800eb701bcdfe18f87da21cf
base_revision: 4b12645012342076800eb701bcdfe18f87da21cf
- platform: ios
create_revision: 4b12645012342076800eb701bcdfe18f87da21cf
base_revision: 4b12645012342076800eb701bcdfe18f87da21cf
- platform: linux
create_revision: 4b12645012342076800eb701bcdfe18f87da21cf
base_revision: 4b12645012342076800eb701bcdfe18f87da21cf
- platform: macos
create_revision: 4b12645012342076800eb701bcdfe18f87da21cf
base_revision: 4b12645012342076800eb701bcdfe18f87da21cf
- platform: web
create_revision: 4b12645012342076800eb701bcdfe18f87da21cf
base_revision: 4b12645012342076800eb701bcdfe18f87da21cf
- platform: windows
create_revision: 4b12645012342076800eb701bcdfe18f87da21cf
base_revision: 4b12645012342076800eb701bcdfe18f87da21cf
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'
================================================
FILE: .vscode/launch.json
================================================
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "pilipala",
"request": "launch",
"type": "dart"
},
{
"name": "pilipala (profile mode)",
"request": "launch",
"type": "dart",
"flutterMode": "profile"
},
{
"name": "pilipala (release mode)",
"request": "launch",
"type": "dart",
"flutterMode": "release"
}
]
}
================================================
FILE: .vscode/settings.json
================================================
{
"editor.formatOnSave": true,
"[dart]": {
"editor.formatOnType": true
}
}
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
<div align="center">
<img width="200" height="200" src="https://github.com/guozhigq/pilipala/blob/main/assets/images/logo/logo_android.png">
</div>
<div align="center">
<h1>PiliPala</h1>
<div align="center">



</div>
<p>使用 Flutter 开发的 BiliBili 第三方客户端</p>
<img src="https://github.com/guozhigq/pilipala/blob/main/assets/screenshots/510shots_so.png" width="32%" alt="home" />
<img src="https://github.com/guozhigq/pilipala/blob/main/assets/screenshots/174shots_so.png" width="32%" alt="home" />
<img src="https://github.com/guozhigq/pilipala/blob/main/assets/screenshots/850shots_so.png" width="32%" alt="home" />
<br/>
<img src="https://github.com/guozhigq/pilipala/blob/main/assets/screenshots/main_screen.png" width="96%" alt="home" />
<br/>
</div>
## 开发环境
Xcode 13.4 不支持 ```auto_orientation```,请注释相关代码
```bash
[✓] Flutter (Channel stable, 3.19.6, on macOS 14.1.2 23B92 darwin-arm64, locale
zh-Hans-CN)
[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 15.1)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2022.3)
[✓] VS Code (version 1.87.2)
[✓] Connected device (3 available)
[✓] Network resources
```
## 技术交流
Telegram: [https://t.me/+1DFtqS6usUM5MDNl](https://t.me/+1DFtqS6usUM5MDNl)
Telegram Beta 版本:@PiliPala_Beta
QQ 频道: https://pd.qq.com/s/365esodk3
## 功能
目前着重移动端 (Android、iOS),暂时没有适配桌面端、Pad 端、手表端等
现有功能及[开发计划](https://github.com/users/guozhigq/projects/5)
- [x] 推荐视频列表 (app 端)
- [x] 最热视频列表
- [x] 热门直播
- [x] 番剧列表
- [x] 屏蔽黑名单内用户视频
- [x] 排行榜
- [x] 用户相关
- [x] 粉丝、关注用户、拉黑用户查看
- [x] 用户主页查看
- [x] 关注/取关用户
- [ ] 离线缓存
- [x] 稍后再看
- [x] 观看记录
- [x] 我的收藏
- [x] 黑名单管理
- [x] 动态相关
- [x] 全部、投稿、番剧分类查看
- [x] 动态评论查看
- [x] 动态评论回复功能
- [x] 动态未读标记
- [x] 视频播放相关
- [x] 双击快进/快退
- [x] 双击播放/暂停
- [x] 垂直方向调节亮度/音量
- [x] 垂直方向上滑全屏、下滑退出全屏
- [x] 水平方向手势快进/快退
- [x] 全屏方向设置
- [x] 倍速选择/长按 2 倍速
- [x] 硬件加速 (视机型而定)
- [x] 画质选择 (高清画质未解锁)
- [x] 音质选择 (视视频而定)
- [x] 解码格式选择 (视视频而定)
- [x] 弹幕
- [x] 字幕
- [x] 记忆播放
- [x] 视频比例:高度/宽度适应、填充、包含等
- [x] 视频快照
- [x] 直播弹幕
- [x] 搜索相关
- [x] 热搜
- [x] 搜索历史
- [x] 默认搜索词
- [x] 投稿、番剧、直播间、用户搜索
- [x] 视频搜索排序、按时长筛选
- [x] 视频详情页相关
- [x] 视频选集 (分 p) 切换
- [x] 点赞、投币、收藏/取消收藏
- [x] 相关视频查看
- [x] 评论用户身份标识
- [x] 评论 (排序) 查看、二楼评论查看
- [x] 主楼、二楼评论/表情回复功能
- [x] 评论点赞
- [x] 评论笔记图片查看、保存
- [x] 设置相关
- [x] 画质、音质、解码方式预设
- [x] 图片质量设定
- [x] 主题模式:亮色/暗色/跟随系统
- [x] 震动反馈 (可选)
- [x] 高帧率
- [x] 自动全屏
- [ ] 等等
## 下载
可以通过右侧 Releases 进行下载或拉取代码到本地进行编译
### 从 F-Droid 安装
<a href="https://f-droid.org/packages/com.guozhigq.pilipala">
<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on-zh-cn.png"
alt="Get it on F-Droid"
height="80">
</a>
## 声明
此项目 (PiliPala) 是个人为了兴趣而开发, 仅用于学习和测试。
所用 API 皆从官方网站收集, 不提供任何破解内容。
感谢使用
## 致谢
- [bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect)
- [flutter_meedu_videoplayer](https://github.com/zezo357/flutter_meedu_videoplayer)
- [media-kit](https://github.com/media-kit/media-kit)
- [dio](https://pub.dev/packages/dio)
- 等等
================================================
FILE: analysis_options.yaml
================================================
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at
# https://dart-lang.github.io/linter/lints/index.html.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
================================================
FILE: android/.gitignore
================================================
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
**/*.keystore
**/*.jks
================================================
FILE: android/app/build.gradle
================================================
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
def keystorePropertiesFile = rootProject.file('key.properties')
def keystoreProperties = new Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
def _storeFile = file(System.getenv("KEYSTORE") ?: keystoreProperties["storeFile"] ?: "vvex.jks")
def _storePassword = System.getenv("KEYSTORE_PASSWORD") ?: keystoreProperties["storePassword"]
def _keyAlias = System.getenv("KEY_ALIAS") ?: keystoreProperties["keyAlias"]
def _keyPassword = System.getenv("KEY_PASSWORD") ?: keystoreProperties["keyPassword"]
android {
compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.guozhigq.pilipala"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
minSdkVersion 21
multiDexEnabled true
}
signingConfigs {
// 添加签名配置
release {
// 配置密钥库文件的位置、别名、密码等信息
storeFile _storeFile
storePassword _storePassword
keyAlias _keyAlias
keyPassword _keyPassword
v1SigningEnabled true
v2SigningEnabled true
}
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.release
}
}
}
flutter {
source '../..'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
ext.abiCodes = ["x86_64": 1, "armeabi-v7a": 2, "arm64-v8a": 3]
import com.android.build.OutputFile
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def abiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
if (abiVersionCode != null) {
output.versionCodeOverride = variant.versionCode * 10 + abiVersionCode
}
}
}
================================================
FILE: android/app/src/debug/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.guozhigq.pilipala">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
================================================
FILE: android/app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.guozhigq.pilipala">
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
</intent>
<!-- If your app opens https URLs -->
<intent>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
</intent>
</queries>
<queries>
<intent>
<action android:name=
"android.support.customtabs.action.CustomTabsService" />
</intent>
</queries>
<queries>
<!-- If your app checks for http support -->
<intent>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
</intent>
<intent>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
</intent>
</queries>
<application
android:label="PiliPala"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
xmlns:tools="http://schemas.android.com/tools"
android:enableOnBackInvokedCallback="true"
android:allowBackup="false"
android:fullBackupContent="false"
tools:replace="android:allowBackup">
<activity
android:name="com.guozhigq.pilipala.MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
android:supportsPictureInPicture="true"
android:resizeableActivity="true"
>
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="bilibili" android:host="forward" />
<data android:scheme="bilibili" android:host="comment"
android:pathPattern="/detail/.*/.*/.*" />
<data android:scheme="bilibili" android:host="uper" />
<data android:scheme="bilibili" android:host="article"
android:pathPattern="/readlist" />
<data android:scheme="bilibili" android:host="advertise" android:path="/home" />
<data android:scheme="bilibili" android:host="clip" />
<data android:scheme="bilibili" android:host="search" />
<data android:scheme="bilibili" android:host="stardust-search" />
<data android:scheme="bilibili" android:host="music" />
<data android:scheme="bilibili" android:host="bangumi"
android:pathPattern="/season.*" />
<data android:scheme="bilibili" android:host="bangumi" android:pathPattern="/.*" />
<data android:scheme="bilibili" android:host="pictureshow"
android:pathPrefix="/creative_center" />
<data android:scheme="bilibili" android:host="cliparea" />
<data android:scheme="bilibili" android:host="im" />
<data android:scheme="bilibili" android:host="im" android:path="/notifications" />
<data android:scheme="bilibili" android:host="following" />
<data android:scheme="bilibili" android:host="following"
android:pathPattern="/detail/.*" />
<data android:scheme="bilibili" android:host="following"
android:path="/publishInfo/" />
<data android:scheme="bilibili" android:host="laser" android:pathPattern="/.*" />
<data android:scheme="bilibili" android:host="livearea" />
<data android:scheme="bilibili" android:host="live" />
<data android:scheme="bilibili" android:host="catalog" />
<data android:scheme="bilibili" android:host="browser" />
<data android:scheme="bilibili" android:host="user_center" />
<data android:scheme="bilibili" android:host="login" />
<data android:scheme="bilibili" android:host="space" />
<data android:scheme="bilibili" android:host="author" />
<data android:scheme="bilibili" android:host="tag" />
<data android:scheme="bilibili" android:host="rank" />
<data android:scheme="bilibili" android:host="external" />
<data android:scheme="bilibili" android:host="blank" />
<data android:scheme="bilibili" android:host="home" />
<data android:scheme="bilibili" android:host="root" />
<data android:scheme="bilibili" android:host="video" />
<data android:scheme="bilibili" android:host="story" />
<data android:scheme="bilibili" android:host="podcast" />
<data android:scheme="bilibili" android:host="search" />
<data android:scheme="bilibili" android:host="main" android:path="/favorite" />
<data android:scheme="bilibili" android:host="pgc" android:path="/theater/match" />
<data android:scheme="bilibili" android:host="pgc" android:path="/theater/square" />
<data android:scheme="bilibili" android:host="m.bilibili.com"
android:path="/topic-detail" />
<data android:scheme="bilibili" android:host="article" />
<data android:scheme="bilibili" android:host="pegasus"
android:pathPattern="/channel/v2/.*" />
<data android:scheme="bilibili" android:host="feed" android:pathPattern="/channel" />
<data android:scheme="bilibili" android:host="vip" />
<data android:scheme="bilibili" android:host="user_center" android:path="/vip" />
<data android:scheme="bilibili" android:host="history" />
<data android:scheme="bilibili" android:host="charge" android:path="/rank" />
<data android:scheme="bilibili" android:host="assistant" />
<data android:scheme="bilibili" android:host="assistant" />
<data android:scheme="bilibili" android:host="feedback" />
<data android:scheme="bilibili" android:host="auth" android:path="/launch" />
<data android:scheme="http" android:host="live.bilibili.com"
android:pathPattern="/live/.*" />
<data android:scheme="https" android:host="live.bilibili.com"
android:pathPattern="/live/.*" />
<data android:scheme="http" android:host="www.bilibili.com"
android:pathPattern="/video/.*" />
<data android:scheme="https" android:host="www.bilibili.com"
android:pathPattern="/video/.*" />
<data android:scheme="http" android:host="www.bilibili.tv"
android:pathPattern="/video/.*" />
<data android:scheme="https" android:host="www.bilibili.tv"
android:pathPattern="/video/.*" />
<data android:scheme="http" android:host="www.bilibili.cn"
android:pathPattern="/video/.*" />
<data android:scheme="https" android:host="www.bilibili.cn"
android:pathPattern="/video/.*" />
<data android:scheme="http" android:host="www.bilibili.com"
android:pathPattern="/mobile/video/.*" />
<data android:scheme="https" android:host="www.bilibili.com"
android:pathPattern="/mobile/video/.*" />
<data android:scheme="http" android:host="m.bilibili.com"
android:pathPattern="/video/.*" />
<data android:scheme="https" android:host="m.bilibili.com"
android:pathPattern="/video/.*" />
<data android:scheme="http" android:host="www.bilibili.com"
android:pathPattern="/story/.*" />
<data android:scheme="https" android:host="www.bilibili.com"
android:pathPattern="/story/.*" />
<data android:scheme="http" android:host="www.bilibili.com"
android:pathPattern="/bangumi/i/.*" />
<data android:scheme="https" android:host="www.bilibili.com"
android:pathPattern="/bangumi/i/.*" />
<data android:scheme="http" android:host="www.bilibili.com"
android:pathPattern="/mobile/bangumi/i/.*" />
<data android:scheme="https" android:host="www.bilibili.com"
android:pathPattern="/mobile/bangumi/i/.*" />
<data android:scheme="http" android:host="bangumi.bilibili.com"
android:pathPattern="/.*" />
<data android:scheme="https" android:host="bangumi.bilibili.com"
android:pathPattern="/.*" />
<data android:scheme="http" android:host="www.bilibili.com"
android:pathPattern="/bangumi/.*" />
<data android:scheme="https" android:host="www.bilibili.com"
android:pathPattern="/bangumi/.*" />
<data android:scheme="http" android:host="m.bilibili.com"
android:pathPattern="/bangumi/.*" />
<data android:scheme="https" android:host="m.bilibili.com"
android:pathPattern="/bangumi/.*" />
<data android:scheme="http" android:host="www.bilibili.com"
android:pathPattern="/cheese/play/ss.*" />
<data android:scheme="https" android:host="www.bilibili.com"
android:pathPattern="/cheese/play/ss.*" />
<data android:scheme="http" android:host="www.bilibili.com"
android:pathPattern="/cheese/play/ep.*" />
<data android:scheme="https" android:host="www.bilibili.com"
android:pathPattern="/cheese/play/ep.*" />
<data android:scheme="http" android:host="m.bilibili.com"
android:pathPattern="/bangumi/play/ss.*" />
<data android:scheme="https" android:host="m.bilibili.com"
android:pathPattern="/cheese/play/ss.*" />
<data android:scheme="http" android:host="m.bilibili.com"
android:pathPattern="/cheese/play/ep.*" />
<data android:scheme="https" android:host="m.bilibili.com"
android:pathPattern="/cheese/play/ep.*" />
<data android:scheme="http" android:host="www.bilibili.com"
android:pathPattern="/read/cv.*" />
<data android:scheme="https" android:host="www.bilibili.com"
android:pathPattern="/read/cv.*" />
<data android:scheme="http" android:host="www.bilibili.com" android:path="/review/" />
<data android:scheme="https" android:host="www.bilibili.com" android:path="/review/" />
<data android:scheme="http" android:host="bilibili.cn"
android:pathPattern="/video/.*" />
<data android:scheme="https" android:host="bilibili.cn"
android:pathPattern="/video/.*" />
<data android:scheme="http" android:host="bilibili.com"
android:pathPattern="/video/.*" />
<data android:scheme="https" android:host="bilibili.com"
android:pathPattern="/video/.*" />
<data android:scheme="http" android:host="www.bilibili.cn"
android:pathPattern="/video/.*" />
<data android:scheme="https" android:host="www.bilibili.cn"
android:pathPattern="/video/.*" />
<data android:scheme="http" android:host="www.bilibili.com"
android:pathPattern="/video/.*" />
<data android:scheme="https" android:host="www.bilibili.com"
android:pathPattern="/video/.*" />
<data android:scheme="http" android:host="www.bilibili.com"
android:pathPattern="/mobile/video/.*" />
<data android:scheme="https" android:host="www.bilibili.com"
android:pathPattern="/mobile/video/.*" />
<data android:scheme="https" android:host="b23.tv"
android:pathPattern="/*" />
<data android:scheme="https" android:host="space.bilibili.com"
android:pathPattern="/*" />
</intent-filter>
</activity>
<service
android:name="com.ryanheise.audioservice.AudioService"
android:foregroundServiceType="mediaPlayback"
android:exported="true"
tools:ignore="Instantiatable">
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService" />
</intent-filter>
</service>
<receiver
android:name="com.ryanheise.audioservice.MediaButtonReceiver"
android:exported="true"
tools:ignore="Instantiatable">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<!--
Media access permissions.
Android 13 or higher.
https://developer.android.com/about/versions/13/behavior-changes-13#granular-media-permissions
-->
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
</manifest>
================================================
FILE: android/app/src/main/kotlin/com/guozhigq/pilipala/MainActivity.kt
================================================
package com.guozhigq.pilipala
// import io.flutter.embedding.android.FlutterActivity
import com.ryanheise.audioservice.AudioServiceActivity;
class MainActivity: AudioServiceActivity() {
}
================================================
FILE: android/app/src/main/res/drawable/ic_baseline_forward_10_24.xml
================================================
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M18,13c0,3.31 -2.69,6 -6,6s-6,-2.69 -6,-6s2.69,-6 6,-6v4l5,-5l-5,-5v4c-4.42,0 -8,3.58 -8,8c0,4.42 3.58,8 8,8s8,-3.58 8,-8H18z"/>
<path android:fillColor="@android:color/white" android:pathData="M10.86,15.94l0,-4.27l-0.09,0l-1.77,0.63l0,0.69l1.01,-0.31l0,3.26z"/>
<path android:fillColor="@android:color/white" android:pathData="M12.25,13.44v0.74c0,1.9 1.31,1.82 1.44,1.82c0.14,0 1.44,0.09 1.44,-1.82v-0.74c0,-1.9 -1.31,-1.82 -1.44,-1.82C13.55,11.62 12.25,11.53 12.25,13.44zM14.29,13.32v0.97c0,0.77 -0.21,1.03 -0.59,1.03c-0.38,0 -0.6,-0.26 -0.6,-1.03v-0.97c0,-0.75 0.22,-1.01 0.59,-1.01C14.07,12.3 14.29,12.57 14.29,13.32z"/>
</vector>
================================================
FILE: android/app/src/main/res/drawable/ic_baseline_replay_10_24.xml
================================================
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M11.99,5V1l-5,5l5,5V7c3.31,0 6,2.69 6,6s-2.69,6 -6,6s-6,-2.69 -6,-6h-2c0,4.42 3.58,8 8,8s8,-3.58 8,-8S16.41,5 11.99,5z"/>
<path android:fillColor="@android:color/white" android:pathData="M10.89,16h-0.85v-3.26l-1.01,0.31v-0.69l1.77,-0.63h0.09V16z"/>
<path android:fillColor="@android:color/white" android:pathData="M15.17,14.24c0,0.32 -0.03,0.6 -0.1,0.82s-0.17,0.42 -0.29,0.57s-0.28,0.26 -0.45,0.33s-0.37,0.1 -0.59,0.1s-0.41,-0.03 -0.59,-0.1s-0.33,-0.18 -0.46,-0.33s-0.23,-0.34 -0.3,-0.57s-0.11,-0.5 -0.11,-0.82V13.5c0,-0.32 0.03,-0.6 0.1,-0.82s0.17,-0.42 0.29,-0.57s0.28,-0.26 0.45,-0.33s0.37,-0.1 0.59,-0.1s0.41,0.03 0.59,0.1c0.18,0.07 0.33,0.18 0.46,0.33s0.23,0.34 0.3,0.57s0.11,0.5 0.11,0.82V14.24zM14.32,13.38c0,-0.19 -0.01,-0.35 -0.04,-0.48s-0.07,-0.23 -0.12,-0.31s-0.11,-0.14 -0.19,-0.17s-0.16,-0.05 -0.25,-0.05s-0.18,0.02 -0.25,0.05s-0.14,0.09 -0.19,0.17s-0.09,0.18 -0.12,0.31s-0.04,0.29 -0.04,0.48v0.97c0,0.19 0.01,0.35 0.04,0.48s0.07,0.24 0.12,0.32s0.11,0.14 0.19,0.17s0.16,0.05 0.25,0.05s0.18,-0.02 0.25,-0.05s0.14,-0.09 0.19,-0.17s0.09,-0.19 0.11,-0.32s0.04,-0.29 0.04,-0.48V13.38z"/>
</vector>
================================================
FILE: android/app/src/main/res/drawable/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
================================================
FILE: android/app/src/main/res/drawable-v21/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
================================================
FILE: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
================================================
FILE: android/app/src/main/res/raw/keep.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@drawable/*" />
================================================
FILE: android/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#ffffff</color>
</resources>
================================================
FILE: android/app/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
<item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="o_mr1">shortEdges</item>
</style>
</resources>
================================================
FILE: android/app/src/main/res/values-night/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>
================================================
FILE: android/app/src/profile/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.guozhigq.pilipala">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
================================================
FILE: android/build.gradle
================================================
buildscript {
ext.kotlin_version = '1.9.0'
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}
================================================
FILE: android/gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
================================================
FILE: android/gradle.properties
================================================
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
================================================
FILE: android/settings.gradle
================================================
include ':app'
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()
assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
================================================
FILE: assets/loading.json
================================================
{"v":"5.7.11","fr":60,"ip":0,"op":81,"w":1920,"h":1080,"nm":"Loading Dots","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Dot4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[25]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[100]},{"t":55,"s":[25]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":25,"s":[1142,540,0],"to":[0,-6.667,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":39,"s":[1142,500,0],"to":[0,0,0],"ti":[0,-6.667,0]},{"t":55,"s":[1142,540,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-284,92,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":25,"s":[50,50,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":39,"s":[75,75,100]},{"t":55,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[120,120],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.0039,0.6157,0.5686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-284,92],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Dot3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":17,"s":[25]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":31,"s":[100]},{"t":47,"s":[25]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":17,"s":[1022,540,0],"to":[0,-6.667,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[1022,500,0],"to":[0,0,0],"ti":[0,-6.667,0]},{"t":47,"s":[1022,540,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-284,92,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":17,"s":[50,50,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":31,"s":[75,75,100]},{"t":47,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[120,120],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.0039,0.6157,0.5686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-284,92],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Dot2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[25]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":23,"s":[100]},{"t":39,"s":[25]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[902,540,0],"to":[0,-6.667,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":23,"s":[902,500,0],"to":[0,0,0],"ti":[0,0,0]},{"t":39,"s":[902,540,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-284,92,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[50,50,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[75,75,100]},{"t":39,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[120,120],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.0039,0.6157,0.5686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-284,92],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Dot1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[25]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14,"s":[100]},{"t":30,"s":[25]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[782,540,0],"to":[0,-6.667,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[782,500,0],"to":[0,0,0],"ti":[0,-6.667,0]},{"t":30,"s":[782,540,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-284,92,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[50,50,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[75,75,100]},{"t":30,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[120,120],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.0039,0.6157,0.5686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-284,92],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0}],"markers":[]}
================================================
FILE: assets/trail_loading.json
================================================
{"v":"4.6.8","fr":60,"ip":0,"op":106,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 5","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":20,"s":[0],"e":[360]},{"t":110}]},"p":{"a":0,"k":[251,250,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10,10]},"p":{"a":0,"k":[0,-100]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0,0.7294118,1,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":20,"op":620,"st":20,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 4","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":15,"s":[0],"e":[360]},{"t":105}]},"p":{"a":0,"k":[251,250,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,-100]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0,0.7294118,1,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":15,"op":615,"st":15,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 3","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":10,"s":[0],"e":[360]},{"t":100}]},"p":{"a":0,"k":[251,250,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[30,30]},"p":{"a":0,"k":[0,-100]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0,0.7294118,1,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":10,"op":610,"st":10,"bm":0,"sr":1},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":5,"s":[0],"e":[360]},{"t":95}]},"p":{"a":0,"k":[251,250,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[40,40]},"p":{"a":0,"k":[0,-100]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0,0.7294118,1,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":5,"op":605,"st":5,"bm":0,"sr":1},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[360]},{"t":90}]},"p":{"a":0,"k":[250,250,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":0,"s":[50,50],"e":[40,40]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":84,"s":[40,40],"e":[50,50]},{"t":100}]},"p":{"a":0,"k":[0,-100]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0,0.7294118,1,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":600,"st":0,"bm":0,"sr":1}]}
================================================
FILE: change_log/1.0.0.0817.md
================================================
## 1.0.0
### 初始版本
+ 直播、推荐、动态功能
+ 投稿、番剧播放功能
+ 播放器手势支持
+ 画质、音质、解码格式支持
+ 点赞、投币、收藏功能
+ 关注/取关、用户主页功能
+ 评论功能
+ 历史记录、稍后再看功能
================================================
FILE: change_log/1.0.1.0817.md
================================================
## 1.0.1
### 修复
+ 升级播放器依赖
+ android平台 AV1格式视频支持
+ 视频全屏功能
================================================
FILE: change_log/1.0.10.1016.md
================================================
## 1.0.10
### 修复
+ 长按倍速抬起后未恢复默认倍速
================================================
FILE: change_log/1.0.11.1112.md
================================================
## 1.0.11
### 新功能
+ 适配了原生媒体通知栏 @Daydreamer-riri
+ 视频主题图标 @Daydreamer-riri
+ 关闭软件后自动画中画播放
+ UP主分组管理
+ md2样式底栏
+
### 修复
+ 历史记录记忆播放
+ 部分类型视频连播
+ 播放速度选择框不支持返回手势
+ 播放速度选择框不支持返回手势
+ 视频播放速度总是显示1.0X
+ 评论页面计数错误
+ 退出视频还有声音
### 优化
+ 视频加载速度
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.12.1114.md
================================================
## 1.0.12
### 修复
+ iOS端视频播放时没有声音
+ 超过6分钟弹幕不显示
+ 视频详情页网络异常
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.13.1217.md
================================================
## 1.0.13
### 新功能
+ 视频详情页稍后再看
+ 发送弹幕 感谢@orz12
+ 消息展示
+ up主页显示获赞数
+ up主页显示合集
+ 视频详情页「ai总结」增加开关
### 修复
+ 首页推荐问题(需要重新登录)
+ 长按倍速逻辑
+ 视频详情页网络异常
### 优化
+ 设置面板样式 感谢@GuMengYu @KoolShow
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.14.1225.md
================================================
## 1.0.14
圣诞节快乐~ 🎉
大部分内容由@orz12提供,感谢👏
### 修复
+ 全屏弹幕消失
+ iOS全屏/退出全屏视频暂停
+ 个人主页关注状态
+ 视频合集向下滑动UI问题
+ 媒体库滑动底栏不隐藏
+ 个人主页动态加载问题 * 2
+ 未登录状态访问个人主页异常
+ 视频搜索标题特殊字符转义
+ iOS闪退
+ 消息页面夜间模式异常
+ 消息页面含有撤回消息时异常
+ 弹幕速度
### 优化
+ 全屏播放方案优化
+ 弹幕加载逻辑优化
+ 点赞、投币逻辑优化
+ 进度条及播放时间渲染优化
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.15.0101.md
================================================
## 1.0.15
元旦快乐~ 🎉
### 功能
+ 转发动态评论展示
+ 推荐、最热、收藏视频增肌日期显示
### 修复
+ 全屏播放相关问题
+ 评论区@用户展示问题
+ 登录状态闪退问题
+ pip意外触发问题
+ 动态页tab切换样式问题
### 优化
+ 首页默认使用web端推荐
+ 取消iOS路由切换效果
+ 视频分享中添加Up主
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.16.0102.md
================================================
## 1.0.16
### 功能
+ toast 背景支持透明度调节
### 修复
+ web端推荐未展示【已关注】
+ up主动态页异常
+ 未打开自动播放时,视频详情页异常
+ 视频暂停状态取消自动ip
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.17.0125.md
================================================
## 1.0.17
### 功能
+ 视频全屏时隐藏进度条
+ 动态内容增加投稿跳转
+ 未开启自动播放时点击封面播放
+ 弹幕发送标识
+ 定时关闭
+ 推荐视频卡片拉黑up功能
+ 首页tabbar编辑排序
### 修复
+ 连续跳转搜索页未刷新
+ 搜索结果为空时页面异常
+ 评论区链接解析
+ 视频全屏状态栏背景色
+ 私信对话气泡位置
+ 设置up关注分组样式
+ 每次推荐请求数据相同
+ iOS代理网络异常
+ 双击切换播放状态无声
+ 设置自定义倍速白屏
+ 免登录查看1080p
### 优化
+ 首页web端推荐观看数展示
+ 首页web端推荐接口更新
+ 首页样式
+ 搜索页跳转
+ 弹幕资源优化
+ 图片渲染占用内存优化(部分)
+ 两次返回退出应用
+ schame 补充
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.18.0130.md
================================================
## 1.0.18
### 功能
### 修复
### 优化
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.19.0131.md
================================================
## 1.0.19
### 修复
+ 视频404、评论加载错误
+ bvav转换
### 优化
+ 视频详情页内存占用
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.2.0819.md
================================================
## 1.0.2
### 新功能
+ 自动检查更新
+ 封面图片保存
+ 动态跳转番剧
+ 历史记录番剧记忆播放
+ 一键清空稍后再看
### 修复
+ 切换分P cid未切换
+ cookie存储问题
+ 登录/退出登录问题
### 优化
+ 页面空/异常状态样式
+ 退出登录提示
+ 请求节流
+ 全屏播放
================================================
FILE: change_log/1.0.20.0303.md
================================================
## 1.0.20
### 功能
+ 评论区增加表情
+ 首页渐变背景开关
+ 媒体库显示「我的订阅」
+ 评论区链接解析
+ 默认启动页设置
### 修复
+ 评论区内容重复
+ pip相关问题
+ 播放多p视频评论不刷新
+ 视频评论翻页重复
### 优化
+ url scheme优化
+ 图片预览放大
+ 图片加载速度
+ 视频评论区复制
+ 全屏显示视频标题
+ 网络异常处理
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.21.0306.md
================================================
## 1.0.21
### 修复
+ 推荐视频全屏问题
+ 番剧全屏播放时灰屏问题
+ 评论回调导致页面卡死问题
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.22.0430.md
================================================
## 1.0.22
### 功能
+ 字幕
+ 全屏时选集
+ 动态转发
+ 评论视频并转发
+ 收藏夹删除
+ 合集显示封面
+ 底部导航栏编辑、排序功能
+ 历史记录进度条展示
+ 直播画质切换
+ 排行榜功能
+ 视频详情页推荐视频开关
+ 显示联合投稿up
### 修复
+ 收藏夹个数错误
+ 封面保存权限问题
+ 合集最后1p未展示
+ up主页关注按钮触发灰屏
### 优化
+ 视频简介查看逻辑
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.23.0504.md
================================================
## 1.0.23
### 功能
+ 封面下载
### 修复
+ 全屏问题
+ 视频播放器灰屏问题
+ 评论区点击区域问题
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.23.0505.md
================================================
## 1.0.23
### 功能
+ 封面下载
### 修复
+ 全屏问题
+ 视频播放器灰屏问题
+ 评论区点击区域问题
+ 动态详情跳转异常问题
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.24.0626.md
================================================
## 1.0.24
### 功能
+ 私信功能
+ 回复我的、收到的赞查看
+ 新的登录方式
+ 全屏选集
+ 一键三连
+ 按分区搜索
### 优化
+ 页面跳转动画
+ 评论区跳转
### 修复
+ 音画不同步问题
+ 分集字幕未同步
+ 多语言字幕
+ 弹幕设置未生效
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.25.1010.md
================================================
## 1.0.25
### 功能
+ 直播弹幕
+ 稍后再看、收藏夹播放全部
+ 收藏夹新建、编辑
+ 评论删除
+ 评论保存为图片
+ 动态页滑动切换up
+ up投稿筛选充电视频
+ 直播tab展示关注up
+ up主页专栏展示
### 优化
+ 视频详情页一键三连
+ 动态页标识充电视频
+ 播放器亮度、音量调整百分比展示
+ 封面预览时视频标题可复制
+ 竖屏直播布局
+ 图片预览
+ 专栏渲染优化
+ 私信图片查看
### 修复
+ 收藏夹点击异常
+ 搜索up异常
+ 系统通知已读异常
+ [赞了我的]展示错误
+ 部分up合集无法打开
+ 切换合集视频投币个数未重置
+ 搜索条件筛选面板无法滚动
+ 部分机型导航条未沉浸
+ 专栏图片渲染问题
+ 专栏浏览历史记录
+ 直播间历史记录
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.3.0821.md
================================================
## 1.0.3
建议卸载1.0.2版本,重新安装
### 新功能
+ 底部播放进度条设置
+ 复制图片链接
### 修复
+ 用户数据格式修改
+ video Fit
+ 没有audio 资源的视频异常
+ 评论区域图片无法点击
+ 视频进度条拖动问题
### 优化
+ 页面空/异常状态样式
+ 部分页面样式
+ 图片预览页面样式
================================================
FILE: change_log/1.0.4.0822.md
================================================
## 1.0.4
### 新功能
+ 热搜刷新
+ 视频搜索排序、筛选
+ app字体大小自定义
+ app主题色自定义
+ 「课堂」类动态渲染
### 修复
+ 搜索词联想richText渲染异常
+ 部分动态点赞异常
+ 默认视频解码格式
+ 搜索页面返回搜索词未清空
+ 动态详情评论加载异常
+ 动态页面下拉刷新数据异常
### 优化
+ 一些样式修改
+ 取消热搜词缓存
================================================
FILE: change_log/1.0.5.0826.md
================================================
## 1.0.5
主要是bug修复跟一部分小功能,弹幕功能需要下一版。
问题反馈请前往QQ频道或提交issues。
感谢🙏酷友「无力感*」「斤斤计较呀」「Pseudopamine」
### 新功能
+ 高帧率支持
+ 默认评论排序设置
+ 默认动态类别设置
+ 动态合集查看
+ 同时观看人数
+ iOS路由切换效果
### 修复
+ 收藏夹翻页
+ 首页搜索框频繁点击消失
+ 评论排序切换空白
+ 快速返回首页
+ 重复进入个人中心页面数据未刷新
+ 动态goods数据异常
+ 大会员切换番剧
+ 高画质codes匹配
### 优化
+ 倍速选择
+ 播放器亮度记忆
+ 下载对应版本apk
================================================
FILE: change_log/1.0.6.0902.md
================================================
## 1.0.6
问题反馈、功能建议请查看「关于」页面。
### 新功能
+ 首页单列布局
+ 首页推荐展示播放量、弹幕数
+ 简单弹幕功能实现(持续开发中...)
+ 评论区搜索关键词开关 issues#46
+ 热搜榜隐藏功能 issues#35
+ 自动全屏 issues#37
+ 快速收藏功能
+ 双击快进/快退开关
+ 评论链接跳转视频
+ 支持移除单个稍后再看
+ app scheme外链跳转
### 修复
+ 杜比、无损音频切换
+ 收藏夹展示 issues#42
+ 搜索建议次 issues#47
### 优化
+ 倍速选择优化
+ 导航条沉浸
+ 取消Hero动画
+ 视频锁定逻辑
+ 登录逻辑优化
+ 图片预览样式
+ +评论区用户点击范围
+ 关注、粉丝页面优化
+ 关闭自动播放时播放器初始化逻辑
================================================
FILE: change_log/1.0.7.0908.md
================================================
## 1.0.7
默认倍速、直播弹幕、专栏等功能开发中
### 新功能
+ 弹幕设置、屏蔽功能
+ 不是很完美的后台播放功能
+ 不是很完美的画中画(pip)功能(Android端)
### 修复
+ 动态页面加载异常
+ 网络异常时页面空白
+ 竖屏全屏状态栏问题
+ iOS端代理请求异常
### 优化
+ 图片预览
+ 全屏播放时自动旋转
+ 转发内容增加视频标题
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.8.0917.md
================================================
## 1.0.8
直播弹幕、循环播放等功能开发中
### 新功能
+ 用户拉黑功能
+ gif图片保存
+ 删除已看历史记录
### 修复
+ 弹幕数量较少
+ 弹幕屏蔽设置自动记忆
+ 动态页面渲染
+ 用户主页数据错乱
+ 大家都在搜空白
+ 默认自动全屏,顶部操作栏丢失
### 优化
+ 全屏状态栏区域显示优化
+ 图片保存至PiliPala文件夹
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: change_log/1.0.9.1015.md
================================================
## 1.0.9
### 新功能
+ 自定义倍速、默认倍速
+ 历史记录搜索
+ 收藏夹搜索
+ 历史记录多选删除
+ 视频循环播放
+ 免登录看1080P
+ 评论区视频链接跳转
+ up主分组
+ up主投稿搜索
### 修复
+ 搜索视频标题乱码
+ 屏幕帧率
+ 动态页面渲染
### 优化
+ 快进手势
+ 视频简介链接匹配
+ 视频全屏时安全区域
更多更新日志可在Github上查看
问题反馈、功能建议请查看「关于」页面。
================================================
FILE: fastlane/metadata/android/en-US/full_description.txt
================================================
PiliPala is a third-party Bilibili client developed in Flutter.
Top Features:
* List of recommended videos
* List of hottest videos
* Popular live streams
* List of bangumis
* Block videos from blacklisted users
================================================
FILE: fastlane/metadata/android/en-US/short_description.txt
================================================
A third-party Bilibili client developed in Flutter
================================================
FILE: fastlane/metadata/android/en-US/title.txt
================================================
PiliPala
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/2001.txt
================================================
修复
* 全屏弹幕消失
* iOS 全屏/退出全屏视频暂停
* 个人主页关注状态
* 视频合集向下滑动UI问题
* 媒体库滑动底栏不隐藏
* 个人主页动态加载问题 * 2
* 未登录状态访问个人主页异常
* 视频搜索标题特殊字符转义
* iOS 闪退
* 消息页面夜间模式异常
* 消息页面含有撤回消息时异常
* 弹幕速度
优化
* 全屏播放方案优化
* 弹幕加载逻辑优化
* 点赞、投币逻辑优化
* 进度条及播放时间渲染优化
================================================
FILE: fastlane/metadata/android/zh-CN/full_description.txt
================================================
PiliPala 是使用 Flutter 开发的 BiliBili 第三方客户端。
主要功能:
* 推荐视频列表 (app 端)
* 最热视频列表
* 热门直播
* 番剧列表
* 屏蔽黑名单内用户视频
================================================
FILE: fastlane/metadata/android/zh-CN/short_description.txt
================================================
使用 Flutter 开发的 BiliBili 第三方客户端
================================================
FILE: fastlane/metadata/android/zh-CN/title.txt
================================================
PiliPala
================================================
FILE: ios/.gitignore
================================================
**/dgph
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3
================================================
FILE: ios/Flutter/AppFrameworkInfo.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>12.0</string>
</dict>
</plist>
================================================
FILE: ios/Flutter/Debug.xcconfig
================================================
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"
================================================
FILE: ios/Flutter/Release.xcconfig
================================================
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
================================================
FILE: ios/Podfile
================================================
# Uncomment this line to define a global platform for your project
platform :ios, '13.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_ios_podfile_setup
target 'Runner' do
use_frameworks!
use_modular_headers!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
deployment_target = config.build_settings['IPHONEOS_DEPLOYMENT_TARGET']
if !deployment_target.nil? && !deployment_target.empty? && deployment_target.to_f < 12.0
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
end
end
end
end
================================================
FILE: ios/Runner/AppDelegate.swift
================================================
import UIKit
import Flutter
import AVFoundation
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
// 设置音频会话类别,确保在静音模式下播放音频
do {
try AVAudioSession.sharedInstance().setCategory(.playback, options: [.duckOthers])
} catch {
print("Failed to set audio session category: \(error)")
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
================================================
FILE: ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
================================================
# Launch Screen Assets
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
================================================
FILE: ios/Runner/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
</resources>
</document>
================================================
FILE: ios/Runner/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-11" y="-41"/>
</scene>
</scenes>
</document>
================================================
FILE: ios/Runner/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>PiliPala</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>PiliPala</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>请允许APP保存图片到相册</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>请允许APP保存图片到相册</string>
<key>NSCameraUsageDescription</key>
<string>App需要您的同意,才能访问相册</string>
<key>NSAppleMusicUsageDescription</key>
<string>App需要您的同意,才能访问媒体资料库</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>https</string>
<string>http</string>
</array>
<!-- Add Scheme related information -->
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string></string>
<key>CFBundleURLSchemes</key>
<array>
<string>http</string>
<string>https</string>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string></string>
<key>CFBundleURLSchemes</key>
<array>
<string>m.bilibili.com</string>
<string>bilibili.com</string>
<string>www.bilibili.com</string>
<string>bangumi.bilibili.com</string>
<string>bilibili.cn</string>
<string>www.bilibili.cn</string>
<string>bangumi.bilibili.cn</string>
<string>bilibili.tv</string>
<string>www.bilibili.tv</string>
<string>bangumi.bilibili.tv</string>
<string>miniapp.bilibili.com</string>
<string>live.bilibili.com</string>
</array>
</dict>
</array>
</dict>
<!-- 当其他应用程序或系统通过 bilibili -->
<dict>
<key>CFBundleURLName</key>
<string>bilibili</string>
<key>CFBundleURLSchemes</key>
<array>
<string>bilibili</string>
</array>
</dict>
</array>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
</dict>
</plist>
================================================
FILE: ios/Runner/Runner-Bridging-Header.h
================================================
#import "GeneratedPluginRegistrant.h"
================================================
FILE: ios/Runner.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
2431C9E3151C7449D0D1C0F4 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63F2789C7C1DF3CD2B80A936 /* Pods_Runner.framework */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
32E2926120A1A8DC0E629BC6 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
3DA6FBBC55FDD1E3261D6D67 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
51DB54E5BB66F8608325A082 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
63F2789C7C1DF3CD2B80A936 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
2431C9E3151C7449D0D1C0F4 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
31399C6148E878051E614578 /* Frameworks */ = {
isa = PBXGroup;
children = (
63F2789C7C1DF3CD2B80A936 /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
);
name = Flutter;
sourceTree = "<group>";
};
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
EFBDDDF3F822865E6D1BB6D7 /* Pods */,
31399C6148E878051E614578 /* Frameworks */,
);
sourceTree = "<group>";
};
97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
);
name = Products;
sourceTree = "<group>";
};
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
);
path = Runner;
sourceTree = "<group>";
};
EFBDDDF3F822865E6D1BB6D7 /* Pods */ = {
isa = PBXGroup;
children = (
51DB54E5BB66F8608325A082 /* Pods-Runner.debug.xcconfig */,
3DA6FBBC55FDD1E3261D6D67 /* Pods-Runner.release.xcconfig */,
32E2926120A1A8DC0E629BC6 /* Pods-Runner.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
67CCBB29D5A20A144E2BDF7D /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
5A372F23F3CF0118D6526BAC /* [CP] Embed Pods Frameworks */,
B78851E7B29A4C3961AC483C /* [CP] Copy Pods Resources */,
);
buildRules = (
);
dependencies = (
);
name = Runner;
productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
};
};
};
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
5A372F23F3CF0118D6526BAC /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
67CCBB29D5A20A144E2BDF7D /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
B78851E7B29A4C3961AC483C /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Profile;
};
249021D4217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = "";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.guozhigq.pilipala;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97C147061CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = "";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.guozhigq.pilipala;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
97C147071CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = "";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.guozhigq.pilipala;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
}
================================================
FILE: ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
================================================
FILE: ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
================================================
FILE: ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1510"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: ios/Runner.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
================================================
FILE: lib/common/constants.dart
================================================
import 'package:flutter/material.dart';
class StyleString {
static const double cardSpace = 8;
static const double safeSpace = 12;
static BorderRadius mdRadius = BorderRadius.circular(10);
static const Radius imgRadius = Radius.circular(10);
static const double aspectRatio = 16 / 10;
}
class Constants {
// 27eb53fc9058f8c3 移动端 Android
// 4409e2ce8ffd12b8 TV端
static const String appKey = '4409e2ce8ffd12b8';
// 59b43e04ad6965f34319062b478f83dd TV端
static const String appSec = '59b43e04ad6965f34319062b478f83dd';
static const String thirdSign = '04224646d1fea004e79606d3b038c84a';
static const String thirdApi =
'https://www.mcbbs.net/template/mcbbs/image/special_photo_bg.png';
}
================================================
FILE: lib/common/pages_bottom_sheet.dart
================================================
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
import '../models/common/video_episode_type.dart';
class EpisodeBottomSheet {
final List<dynamic> episodes;
final int currentCid;
final dynamic dataType;
final BuildContext context;
final Function changeFucCall;
final int? cid;
final double? sheetHeight;
bool isFullScreen = false;
EpisodeBottomSheet({
required this.episodes,
required this.currentCid,
required this.dataType,
required this.context,
required this.changeFucCall,
this.cid,
this.sheetHeight,
this.isFullScreen = false,
});
Widget buildEpisodeListItem(
dynamic episode,
int index,
bool isCurrentIndex,
) {
Color primary = Theme.of(context).colorScheme.primary;
Color onSurface = Theme.of(context).colorScheme.onSurface;
String title = '';
switch (dataType) {
case VideoEpidoesType.videoEpisode:
title = episode.title;
break;
case VideoEpidoesType.videoPart:
title = episode.pagePart;
break;
case VideoEpidoesType.bangumiEpisode:
title = '第${episode.title}话 ${episode.longTitle!}';
break;
}
return isFullScreen || episode?.cover == null || episode?.cover == ''
? ListTile(
onTap: () {
SmartDialog.showToast('切换至「$title」');
changeFucCall.call(episode, index);
},
dense: false,
leading: isCurrentIndex
? Image.asset(
'assets/images/live.gif',
color: primary,
height: 12,
)
: null,
title: Text(title,
style: TextStyle(
fontSize: 14,
color: isCurrentIndex ? primary : onSurface,
)))
: InkWell(
onTap: () {
SmartDialog.showToast('切换至「$title」');
changeFucCall.call(episode, index);
},
child: Padding(
padding:
const EdgeInsets.only(left: 14, right: 14, top: 8, bottom: 8),
child: Row(
children: [
NetworkImgLayer(
width: 130, height: 75, src: episode?.cover ?? ''),
const SizedBox(width: 10),
Expanded(
child: Text(
title,
maxLines: 2,
style: TextStyle(
fontSize: 14,
color: isCurrentIndex ? primary : onSurface,
),
),
),
],
),
),
);
}
Widget buildTitle() {
return AppBar(
toolbarHeight: 45,
automaticallyImplyLeading: false,
centerTitle: false,
title: Text(
'合集(${episodes.length})',
style: Theme.of(context).textTheme.titleMedium,
),
actions: !isFullScreen
? [
IconButton(
icon: const Icon(Icons.close, size: 20),
onPressed: () => Navigator.pop(context),
),
const SizedBox(width: 14),
]
: null,
);
}
Widget buildShowContent(BuildContext context) {
final ItemScrollController itemScrollController = ItemScrollController();
int currentIndex = episodes.indexWhere((dynamic e) => e.cid == currentCid);
return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
WidgetsBinding.instance.addPostFrameCallback((_) {
itemScrollController.jumpTo(index: currentIndex);
});
return Container(
height: sheetHeight,
color: Theme.of(context).colorScheme.surface,
child: Column(
children: [
buildTitle(),
Expanded(
child: Material(
child: PageStorage(
bucket: PageStorageBucket(),
child: ScrollablePositionedList.builder(
itemScrollController: itemScrollController,
itemCount: episodes.length + 1,
itemBuilder: (BuildContext context, int index) {
bool isLastItem = index == episodes.length;
bool isCurrentIndex = currentIndex == index;
return isLastItem
? SizedBox(
height:
MediaQuery.of(context).padding.bottom + 20,
)
: buildEpisodeListItem(
episodes[index],
index,
isCurrentIndex,
);
},
),
),
),
),
],
),
);
});
}
/// The [BuildContext] of the widget that calls the bottom sheet.
PersistentBottomSheetController show(BuildContext context) {
final PersistentBottomSheetController btmSheetCtr = showBottomSheet(
context: context,
builder: (BuildContext context) {
return buildShowContent(context);
},
);
return btmSheetCtr;
}
}
================================================
FILE: lib/common/skeleton/dynamic_card.dart
================================================
import 'package:flutter/material.dart';
import 'skeleton.dart';
class DynamicCardSkeleton extends StatelessWidget {
const DynamicCardSkeleton({super.key});
@override
Widget build(BuildContext context) {
return Skeleton(
child: Container(
padding: const EdgeInsets.only(left: 12, right: 12, top: 12),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
width: 8,
color: Theme.of(context).dividerColor.withOpacity(0.05),
),
),
),
child: Column(
children: [
Row(
children: [
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.onInverseSurface,
borderRadius: BorderRadius.circular(20),
),
),
const SizedBox(width: 10),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: 100,
height: 13,
margin: const EdgeInsets.only(bottom: 5),
),
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: 50,
height: 11,
),
],
)
],
),
Container(
width: double.infinity,
margin: const EdgeInsets.only(top: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: double.infinity,
height: 13,
margin: const EdgeInsets.only(bottom: 7),
),
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: double.infinity,
height: 13,
margin: const EdgeInsets.only(bottom: 7),
),
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: 300,
height: 13,
margin: const EdgeInsets.only(bottom: 7),
),
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: 250,
height: 13,
margin: const EdgeInsets.only(bottom: 7),
),
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: 100,
height: 13,
margin: const EdgeInsets.only(bottom: 7),
),
],
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
for (var i = 0; i < 3; i++)
TextButton.icon(
onPressed: () {},
icon: const Icon(
Icons.radio_button_unchecked_outlined,
size: 20,
),
style: TextButton.styleFrom(
padding: const EdgeInsets.fromLTRB(15, 0, 15, 0),
foregroundColor: Theme.of(context)
.colorScheme
.outline
.withOpacity(0.2),
),
label: Text(
i == 0
? '转发'
: i == 1
? '评论'
: '点赞',
),
)
],
)
],
),
),
);
}
}
================================================
FILE: lib/common/skeleton/media_bangumi.dart
================================================
import 'package:flutter/material.dart';
import 'package:pilipala/common/constants.dart';
import 'skeleton.dart';
class MediaBangumiSkeleton extends StatefulWidget {
const MediaBangumiSkeleton({super.key});
@override
State<MediaBangumiSkeleton> createState() => _MediaBangumiSkeletonState();
}
class _MediaBangumiSkeletonState extends State<MediaBangumiSkeleton> {
@override
Widget build(BuildContext context) {
Color bgColor = Theme.of(context).colorScheme.onInverseSurface;
return Skeleton(
child: Padding(
padding: const EdgeInsets.fromLTRB(
StyleString.safeSpace, 7, StyleString.safeSpace, 7),
child: Row(
children: [
Container(
width: 111,
height: 148,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(6)),
color: bgColor),
),
const SizedBox(width: 10),
Expanded(
child: SizedBox(
height: 148,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: 200,
height: 20,
margin: const EdgeInsets.only(bottom: 15),
),
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: 150,
height: 13,
margin: const EdgeInsets.only(bottom: 5),
),
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: 150,
height: 13,
margin: const EdgeInsets.only(bottom: 5),
),
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: 150,
height: 13,
),
const Spacer(),
Container(
width: 90,
height: 35,
decoration: BoxDecoration(
borderRadius:
const BorderRadius.all(Radius.circular(20)),
color: Theme.of(context).colorScheme.onInverseSurface,
),
),
],
),
),
),
],
),
),
);
}
}
================================================
FILE: lib/common/skeleton/skeleton.dart
================================================
import 'package:flutter/material.dart';
class Skeleton extends StatelessWidget {
final Widget child;
const Skeleton({
required this.child,
super.key,
});
@override
Widget build(BuildContext context) {
var shimmerGradient = LinearGradient(
colors: [
Colors.transparent,
Theme.of(context).colorScheme.surface.withAlpha(10),
Theme.of(context).colorScheme.surface.withAlpha(10),
Colors.transparent,
],
stops: const [
0.1,
0.3,
0.5,
0.7,
],
begin: const Alignment(-1.0, -0.3),
end: const Alignment(1.0, 0.9),
tileMode: TileMode.clamp,
);
return Shimmer(
linearGradient: shimmerGradient,
child: ShimmerLoading(
isLoading: true,
child: child,
),
);
}
}
class Shimmer extends StatefulWidget {
static ShimmerState? of(BuildContext context) {
return context.findAncestorStateOfType<ShimmerState>();
}
const Shimmer({
super.key,
required this.linearGradient,
this.child,
});
final LinearGradient linearGradient;
final Widget? child;
@override
ShimmerState createState() => ShimmerState();
}
class ShimmerState extends State<Shimmer> with SingleTickerProviderStateMixin {
late AnimationController _shimmerController;
@override
void initState() {
super.initState();
_shimmerController = AnimationController.unbounded(vsync: this)
..repeat(min: -0.5, max: 1.5, period: const Duration(milliseconds: 1000));
}
@override
void dispose() {
_shimmerController.dispose();
super.dispose();
}
LinearGradient get gradient => LinearGradient(
colors: widget.linearGradient.colors,
stops: widget.linearGradient.stops,
begin: widget.linearGradient.begin,
end: widget.linearGradient.end,
transform: _SlidingGradientTransform(
slidePercent: _shimmerController.value,
),
);
bool get isSized =>
(context.findRenderObject() as RenderBox?)?.hasSize ?? false;
Size get size => (context.findRenderObject() as RenderBox).size;
Offset getDescendantOffset({
required RenderBox descendant,
Offset offset = Offset.zero,
}) {
final shimmerBox = context.findRenderObject() as RenderBox;
return descendant.localToGlobal(offset, ancestor: shimmerBox);
}
Listenable get shimmerChanges => _shimmerController;
@override
Widget build(BuildContext context) {
return widget.child ?? const SizedBox();
}
}
class _SlidingGradientTransform extends GradientTransform {
const _SlidingGradientTransform({
required this.slidePercent,
});
final double slidePercent;
@override
Matrix4? transform(Rect bounds, {TextDirection? textDirection}) {
return Matrix4.translationValues(bounds.width * slidePercent, 0.0, 0.0);
}
}
class ShimmerLoading extends StatefulWidget {
const ShimmerLoading({
super.key,
required this.isLoading,
required this.child,
});
final bool isLoading;
final Widget child;
@override
State<ShimmerLoading> createState() => _ShimmerLoadingState();
}
class _ShimmerLoadingState extends State<ShimmerLoading> {
Listenable? _shimmerChanges;
@override
void didChangeDependencies() {
super.didChangeDependencies();
if (_shimmerChanges != null) {
_shimmerChanges!.removeListener(_onShimmerChange);
}
_shimmerChanges = Shimmer.of(context)?.shimmerChanges;
if (_shimmerChanges != null) {
_shimmerChanges!.addListener(_onShimmerChange);
}
}
@override
void dispose() {
_shimmerChanges?.removeListener(_onShimmerChange);
super.dispose();
}
void _onShimmerChange() {
if (widget.isLoading) {
setState(() {});
}
}
@override
Widget build(BuildContext context) {
if (!widget.isLoading) {
return widget.child;
}
final shimmer = Shimmer.of(context)!;
if (!shimmer.isSized) {
return const SizedBox();
}
final shimmerSize = shimmer.size;
final gradient = shimmer.gradient;
final offsetWithinShimmer = shimmer.getDescendantOffset(
descendant: context.findRenderObject() as RenderBox,
);
return ShaderMask(
blendMode: BlendMode.srcATop,
shaderCallback: (bounds) {
return gradient.createShader(
Rect.fromLTWH(
-offsetWithinShimmer.dx,
-offsetWithinShimmer.dy,
shimmerSize.width,
shimmerSize.height,
),
);
},
child: widget.child,
);
}
}
================================================
FILE: lib/common/skeleton/video_card_h.dart
================================================
import 'package:pilipala/common/constants.dart';
import 'package:flutter/material.dart';
import 'skeleton.dart';
class VideoCardHSkeleton extends StatelessWidget {
const VideoCardHSkeleton({super.key});
@override
Widget build(BuildContext context) {
return Skeleton(
child: Padding(
padding: const EdgeInsets.fromLTRB(
StyleString.safeSpace, 7, StyleString.safeSpace, 7),
child: LayoutBuilder(
builder: (context, boxConstraints) {
double width =
(boxConstraints.maxWidth - StyleString.cardSpace * 6) / 2;
return SizedBox(
height: width / StyleString.aspectRatio,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AspectRatio(
aspectRatio: StyleString.aspectRatio,
child: LayoutBuilder(
builder: (context, boxConstraints) {
return Container(
decoration: BoxDecoration(
color:
Theme.of(context).colorScheme.onInverseSurface,
borderRadius:
BorderRadius.circular(StyleString.imgRadius.x),
),
);
},
),
),
// VideoContent(videoItem: videoItem)
Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(10, 4, 6, 4),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: 200,
height: 11,
margin: const EdgeInsets.only(bottom: 5),
),
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: 150,
height: 13,
),
const Spacer(),
Container(
color: Theme.of(context).colorScheme.onInverseSurface,
width: 100,
height: 13,
margin: const EdgeInsets.only(bottom: 5),
),
Row(
children: [
Container(
color: Theme.of(context)
.colorScheme
.onInverseSurface,
width: 40,
height: 13,
margin: const EdgeInsets.only(right: 8),
),
Container(
color: Theme.of(context)
.colorScheme
.onInverseSurface,
width: 40,
height: 13,
),
],
)
],
),
)),
],
),
);
},
),
),
);
}
}
================================================
FILE: lib/common/skeleton/video_card_v.dart
================================================
import 'package:pilipala/common/constants.dart';
import 'package:flutter/material.dart';
import 'skeleton.dart';
class VideoCardVSkeleton extends StatelessWidget {
const VideoCardVSkeleton({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Skeleton(
child: Column(
children: [
AspectRatio(
aspectRatio: StyleString.aspectRatio,
child: LayoutBuilder(
builder: (context, boxConstraints) {
return Container(
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.onInverseSurface,
borderRadius:
BorderRadius.circular(StyleString.imgRadius.x)),
);
},
),
),
Padding(
// 多列
padding: const EdgeInsets.fromLTRB(4, 5, 6, 6),
// 单列
// padding: const EdgeInsets.fromLTRB(14, 10, 4, 8),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
// const SizedBox(height: 6),
Container(
width: 200,
height: 13,
margin: const EdgeInsets.only(bottom: 5),
color: Theme.of(context).colorScheme.onInverseSurface,
),
Container(
width: 150,
height: 13,
margin: const EdgeInsets.only(bottom: 12),
color: Theme.of(context).colorScheme.onInverseSurface,
),
],
),
),
],
),
);
}
}
================================================
FILE: lib/common/skeleton/video_reply.dart
================================================
import 'package:flutter/material.dart';
import 'skeleton.dart';
class VideoReplySkeleton extends StatelessWidget {
const VideoReplySkeleton({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
Color bgColor = Theme.of(context).colorScheme.onInverseSurface;
return Skeleton(
child: Column(
children: [
Padding(
padding: const EdgeInsets.fromLTRB(12, 8, 8, 2),
child: Row(
children: [
ClipOval(
child: Container(
width: 34,
height: 34,
color: bgColor,
),
),
const SizedBox(width: 12),
Container(
width: 80,
height: 13,
color: bgColor,
)
],
),
),
Container(
width: double.infinity,
margin:
const EdgeInsets.only(top: 4, left: 57, right: 6, bottom: 6),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Container(
width: 300,
height: 14,
margin: const EdgeInsets.only(bottom: 4),
color: bgColor,
),
Container(
width: 180,
height: 14,
margin: const EdgeInsets.only(bottom: 10),
color: bgColor,
),
Row(
children: [
Container(
width: 40,
height: 14,
margin: const EdgeInsets.only(bottom: 4),
color: bgColor,
),
const Spacer(),
Container(
width: 30,
height: 14,
margin: const EdgeInsets.only(bottom: 4),
color: bgColor,
),
const SizedBox(width: 8),
Container(
width: 30,
height: 14,
margin: const EdgeInsets.only(bottom: 4),
color: bgColor,
),
const SizedBox(width: 8)
],
)
],
),
),
],
),
);
}
}
================================================
FILE: lib/common/widgets/animated_dialog.dart
================================================
import 'package:flutter/material.dart';
class AnimatedDialog extends StatefulWidget {
const AnimatedDialog({Key? key, required this.child, this.closeFn})
: super(key: key);
final Widget child;
final Function? closeFn;
@override
State<StatefulWidget> createState() => AnimatedDialogState();
}
class AnimatedDialogState extends State<AnimatedDialog>
with SingleTickerProviderStateMixin {
late AnimationController? controller;
late Animation<double>? opacityAnimation;
late Animation<double>? scaleAnimation;
@override
void initState() {
super.initState();
controller = AnimationController(
vsync: this, duration: const Duration(milliseconds: 800));
opacityAnimation = Tween<double>(begin: 0.0, end: 0.6).animate(
CurvedAnimation(parent: controller!, curve: Curves.easeOutExpo));
scaleAnimation =
CurvedAnimation(parent: controller!, curve: Curves.easeOutExpo);
controller!.addListener(() => setState(() {}));
controller!.forward();
}
@override
void dispose() {
controller!.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Material(
color: Colors.black.withOpacity(opacityAnimation!.value),
child: InkWell(
splashColor: Colors.transparent,
onTap: () => widget.closeFn!(),
child: Center(
child: FadeTransition(
opacity: scaleAnimation!,
child: ScaleTransition(
scale: scaleAnimation!,
child: widget.child,
),
),
),
),
);
}
}
================================================
FILE: lib/common/widgets/app_expansion_panel_list.dart
================================================
import 'package:flutter/material.dart';
const double _kPanelHeaderCollapsedHeight = kMinInteractiveDimension;
class _SaltedKey<S, V> extends LocalKey {
const _SaltedKey(this.salt, this.value);
final S salt;
final V value;
@override
bool operator ==(Object other) {
if (other.runtimeType != runtimeType) return false;
return other is _SaltedKey<S, V> &&
other.salt == salt &&
other.value == value;
}
@override
int get hashCode => Object.hash(runtimeType, salt, value);
@override
String toString() {
final String saltString = S == String ? "<'$salt'>" : '<$salt>';
final String valueString = V == String ? "<'$value'>" : '<$value>';
return '[$saltString $valueString]';
}
}
class AppExpansionPanelList extends StatefulWidget {
/// Creates an expansion panel list widget. The [expansionCallback] is
/// triggered when an expansion panel expand/collapse button is pushed.
///
/// The [children] and [animationDuration] arguments must not be null.
const AppExpansionPanelList({
super.key,
required this.children,
this.expansionCallback,
this.animationDuration = kThemeAnimationDuration,
this.expandedHeaderPadding = EdgeInsets.zero,
this.dividerColor,
this.elevation = 2,
}) : _allowOnlyOnePanelOpen = false,
initialOpenPanelValue = null;
/// The children of the expansion panel list. They are laid out in a similar
/// fashion to [ListBody].
final List<AppExpansionPanel> children;
/// The callback that gets called whenever one of the expand/collapse buttons
/// is pressed. The arguments passed to the callback are the index of the
/// pressed panel and whether the panel is currently expanded or not.
///
/// If AppExpansionPanelList.radio is used, the callback may be called a
/// second time if a different panel was previously open. The arguments
/// passed to the second callback are the index of the panel that will close
/// and false, marking that it will be closed.
///
/// For AppExpansionPanelList, the callback needs to setState when it's notified
/// about the closing/opening panel. On the other hand, the callback for
/// AppExpansionPanelList.radio is simply meant to inform the parent widget of
/// changes, as the radio panels' open/close states are managed internally.
///
/// This callback is useful in order to keep track of the expanded/collapsed
/// panels in a parent widget that may need to react to these changes.
final ExpansionPanelCallback? expansionCallback;
/// The duration of the expansion animation.
final Duration animationDuration;
// Whether multiple panels can be open simultaneously
final bool _allowOnlyOnePanelOpen;
/// The value of the panel that initially begins open. (This value is
/// only used when initializing with the [AppExpansionPanelList.radio]
/// constructor.)
final Object? initialOpenPanelValue;
/// The padding that surrounds the panel header when expanded.
///
/// By default, 16px of space is added to the header vertically (above and below)
/// during expansion.
final EdgeInsets expandedHeaderPadding;
/// Defines color for the divider when [AppExpansionPanel.isExpanded] is false.
///
/// If `dividerColor` is null, then [DividerThemeData.color] is used. If that
/// is null, then [ThemeData.dividerColor] is used.
final Color? dividerColor;
/// Defines elevation for the [AppExpansionPanel] while it's expanded.
///
/// By default, the value of elevation is 2.
final double elevation;
@override
State<AppExpansionPanelList> createState() => _AppExpansionPanelListState();
}
class _AppExpansionPanelListState extends State<AppExpansionPanelList> {
ExpansionPanelRadio? _currentOpenPanel;
@override
void initState() {
super.initState();
if (widget._allowOnlyOnePanelOpen) {
assert(_allIdentifiersUnique(),
'All ExpansionPanelRadio identifier values must be unique.');
if (widget.initialOpenPanelValue != null) {
_currentOpenPanel = searchPanelByValue(
widget.children.cast<ExpansionPanelRadio>(),
widget.initialOpenPanelValue);
}
}
}
@override
void didUpdateWidget(AppExpansionPanelList oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget._allowOnlyOnePanelOpen) {
assert(_allIdentifiersUnique(),
'All ExpansionPanelRadio identifier values must be unique.');
// If the previous widget was non-radio AppExpansionPanelList, initialize the
// open panel to widget.initialOpenPanelValue
if (!oldWidget._allowOnlyOnePanelOpen) {
_currentOpenPanel = searchPanelByValue(
widget.children.cast<ExpansionPanelRadio>(),
widget.initialOpenPanelValue);
}
} else {
_currentOpenPanel = null;
}
}
bool _allIdentifiersUnique() {
final Map<Object, bool> identifierMap = <Object, bool>{};
for (final ExpansionPanelRadio child
in widget.children.cast<ExpansionPanelRadio>()) {
identifierMap[child.value] = true;
}
return identifierMap.length == widget.children.length;
}
bool _isChildExpanded(int index) {
if (widget._allowOnlyOnePanelOpen) {
final ExpansionPanelRadio radioWidget =
widget.children[index] as ExpansionPanelRadio;
return _currentOpenPanel?.value == radioWidget.value;
}
return widget.children[index].isExpanded;
}
void _handlePressed(bool isExpanded, int index) {
widget.expansionCallback?.call(index, isExpanded);
if (widget._allowOnlyOnePanelOpen) {
final ExpansionPanelRadio pressedChild =
widget.children[index] as ExpansionPanelRadio;
// If another ExpansionPanelRadio was already open, apply its
// expansionCallback (if any) to false, because it's closing.
for (int childIndex = 0;
childIndex < widget.children.length;
childIndex += 1) {
final ExpansionPanelRadio child =
widget.children[childIndex] as ExpansionPanelRadio;
if (widget.expansionCallback != null &&
childIndex != index &&
child.value == _currentOpenPanel?.value) {
widget.expansionCallback!(childIndex, false);
}
}
setState(() {
_currentOpenPanel = isExpanded ? null : pressedChild;
});
}
}
ExpansionPanelRadio? searchPanelByValue(
List<ExpansionPanelRadio> panels, Object? value) {
for (final ExpansionPanelRadio panel in panels) {
if (panel.value == value) return panel;
}
return null;
}
@override
Widget build(BuildContext context) {
assert(
kElevationToShadow.containsKey(widget.elevation),
'Invalid value for elevation. See the kElevationToShadow constant for'
' possible elevation values.',
);
final List<MergeableMaterialItem> items = <MergeableMaterialItem>[];
for (int index = 0; index < widget.children.length; index += 1) {
//todo: Uncomment to add gap between selected panels
/*if (_isChildExpanded(index) && index != 0 && !_isChildExpanded(index - 1))
items.add(MaterialGap(key: _SaltedKey<BuildContext, int>(context, index * 2 - 1)));*/
final AppExpansionPanel child = widget.children[index];
final Widget headerWidget = child.headerBuilder(
context,
_isChildExpanded(index),
);
Widget? expandIconContainer = ExpandIcon(
isExpanded: _isChildExpanded(index),
onPressed: !child.canTapOnHeader
? (bool isExpanded) => _handlePressed(isExpanded, index)
: null,
);
if (!child.canTapOnHeader) {
final MaterialLocalizations localizations =
MaterialLocalizations.of(context);
expandIconContainer = Semantics(
label: _isChildExpanded(index)
? localizations.expandedIconTapHint
: localizations.collapsedIconTapHint,
container: true,
child: expandIconContainer,
);
}
final iconContainer = child.iconBuilder;
if (iconContainer != null) {
expandIconContainer = iconContainer(
expandIconContainer,
_isChildExpanded(index),
);
}
Widget header = Row(
children: <Widget>[
Expanded(
child: AnimatedContainer(
duration: widget.animationDuration,
curve: Curves.fastOutSlowIn,
margin: _isChildExpanded(index)
? widget.expandedHeaderPadding
: EdgeInsets.zero,
child: ConstrainedBox(
constraints: const BoxConstraints(
minHeight: _kPanelHeaderCollapsedHeight),
child: headerWidget,
),
),
),
if (expandIconContainer != null) expandIconContainer,
],
);
if (child.canTapOnHeader) {
header = MergeSemantics(
child: InkWell(
onTap: () => _handlePressed(_isChildExpanded(index), index),
child: header,
),
);
}
items.add(
MaterialSlice(
key: _SaltedKey<BuildContext, int>(context, index * 2),
color: child.backgroundColor,
child: Column(
children: <Widget>[
header,
AnimatedCrossFade(
firstChild: Container(height: 0.0),
secondChild: child.body,
firstCurve:
const Interval(0.0, 0.6, curve: Curves.fastOutSlowIn),
secondCurve:
const Interval(0.4, 1.0, curve: Curves.fastOutSlowIn),
sizeCurve: Curves.fastOutSlowIn,
crossFadeState: _isChildExpanded(index)
? CrossFadeState.showSecond
: CrossFadeState.showFirst,
duration: widget.animationDuration,
),
],
),
),
);
if (_isChildExpanded(index) && index != widget.children.length - 1) {
items.add(MaterialGap(
key: _SaltedKey<BuildContext, int>(context, index * 2 + 1)));
}
}
return MergeableMaterial(
hasDividers: true,
dividerColor: widget.dividerColor,
elevation: widget.elevation,
children: items,
);
}
}
typedef ExpansionPanelIconBuilder = Widget? Function(
Widget child,
bool isExpanded,
);
class AppExpansionPanel {
/// Creates an expansion panel to be used as a child for [ExpansionPanelList].
/// See [ExpansionPanelList] for an example on how to use this widget.
///
/// The [headerBuilder], [body], and [isExpanded] arguments must not be null.
AppExpansionPanel({
required this.headerBuilder,
required this.body,
this.iconBuilder,
this.isExpanded = false,
this.canTapOnHeader = false,
this.backgroundColor,
});
/// The widget builder that builds the expansion panels' header.
final ExpansionPanelHeaderBuilder headerBuilder;
/// The widget builder that builds the expansion panels' icon.
///
/// If not pass any function, then default icon will be displayed.
///
/// If builder function return null, then icon will not displayed.
final ExpansionPanelIconBuilder? iconBuilder;
/// The body of the expansion panel that's displayed below the header.
///
/// This widget is visible only when the panel is expanded.
final Widget body;
/// Whether the panel is expanded.
///
/// Defaults to false.
final bool isExpanded;
/// Whether tapping on the panel's header will expand/collapse it.
///
/// Defaults to false.
final bool canTapOnHeader;
/// Defines the background color of the panel.
///
/// Defaults to [ThemeData.cardColor].
final Color? backgroundColor;
}
================================================
FILE: lib/common/widgets/appbar.dart
================================================
import 'package:flutter/material.dart';
class AppBarWidget extends StatelessWidget implements PreferredSizeWidget {
const AppBarWidget({
required this.child,
required this.controller,
required this.visible,
Key? key,
}) : super(key: key);
final PreferredSizeWidget child;
final AnimationController controller;
final bool visible;
@override
Size get preferredSize => child.preferredSize;
@override
Widget build(BuildContext context) {
visible ? controller.reverse() : controller.forward();
return SlideTransition(
position: Tween<Offset>(
begin: Offset.zero,
end: const Offset(0, -1),
).animate(CurvedAnimation(
parent: controller,
curve: Curves.easeInOutBack,
)),
child: child,
);
}
}
================================================
FILE: lib/common/widgets/badge.dart
================================================
import 'package:flutter/material.dart';
class PBadge extends StatelessWidget {
final String? text;
final double? top;
final double? right;
final double? bottom;
final double? left;
final String? type;
final String? size;
final String? stack;
final double? fs;
const PBadge({
super.key,
this.text,
this.top,
this.right,
this.bottom,
this.left,
this.type = 'primary',
this.size = 'medium',
this.stack = 'position',
this.fs = 11,
});
@override
Widget build(BuildContext context) {
ColorScheme t = Theme.of(context).colorScheme;
// 背景色
Color bgColor = t.primary;
// 前景色
Color color = t.onPrimary;
// 边框色
Color borderColor = Colors.transparent;
if (type == 'gray') {
bgColor = Colors.black54.withOpacity(0.4);
color = Colors.white;
}
if (type == 'color') {
bgColor = t.primaryContainer.withOpacity(0.6);
color = t.primary;
}
if (type == 'line') {
bgColor = Colors.transparent;
color = t.primary;
borderColor = t.primary;
}
EdgeInsets paddingStyle =
const EdgeInsets.symmetric(vertical: 1, horizontal: 6);
double fontSize = 11;
BorderRadius br = BorderRadius.circular(4);
if (size == 'small') {
paddingStyle = const EdgeInsets.symmetric(vertical: 0, horizontal: 3);
fontSize = 11;
br = BorderRadius.circular(3);
}
Widget content = Container(
padding: paddingStyle,
decoration: BoxDecoration(
borderRadius: br,
color: bgColor,
border: Border.all(color: borderColor),
),
child: Text(
text ?? '',
style: TextStyle(fontSize: fs ?? fontSize, color: color),
),
);
if (stack == 'position') {
return Positioned(
top: top,
left: left,
right: right,
bottom: bottom,
child: content,
);
} else {
ret
gitextract_2k6f8qif/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-反馈.md
│ │ └── 功能请求.md
│ └── workflows/
│ ├── beta_ci.yml
│ └── release_ci.yml
├── .gitignore
├── .metadata
├── .vscode/
│ ├── launch.json
│ └── settings.json
├── LICENSE
├── README.md
├── analysis_options.yaml
├── android/
│ ├── .gitignore
│ ├── app/
│ │ ├── build.gradle
│ │ └── src/
│ │ ├── debug/
│ │ │ └── AndroidManifest.xml
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin/
│ │ │ │ └── com/
│ │ │ │ └── guozhigq/
│ │ │ │ └── pilipala/
│ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ ├── ic_baseline_forward_10_24.xml
│ │ │ │ ├── ic_baseline_replay_10_24.xml
│ │ │ │ └── launch_background.xml
│ │ │ ├── drawable-v21/
│ │ │ │ └── launch_background.xml
│ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ └── ic_launcher.xml
│ │ │ ├── raw/
│ │ │ │ └── keep.xml
│ │ │ ├── values/
│ │ │ │ ├── colors.xml
│ │ │ │ └── styles.xml
│ │ │ └── values-night/
│ │ │ └── styles.xml
│ │ └── profile/
│ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle/
│ │ └── wrapper/
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ └── settings.gradle
├── assets/
│ ├── loading.json
│ └── trail_loading.json
├── change_log/
│ ├── 1.0.0.0817.md
│ ├── 1.0.1.0817.md
│ ├── 1.0.10.1016.md
│ ├── 1.0.11.1112.md
│ ├── 1.0.12.1114.md
│ ├── 1.0.13.1217.md
│ ├── 1.0.14.1225.md
│ ├── 1.0.15.0101.md
│ ├── 1.0.16.0102.md
│ ├── 1.0.17.0125.md
│ ├── 1.0.18.0130.md
│ ├── 1.0.19.0131.md
│ ├── 1.0.2.0819.md
│ ├── 1.0.20.0303.md
│ ├── 1.0.21.0306.md
│ ├── 1.0.22.0430.md
│ ├── 1.0.23.0504.md
│ ├── 1.0.23.0505.md
│ ├── 1.0.24.0626.md
│ ├── 1.0.25.1010.md
│ ├── 1.0.3.0821.md
│ ├── 1.0.4.0822.md
│ ├── 1.0.5.0826.md
│ ├── 1.0.6.0902.md
│ ├── 1.0.7.0908.md
│ ├── 1.0.8.0917.md
│ └── 1.0.9.1015.md
├── fastlane/
│ └── metadata/
│ └── android/
│ ├── en-US/
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ └── zh-CN/
│ ├── changelogs/
│ │ └── 2001.txt
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
├── ios/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── LaunchImage.imageset/
│ │ │ ├── Contents.json
│ │ │ └── README.md
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── Runner-Bridging-Header.h
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ └── Runner.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ ├── IDEWorkspaceChecks.plist
│ └── WorkspaceSettings.xcsettings
├── lib/
│ ├── common/
│ │ ├── constants.dart
│ │ ├── pages_bottom_sheet.dart
│ │ ├── skeleton/
│ │ │ ├── dynamic_card.dart
│ │ │ ├── media_bangumi.dart
│ │ │ ├── skeleton.dart
│ │ │ ├── video_card_h.dart
│ │ │ ├── video_card_v.dart
│ │ │ └── video_reply.dart
│ │ └── widgets/
│ │ ├── animated_dialog.dart
│ │ ├── app_expansion_panel_list.dart
│ │ ├── appbar.dart
│ │ ├── badge.dart
│ │ ├── content_container.dart
│ │ ├── custom_toast.dart
│ │ ├── html_render.dart
│ │ ├── http_error.dart
│ │ ├── live_card.dart
│ │ ├── network_img_layer.dart
│ │ ├── no_data.dart
│ │ ├── sliver_header.dart
│ │ ├── stat/
│ │ │ ├── danmu.dart
│ │ │ └── view.dart
│ │ ├── video_card_h.dart
│ │ └── video_card_v.dart
│ ├── http/
│ │ ├── api.dart
│ │ ├── bangumi.dart
│ │ ├── black.dart
│ │ ├── common.dart
│ │ ├── constants.dart
│ │ ├── danmaku.dart
│ │ ├── dynamics.dart
│ │ ├── fan.dart
│ │ ├── fav.dart
│ │ ├── follow.dart
│ │ ├── html.dart
│ │ ├── index.dart
│ │ ├── init.dart
│ │ ├── interceptor.dart
│ │ ├── live.dart
│ │ ├── login.dart
│ │ ├── member.dart
│ │ ├── msg.dart
│ │ ├── read.dart
│ │ ├── reply.dart
│ │ ├── search.dart
│ │ ├── user.dart
│ │ └── video.dart
│ ├── main.dart
│ ├── models/
│ │ ├── bangumi/
│ │ │ ├── info.dart
│ │ │ └── list.dart
│ │ ├── common/
│ │ │ ├── action_type.dart
│ │ │ ├── business_type.dart
│ │ │ ├── color_type.dart
│ │ │ ├── dynamic_badge_mode.dart
│ │ │ ├── dynamics_type.dart
│ │ │ ├── gesture_mode.dart
│ │ │ ├── index.dart
│ │ │ ├── nav_bar_config.dart
│ │ │ ├── rank_type.dart
│ │ │ ├── rcmd_type.dart
│ │ │ ├── reply_sort_type.dart
│ │ │ ├── reply_type.dart
│ │ │ ├── search_type.dart
│ │ │ ├── tab_type.dart
│ │ │ ├── theme_type.dart
│ │ │ └── video_episode_type.dart
│ │ ├── danmaku/
│ │ │ ├── dm.pb.dart
│ │ │ ├── dm.pbenum.dart
│ │ │ ├── dm.pbjson.dart
│ │ │ ├── dm.pbserver.dart
│ │ │ └── dm.proto
│ │ ├── dynamics/
│ │ │ ├── result.dart
│ │ │ └── up.dart
│ │ ├── fans/
│ │ │ └── result.dart
│ │ ├── follow/
│ │ │ └── result.dart
│ │ ├── github/
│ │ │ └── latest.dart
│ │ ├── home/
│ │ │ └── rcmd/
│ │ │ └── result.dart
│ │ ├── live/
│ │ │ ├── follow.dart
│ │ │ ├── item.dart
│ │ │ ├── message.dart
│ │ │ ├── quality.dart
│ │ │ ├── room_info.dart
│ │ │ └── room_info_h5.dart
│ │ ├── login/
│ │ │ └── index.dart
│ │ ├── member/
│ │ │ ├── archive.dart
│ │ │ ├── article.dart
│ │ │ ├── coin.dart
│ │ │ ├── info.dart
│ │ │ ├── like.dart
│ │ │ ├── seasons.dart
│ │ │ └── tags.dart
│ │ ├── model_hot_video_item.dart
│ │ ├── model_owner.dart
│ │ ├── model_rec_video_item.dart
│ │ ├── msg/
│ │ │ ├── account.dart
│ │ │ ├── like.dart
│ │ │ ├── reply.dart
│ │ │ ├── session.dart
│ │ │ └── system.dart
│ │ ├── read/
│ │ │ ├── opus.dart
│ │ │ └── read.dart
│ │ ├── search/
│ │ │ ├── all.dart
│ │ │ ├── hot.dart
│ │ │ ├── result.dart
│ │ │ └── suggest.dart
│ │ ├── user/
│ │ │ ├── black.dart
│ │ │ ├── fav_detail.dart
│ │ │ ├── fav_folder.dart
│ │ │ ├── history.dart
│ │ │ ├── info.dart
│ │ │ ├── info.g.dart
│ │ │ ├── stat.dart
│ │ │ ├── sub_detail.dart
│ │ │ └── sub_folder.dart
│ │ ├── video/
│ │ │ ├── ai.dart
│ │ │ ├── later.dart
│ │ │ ├── play/
│ │ │ │ ├── ao_output.dart
│ │ │ │ ├── quality.dart
│ │ │ │ └── url.dart
│ │ │ ├── reply/
│ │ │ │ ├── config.dart
│ │ │ │ ├── content.dart
│ │ │ │ ├── data.dart
│ │ │ │ ├── emote.dart
│ │ │ │ ├── item.dart
│ │ │ │ ├── member.dart
│ │ │ │ ├── page.dart
│ │ │ │ ├── top_replies.dart
│ │ │ │ └── upper.dart
│ │ │ └── subTitile/
│ │ │ ├── content.dart
│ │ │ └── result.dart
│ │ └── video_detail_res.dart
│ ├── pages/
│ │ ├── about/
│ │ │ └── index.dart
│ │ ├── bangumi/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── introduction/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ ├── view.dart
│ │ │ │ └── widgets/
│ │ │ │ └── intro_detail.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── bangumi_panel.dart
│ │ │ └── bangumu_card_v.dart
│ │ ├── blacklist/
│ │ │ └── index.dart
│ │ ├── danmaku/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── dlna/
│ │ │ └── index.dart
│ │ ├── dynamics/
│ │ │ ├── controller.dart
│ │ │ ├── detail/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ └── view.dart
│ │ │ ├── index.dart
│ │ │ ├── up_dynamic/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ ├── route_panel.dart
│ │ │ │ └── view.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── action_panel.dart
│ │ │ ├── additional_panel.dart
│ │ │ ├── article_panel.dart
│ │ │ ├── author_panel.dart
│ │ │ ├── content_panel.dart
│ │ │ ├── dynamic_panel.dart
│ │ │ ├── forward_panel.dart
│ │ │ ├── live_panel.dart
│ │ │ ├── live_rcmd_panel.dart
│ │ │ ├── pic_panel.dart
│ │ │ ├── rich_node_panel.dart
│ │ │ ├── up_panel.dart
│ │ │ └── video_panel.dart
│ │ ├── emote/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── fan/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── fan_item.dart
│ │ ├── fav/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── item.dart
│ │ ├── fav_detail/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widget/
│ │ │ └── fav_video_card.dart
│ │ ├── fav_edit/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── fav_search/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── follow/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── follow_item.dart
│ │ │ ├── follow_list.dart
│ │ │ └── owner_follow_list.dart
│ │ ├── follow_search/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── history/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── item.dart
│ │ ├── history_search/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── home/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── app_bar.dart
│ │ ├── hot/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── html/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── later/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── live/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── live_item.dart
│ │ ├── live_room/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── bottom_control.dart
│ │ ├── login/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── main/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── media/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── member/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── conis.dart
│ │ │ ├── like.dart
│ │ │ ├── profile.dart
│ │ │ └── seasons.dart
│ │ ├── member_archive/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── member_article/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── member_coin/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── item.dart
│ │ ├── member_dynamics/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── member_like/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── item.dart
│ │ ├── member_search/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── member_seasons/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── item.dart
│ │ ├── message/
│ │ │ ├── at/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ └── view.dart
│ │ │ ├── like/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ └── view.dart
│ │ │ ├── reply/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ └── view.dart
│ │ │ └── system/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── mine/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── opus/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── text_helper.dart
│ │ │ └── view.dart
│ │ ├── rank/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── zone/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── rcmd/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── read/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── search/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── hot_keyword.dart
│ │ │ └── search_text.dart
│ │ ├── search_panel/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── article_panel.dart
│ │ │ ├── live_panel.dart
│ │ │ ├── media_bangumi_panel.dart
│ │ │ ├── user_panel.dart
│ │ │ └── video_panel.dart
│ │ ├── search_result/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── setting/
│ │ │ ├── controller.dart
│ │ │ ├── extra_setting.dart
│ │ │ ├── index.dart
│ │ │ ├── pages/
│ │ │ │ ├── action_menu_set.dart
│ │ │ │ ├── color_select.dart
│ │ │ │ ├── display_mode.dart
│ │ │ │ ├── font_size_select.dart
│ │ │ │ ├── home_tabbar_set.dart
│ │ │ │ ├── logs.dart
│ │ │ │ ├── navigation_bar_set.dart
│ │ │ │ ├── play_gesture_set.dart
│ │ │ │ └── play_speed_set.dart
│ │ │ ├── play_setting.dart
│ │ │ ├── privacy_setting.dart
│ │ │ ├── recommend_setting.dart
│ │ │ ├── style_setting.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── select_dialog.dart
│ │ │ ├── select_item.dart
│ │ │ ├── slide_dialog.dart
│ │ │ └── switch_item.dart
│ │ ├── subscription/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ └── item.dart
│ │ ├── subscription_detail/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── view.dart
│ │ │ └── widget/
│ │ │ └── sub_video_card.dart
│ │ ├── video/
│ │ │ ├── README.md
│ │ │ └── detail/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── introduction/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ ├── view.dart
│ │ │ │ └── widgets/
│ │ │ │ ├── action_item.dart
│ │ │ │ ├── action_row_item.dart
│ │ │ │ ├── fav_panel.dart
│ │ │ │ ├── group_panel.dart
│ │ │ │ ├── intro_detail.dart
│ │ │ │ ├── menu_row.dart
│ │ │ │ ├── page_panel.dart
│ │ │ │ ├── season_panel.dart
│ │ │ │ └── staff_up_item.dart
│ │ │ ├── related/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ └── view.dart
│ │ │ ├── reply/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ ├── view.dart
│ │ │ │ └── widgets/
│ │ │ │ ├── reply_item.dart
│ │ │ │ ├── reply_save.dart
│ │ │ │ └── zan.dart
│ │ │ ├── reply_new/
│ │ │ │ ├── index.dart
│ │ │ │ ├── toolbar_icon_button.dart
│ │ │ │ └── view.dart
│ │ │ ├── reply_reply/
│ │ │ │ ├── controller.dart
│ │ │ │ ├── index.dart
│ │ │ │ └── view.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── ai_detail.dart
│ │ │ ├── app_bar.dart
│ │ │ ├── expandable_section.dart
│ │ │ ├── header_control.dart
│ │ │ ├── right_drawer.dart
│ │ │ └── watch_later_list.dart
│ │ ├── webview/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ ├── whisper/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ └── view.dart
│ │ └── whisper_detail/
│ │ ├── controller.dart
│ │ ├── index.dart
│ │ ├── view.dart
│ │ └── widget/
│ │ └── chat_item.dart
│ ├── plugin/
│ │ ├── pl_gallery/
│ │ │ ├── custom_dismissible.dart
│ │ │ ├── hero_dialog_route.dart
│ │ │ ├── index.dart
│ │ │ ├── interactive_viewer_boundary.dart
│ │ │ └── interactiveviewer_gallery.dart
│ │ ├── pl_player/
│ │ │ ├── controller.dart
│ │ │ ├── index.dart
│ │ │ ├── models/
│ │ │ │ ├── bottom_control_type.dart
│ │ │ │ ├── bottom_progress_behavior.dart
│ │ │ │ ├── data_source.dart
│ │ │ │ ├── data_status.dart
│ │ │ │ ├── duration.dart
│ │ │ │ ├── fullscreen_mode.dart
│ │ │ │ ├── play_repeat.dart
│ │ │ │ ├── play_speed.dart
│ │ │ │ └── play_status.dart
│ │ │ ├── utils/
│ │ │ │ └── fullscreen.dart
│ │ │ ├── utils.dart
│ │ │ ├── view.dart
│ │ │ └── widgets/
│ │ │ ├── app_bar_ani.dart
│ │ │ ├── backward_seek.dart
│ │ │ ├── bottom_control.dart
│ │ │ ├── common_btn.dart
│ │ │ ├── control_bar.dart
│ │ │ ├── forward_seek.dart
│ │ │ └── play_pause_btn.dart
│ │ ├── pl_popup/
│ │ │ └── index.dart
│ │ └── pl_socket/
│ │ └── index.dart
│ ├── router/
│ │ └── app_pages.dart
│ ├── scripts/
│ │ └── build.sh
│ ├── services/
│ │ ├── audio_handler.dart
│ │ ├── audio_session.dart
│ │ ├── disable_battery_opt.dart
│ │ ├── loggeer.dart
│ │ ├── service_locator.dart
│ │ └── shutdown_timer_service.dart
│ └── utils/
│ ├── app_scheme.dart
│ ├── binary_writer.dart
│ ├── cache_manage.dart
│ ├── cookie.dart
│ ├── danmaku.dart
│ ├── data.dart
│ ├── download.dart
│ ├── drawer.dart
│ ├── em.dart
│ ├── event_bus.dart
│ ├── extension.dart
│ ├── feed_back.dart
│ ├── global_data_cache.dart
│ ├── highlight.dart
│ ├── id_utils.dart
│ ├── image_save.dart
│ ├── live.dart
│ ├── login.dart
│ ├── main_stream.dart
│ ├── proxy.dart
│ ├── recommend_filter.dart
│ ├── route_push.dart
│ ├── storage.dart
│ ├── subtitle.dart
│ ├── url_utils.dart
│ ├── utils.dart
│ ├── video_utils.dart
│ └── wbi_sign.dart
├── linux/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── flutter/
│ │ └── CMakeLists.txt
│ ├── main.cc
│ ├── my_application.cc
│ └── my_application.h
├── macos/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── Flutter-Debug.xcconfig
│ │ └── Flutter-Release.xcconfig
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── MainMenu.xib
│ │ ├── Configs/
│ │ │ ├── AppInfo.xcconfig
│ │ │ ├── Debug.xcconfig
│ │ │ ├── Release.xcconfig
│ │ │ └── Warnings.xcconfig
│ │ ├── DebugProfile.entitlements
│ │ ├── Info.plist
│ │ ├── MainFlutterWindow.swift
│ │ └── Release.entitlements
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ └── Runner.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ └── IDEWorkspaceChecks.plist
├── pubspec.yaml
├── test/
│ └── widget_test.dart
├── web/
│ ├── index.html
│ └── manifest.json
└── windows/
├── .gitignore
├── CMakeLists.txt
├── flutter/
│ └── CMakeLists.txt
└── runner/
├── CMakeLists.txt
├── Runner.rc
├── flutter_window.cpp
├── flutter_window.h
├── main.cpp
├── resource.h
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
Showing preview only (245K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3342 symbols across 394 files)
FILE: lib/common/constants.dart
class StyleString (line 3) | class StyleString {
class Constants (line 11) | class Constants {
FILE: lib/common/pages_bottom_sheet.dart
class EpisodeBottomSheet (line 7) | class EpisodeBottomSheet {
method buildEpisodeListItem (line 28) | Widget buildEpisodeListItem(
method buildTitle (line 96) | Widget buildTitle()
method buildShowContent (line 117) | Widget buildShowContent(BuildContext context)
method show (line 163) | PersistentBottomSheetController show(BuildContext context)
FILE: lib/common/skeleton/dynamic_card.dart
class DynamicCardSkeleton (line 4) | class DynamicCardSkeleton extends StatelessWidget {
method build (line 8) | Widget build(BuildContext context)
FILE: lib/common/skeleton/media_bangumi.dart
class MediaBangumiSkeleton (line 6) | class MediaBangumiSkeleton extends StatefulWidget {
method createState (line 10) | State<MediaBangumiSkeleton> createState()
class _MediaBangumiSkeletonState (line 13) | class _MediaBangumiSkeletonState extends State<MediaBangumiSkeleton> {
method build (line 15) | Widget build(BuildContext context)
FILE: lib/common/skeleton/skeleton.dart
class Skeleton (line 3) | class Skeleton extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
class Shimmer (line 40) | class Shimmer extends StatefulWidget {
method of (line 41) | ShimmerState? of(BuildContext context)
method createState (line 55) | ShimmerState createState()
class ShimmerState (line 58) | class ShimmerState extends State<Shimmer> with SingleTickerProviderState...
method initState (line 62) | void initState()
method dispose (line 70) | void dispose()
method getDescendantOffset (line 90) | Offset getDescendantOffset({
method build (line 101) | Widget build(BuildContext context)
class _SlidingGradientTransform (line 106) | class _SlidingGradientTransform extends GradientTransform {
method transform (line 114) | Matrix4? transform(Rect bounds, {TextDirection? textDirection})
class ShimmerLoading (line 119) | class ShimmerLoading extends StatefulWidget {
method createState (line 130) | State<ShimmerLoading> createState()
class _ShimmerLoadingState (line 133) | class _ShimmerLoadingState extends State<ShimmerLoading> {
method didChangeDependencies (line 137) | void didChangeDependencies()
method dispose (line 149) | void dispose()
method _onShimmerChange (line 154) | void _onShimmerChange()
method build (line 161) | Widget build(BuildContext context)
FILE: lib/common/skeleton/video_card_h.dart
class VideoCardHSkeleton (line 5) | class VideoCardHSkeleton extends StatelessWidget {
method build (line 9) | Widget build(BuildContext context)
FILE: lib/common/skeleton/video_card_v.dart
class VideoCardVSkeleton (line 5) | class VideoCardVSkeleton extends StatelessWidget {
method build (line 9) | Widget build(BuildContext context)
FILE: lib/common/skeleton/video_reply.dart
class VideoReplySkeleton (line 4) | class VideoReplySkeleton extends StatelessWidget {
method build (line 8) | Widget build(BuildContext context)
FILE: lib/common/widgets/animated_dialog.dart
class AnimatedDialog (line 3) | class AnimatedDialog extends StatefulWidget {
method createState (line 11) | State<StatefulWidget> createState()
class AnimatedDialogState (line 14) | class AnimatedDialogState extends State<AnimatedDialog>
method initState (line 21) | void initState()
method dispose (line 35) | void dispose()
method build (line 41) | Widget build(BuildContext context)
FILE: lib/common/widgets/app_expansion_panel_list.dart
class _SaltedKey (line 5) | class _SaltedKey<S, V> extends LocalKey {
method toString (line 23) | String toString()
class AppExpansionPanelList (line 30) | class AppExpansionPanelList extends StatefulWidget {
method createState (line 97) | State<AppExpansionPanelList> createState()
class _AppExpansionPanelListState (line 100) | class _AppExpansionPanelListState extends State<AppExpansionPanelList> {
method initState (line 104) | void initState()
method didUpdateWidget (line 118) | void didUpdateWidget(AppExpansionPanelList oldWidget)
method _allIdentifiersUnique (line 136) | bool _allIdentifiersUnique()
method _isChildExpanded (line 145) | bool _isChildExpanded(int index)
method _handlePressed (line 154) | void _handlePressed(bool isExpanded, int index)
method searchPanelByValue (line 181) | ExpansionPanelRadio? searchPanelByValue(
method build (line 190) | Widget build(BuildContext context)
type ExpansionPanelIconBuilder (line 303) | typedef ExpansionPanelIconBuilder = Widget? Function(
class AppExpansionPanel (line 308) | class AppExpansionPanel {
FILE: lib/common/widgets/appbar.dart
class AppBarWidget (line 3) | class AppBarWidget extends StatelessWidget implements PreferredSizeWidget {
method build (line 19) | Widget build(BuildContext context)
FILE: lib/common/widgets/badge.dart
class PBadge (line 3) | class PBadge extends StatelessWidget {
method build (line 28) | Widget build(BuildContext context)
FILE: lib/common/widgets/content_container.dart
class ContentContainer (line 3) | class ContentContainer extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: lib/common/widgets/custom_toast.dart
class CustomToast (line 7) | class CustomToast extends StatelessWidget {
method build (line 13) | Widget build(BuildContext context)
FILE: lib/common/widgets/html_render.dart
class HtmlRender (line 9) | class HtmlRender extends StatelessWidget {
method build (line 22) | Widget build(BuildContext context)
FILE: lib/common/widgets/http_error.dart
class HttpError (line 4) | class HttpError extends StatelessWidget {
method build (line 19) | Widget build(BuildContext context)
FILE: lib/common/widgets/live_card.dart
class LiveCard (line 6) | class LiveCard extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
class LiveContent (line 77) | class LiveContent extends StatelessWidget {
method build (line 82) | Widget build(BuildContext context)
class LiveStat (line 116) | class LiveStat extends StatelessWidget {
method build (line 122) | Widget build(BuildContext context)
FILE: lib/common/widgets/network_img_layer.dart
class NetworkImgLayer (line 11) | class NetworkImgLayer extends StatelessWidget {
method build (line 35) | Widget build(BuildContext context)
method setMemCacheSizes (line 45) | void setMemCacheSizes()
method placeholder (line 99) | Widget placeholder(BuildContext context)
FILE: lib/common/widgets/no_data.dart
class NoData (line 4) | class NoData extends StatelessWidget {
method build (line 8) | Widget build(BuildContext context)
FILE: lib/common/widgets/sliver_header.dart
class SliverHeaderDelegate (line 3) | class SliverHeaderDelegate extends SliverPersistentHeaderDelegate {
method build (line 10) | Widget build(
method shouldRebuild (line 22) | bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate)
FILE: lib/common/widgets/stat/danmu.dart
class StatDanMu (line 4) | class StatDanMu extends StatelessWidget {
method build (line 13) | Widget build(BuildContext context)
class StatIconText (line 29) | class StatIconText extends StatelessWidget {
method build (line 44) | Widget build(BuildContext context)
FILE: lib/common/widgets/stat/view.dart
class StatView (line 4) | class StatView extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
class StatIconText (line 33) | class StatIconText extends StatelessWidget {
method build (line 48) | Widget build(BuildContext context)
FILE: lib/common/widgets/video_card_h.dart
class VideoCardH (line 20) | class VideoCardH extends StatelessWidget {
method build (line 44) | Widget build(BuildContext context)
class VideoContent (line 169) | class VideoContent extends StatelessWidget {
method build (line 191) | Widget build(BuildContext context)
class MorePanel (line 321) | class MorePanel extends StatelessWidget {
method menuActionHandler (line 325) | Future<dynamic> menuActionHandler(String type)
method blockUser (line 339) | void blockUser()
method build (line 375) | Widget build(BuildContext context)
FILE: lib/common/widgets/video_card_v.dart
class VideoCardV (line 20) | class VideoCardV extends StatelessWidget {
method isStringNumeric (line 32) | bool isStringNumeric(String str)
method onPushDetail (line 37) | void onPushDetail(heroTag)
method build (line 110) | Widget build(BuildContext context)
class VideoContent (line 168) | class VideoContent extends StatelessWidget {
method _buildBadge (line 180) | Widget _buildBadge(String text, String type, [double fs = 12])
method build (line 191) | Widget build(BuildContext context)
class VideoStat (line 271) | class VideoStat extends StatelessWidget {
method build (line 282) | Widget build(BuildContext context)
class MorePanel (line 306) | class MorePanel extends StatelessWidget {
method menuActionHandler (line 315) | Future<dynamic> menuActionHandler(String type)
method blockUser (line 330) | void blockUser()
method build (line 369) | Widget build(BuildContext context)
FILE: lib/http/api.dart
class Api (line 3) | class Api {
FILE: lib/http/bangumi.dart
class BangumiHttp (line 4) | class BangumiHttp {
method bangumiList (line 5) | Future bangumiList({int? page})
method bangumiFollow (line 21) | Future bangumiFollow({int? mid})
FILE: lib/http/black.dart
class BlackHttp (line 4) | class BlackHttp {
method blackList (line 5) | Future blackList({required int pn, int? ps})
method removeBlack (line 28) | Future removeBlack({required int fid})
FILE: lib/http/common.dart
class CommonHttp (line 3) | class CommonHttp {
method unReadDynamic (line 4) | Future unReadDynamic()
FILE: lib/http/constants.dart
class HttpString (line 1) | class HttpString {
FILE: lib/http/danmaku.dart
class DanmakaHttp (line 5) | class DanmakaHttp {
method queryDanmaku (line 7) | Future queryDanmaku({
method shootDanmaku (line 25) | Future shootDanmaku({
FILE: lib/http/dynamics.dart
class DynamicsHttp (line 7) | class DynamicsHttp {
method followDynamic (line 8) | Future followDynamic({
method followUp (line 50) | Future followUp()
method likeDynamic (line 67) | Future likeDynamic({
method dynamicDetail (line 94) | Future dynamicDetail({
method dynamicForward (line 124) | Future dynamicForward()
method dynamicCreate (line 156) | Future dynamicCreate({
FILE: lib/http/fan.dart
class FanHttp (line 4) | class FanHttp {
method fans (line 5) | Future fans({int? vmid, int? pn, int? ps, String? orderType})
FILE: lib/http/fav.dart
class FavHttp (line 3) | class FavHttp {
method editFolder (line 5) | Future editFolder({
method addFolder (line 38) | Future addFolder({
FILE: lib/http/follow.dart
class FollowHttp (line 4) | class FollowHttp {
method followings (line 5) | Future followings(
FILE: lib/http/html.dart
class HtmlHttp (line 5) | class HtmlHttp {
method reqHtml (line 7) | Future reqHtml(id, dynamicType)
method reqReadHtml (line 70) | Future reqReadHtml(id, dynamicType)
FILE: lib/http/init.dart
class Request (line 20) | class Request {
method setCookie (line 35) | setCookie()
method getCsrf (line 79) | Future<String> getCsrf()
method getBuvid (line 89) | Future<String> getBuvid()
method setOptionsHeaders (line 113) | setOptionsHeaders(userInfo, bool status)
method buvidActivate (line 125) | Future buvidActivate()
method get (line 220) | get(url, {data, options, cancelToken, extra})
method cancelRequests (line 307) | void cancelRequests(CancelToken token)
method headerUa (line 311) | String headerUa({type = 'mob'})
method setBaseUrl (line 328) | setBaseUrl({String type = 'default'})
FILE: lib/http/interceptor.dart
class ApiInterceptor (line 9) | class ApiInterceptor extends Interceptor {
method onRequest (line 11) | void onRequest(RequestOptions options, RequestInterceptorHandler handler)
method onResponse (line 20) | void onResponse(Response response, ResponseInterceptorHandler handler)
method onError (line 45) | void onError(DioException err, ErrorInterceptorHandler handler)
method dioError (line 59) | Future<String> dioError(DioException error)
method checkConnect (line 81) | Future<String> checkConnect()
FILE: lib/http/live.dart
class LiveHttp (line 9) | class LiveHttp {
method liveList (line 10) | Future liveList(
method liveRoomInfo (line 30) | Future liveRoomInfo({roomId, qn})
method liveRoomInfoH5 (line 53) | Future liveRoomInfoH5({roomId, qn})
method liveDanmakuInfo (line 72) | Future liveDanmakuInfo({roomId})
method sendDanmaku (line 91) | Future sendDanmaku({roomId, msg})
method liveFollowing (line 127) | Future liveFollowing({int? pn, int? ps})
method liveRoomEntry (line 150) | Future liveRoomEntry({required int roomId})
FILE: lib/http/login.dart
class LoginHttp (line 12) | class LoginHttp {
method queryCaptcha (line 13) | Future queryCaptcha()
method sendWebSmsCode (line 53) | Future sendWebSmsCode({
method loginInByWebSmsCode (line 86) | Future loginInByWebSmsCode({
method liginInByWebPwd (line 118) | Future liginInByWebPwd()
method sendAppSmsCode (line 121) | Future sendAppSmsCode({
method buvid (line 156) | String buvid()
method getWebKey (line 173) | Future getWebKey()
method loginInByMobPwd (line 184) | Future loginInByMobPwd({
method loginInByWebPwd (line 207) | Future loginInByWebPwd({
method getWebQrcode (line 255) | Future getWebQrcode()
method queryWebQrcodeStatus (line 268) | Future queryWebQrcodeStatus(String qrcodeKey)
FILE: lib/http/member.dart
class MemberHttp (line 20) | class MemberHttp {
method memberInfo (line 21) | Future memberInfo({
method memberStat (line 50) | Future memberStat({int? mid})
method memberCardInfo (line 63) | Future memberCardInfo({int? mid})
method memberArchive (line 77) | Future memberArchive({
method memberDynamic (line 133) | Future memberDynamic({String? offset, int? mid})
method memberDynamicSearch (line 158) | Future memberDynamicSearch({int? pn, int? ps, int? mid})
method followUpTags (line 181) | Future followUpTags()
method addUsers (line 200) | Future addUsers(int? fids, String? tagids)
method followUpGroup (line 222) | Future followUpGroup(
method getTopVideo (line 252) | Future getTopVideo(String? vmid)
method getMemberSeasons (line 271) | Future getMemberSeasons(int? mid, int? pn, int? ps)
method getRecentCoinVideo (line 292) | Future getRecentCoinVideo({required int mid})
method getRecentLikeVideo (line 325) | Future getRecentLikeVideo({required int mid})
method getSeasonDetail (line 358) | Future getSeasonDetail({
method getTVCode (line 394) | Future getTVCode()
method cookieToKey (line 424) | Future cookieToKey()
method qrcodePoll (line 449) | Future qrcodePoll(authCode)
method memberView (line 482) | Future memberView({required int mid})
method getfollowSearch (line 496) | Future getfollowSearch({
method getSeriesDetail (line 532) | Future getSeriesDetail({
method getWWebid (line 568) | Future getWWebid({required int mid})
method getMemberArticle (line 588) | Future getMemberArticle({
FILE: lib/http/msg.dart
class MsgHttp (line 12) | class MsgHttp {
method sessionList (line 14) | Future sessionList({int? endTs})
method accountList (line 51) | Future accountList(uids)
method sessionMsg (line 77) | Future sessionMsg({
method ackSessionMsg (line 108) | Future ackSessionMsg({
method sendMsg (line 134) | Future sendMsg({
method getDevId (line 171) | String getDevId()
method removeSession (line 205) | Future removeSession({
method unread (line 228) | Future unread()
method messageReply (line 241) | Future messageReply({
method messageLike (line 265) | Future messageLike({
method messageSystem (line 288) | Future messageSystem()
method systemMarkRead (line 312) | Future systemMarkRead(int cursor)
method messageSystemAccount (line 330) | Future messageSystemAccount()
FILE: lib/http/read.dart
class ReadHttp (line 8) | class ReadHttp {
method extractScriptContents (line 9) | List<String> extractScriptContents(String htmlContent)
method parseArticleOpus (line 21) | Future parseArticleOpus({required String id})
method parseArticleCv (line 64) | Future parseArticleCv({required String id})
method getViewInfo (line 83) | Future getViewInfo({required String id})
FILE: lib/http/reply.dart
class ReplyHttp (line 6) | class ReplyHttp {
method replyList (line 7) | Future replyList({
method replyReplyList (line 37) | Future replyReplyList({
method likeReply (line 73) | Future likeReply({
method getEmoteList (line 100) | Future getEmoteList({String? business})
method replyDel (line 119) | Future replyDel({
FILE: lib/http/search.dart
class SearchHttp (line 13) | class SearchHttp {
method hotSearchList (line 15) | Future hotSearchList()
method searchSuggest (line 40) | Future searchSuggest({required term})
method searchByType (line 72) | Future searchByType({
method ab2c (line 137) | Future<int> ab2c({int? aid, String? bvid})
method bangumiInfo (line 153) | Future<Map<String, dynamic>> bangumiInfo(
method ab2cWithPic (line 177) | Future<Map<String, dynamic>> ab2cWithPic(
method searchCount (line 193) | Future<Map<String, dynamic>> searchCount(
class Data (line 216) | class Data {
FILE: lib/http/user.dart
class UserHttp (line 19) | class UserHttp {
method userStat (line 20) | Future<dynamic> userStat({required int mid})
method userInfo (line 29) | Future<dynamic> userInfo()
method userStatOwner (line 39) | Future<dynamic> userStatOwner()
method userfavFolder (line 50) | Future<dynamic> userfavFolder({
method userFavFolderDetail (line 78) | Future<dynamic> userFavFolderDetail(
method seeYouLater (line 104) | Future<dynamic> seeYouLater()
method historyList (line 132) | Future historyList(int? max, int? viewAt)
method pauseHistory (line 152) | Future pauseHistory(bool switchStatus)
method historyStatus (line 166) | Future historyStatus()
method clearHistory (line 172) | Future clearHistory()
method toViewLater (line 184) | Future toViewLater({String? bvid, dynamic aid})
method toViewDel (line 203) | Future toViewDel({int? aid})
method thirdLogin (line 222) | Future thirdLogin()
method toViewClear (line 241) | Future toViewClear()
method delHistory (line 257) | Future delHistory(kid)
method hasFollow (line 273) | Future hasFollow(int mid)
method searchHistory (line 312) | Future searchHistory(
method userSubFolder (line 330) | Future userSubFolder({
method userSeasonList (line 356) | Future userSeasonList({
method userResourceList (line 376) | Future userResourceList({
method cancelSub (line 406) | Future cancelSub({required int seasonId})
method delFavFolder (line 423) | Future delFavFolder({required int mediaIds})
method extractScriptContents (line 464) | List<String> extractScriptContents(String htmlContent)
method getMediaList (line 476) | Future getMediaList({
method parseFavVideo (line 514) | Future parseFavVideo({
FILE: lib/http/video.dart
class VideoHttp (line 24) | class VideoHttp {
method rcmdVideoList (line 32) | Future rcmdVideoList({required int ps, required int freshIdx})
method rcmdVideoListApp (line 71) | Future rcmdVideoListApp(
method hotVideoList (line 114) | Future hotVideoList({required int pn, required int ps})
method videoUrl (line 139) | Future videoUrl(
method videoIntro (line 189) | Future videoIntro({required String bvid})
method relatedVideoList (line 205) | Future relatedVideoList({required String bvid})
method hasLikeVideo (line 222) | Future hasLikeVideo({required String bvid})
method hasCoinVideo (line 232) | Future hasCoinVideo({required String bvid})
method coinVideo (line 243) | Future coinVideo({required String bvid, required int multiply})
method hasFavVideo (line 261) | Future hasFavVideo({required int aid})
method oneThree (line 271) | Future oneThree({required String bvid})
method likeVideo (line 287) | Future likeVideo({required String bvid, required bool type})
method favVideo (line 304) | Future favVideo(
method videoInFolder (line 324) | Future videoInFolder({required int mid, required int rid})
method replyAdd (line 343) | Future replyAdd({
method hasFollow (line 373) | Future hasFollow({required int mid})
method relationMod (line 383) | Future relationMod(
method heartBeat (line 408) | Future heartBeat({bvid, cid, progress, realtime})
method bangumiAdd (line 428) | Future bangumiAdd({int? seasonId})
method bangumiDel (line 444) | Future bangumiDel({int? seasonId})
method onlineTotal (line 460) | Future onlineTotal({int? aid, String? bvid, int? cid})
method aiConclusion (line 473) | Future aiConclusion({
method getSubtitle (line 494) | Future getSubtitle({int? cid, String? bvid})
method getRankVideoList (line 514) | Future getRankVideoList(int rid)
method getSubtitleContent (line 537) | Future<Map<String, dynamic>> getSubtitleContent(url)
FILE: lib/main.dart
function main (line 30) | void main()
class MyApp (line 70) | class MyApp extends StatelessWidget {
method build (line 74) | Widget build(BuildContext context)
class AndroidApp (line 125) | class AndroidApp extends StatelessWidget {
method build (line 140) | Widget build(BuildContext context)
class OtherApp (line 171) | class OtherApp extends StatelessWidget {
method build (line 184) | Widget build(BuildContext context)
class BuildMainApp (line 200) | class BuildMainApp extends StatelessWidget {
method build (line 215) | Widget build(BuildContext context)
FILE: lib/models/bangumi/info.dart
class BangumiInfoModel (line 1) | class BangumiInfoModel {
class EpisodeItem (line 129) | class EpisodeItem {
FILE: lib/models/bangumi/list.dart
class BangumiListDataModel (line 1) | class BangumiListDataModel {
class BangumiListItemModel (line 29) | class BangumiListItemModel {
FILE: lib/models/common/action_type.dart
type ActionType (line 5) | enum ActionType {
FILE: lib/models/common/business_type.dart
type BusinessType (line 1) | enum BusinessType {
FILE: lib/models/common/dynamic_badge_mode.dart
type DynamicBadgeMode (line 1) | enum DynamicBadgeMode { hidden, point, number }
FILE: lib/models/common/dynamics_type.dart
type DynamicsType (line 1) | enum DynamicsType {
FILE: lib/models/common/gesture_mode.dart
type FullScreenGestureMode (line 1) | enum FullScreenGestureMode {
FILE: lib/models/common/rank_type.dart
type RandType (line 4) | enum RandType {
FILE: lib/models/common/rcmd_type.dart
type RcmdType (line 2) | enum RcmdType { web, app, notLogin }
FILE: lib/models/common/reply_sort_type.dart
type ReplySortType (line 1) | enum ReplySortType { time, like }
FILE: lib/models/common/reply_type.dart
type ReplyType (line 1) | enum ReplyType {
FILE: lib/models/common/search_type.dart
type SearchType (line 2) | enum SearchType {
type ArchiveFilterType (line 32) | enum ArchiveFilterType {
type ArticleFilterType (line 49) | enum ArticleFilterType {
FILE: lib/models/common/tab_type.dart
type TabType (line 8) | enum TabType { live, rcmd, hot, bangumi }
FILE: lib/models/common/theme_type.dart
type ThemeType (line 1) | enum ThemeType {
FILE: lib/models/common/video_episode_type.dart
type VideoEpidoesType (line 1) | enum VideoEpidoesType {
FILE: lib/models/danmaku/dm.pb.dart
class Avatar (line 18) | class Avatar extends $pb.GeneratedMessage {
method clone (line 76) | Avatar clone()
method copyWith (line 80) | Avatar copyWith(void Function(Avatar) updates)
method create (line 85) | Avatar create()
method createEmptyInstance (line 86) | Avatar createEmptyInstance()
method createRepeated (line 87) | $pb.PbList<Avatar> createRepeated()
method getDefault (line 89) | Avatar getDefault()
method hasId (line 101) | $core.bool hasId()
method clearId (line 103) | void clearId()
method hasUrl (line 113) | $core.bool hasUrl()
method clearUrl (line 115) | void clearUrl()
method hasAvatarType (line 125) | $core.bool hasAvatarType()
method clearAvatarType (line 127) | void clearAvatarType()
class Bubble (line 130) | class Bubble extends $pb.GeneratedMessage {
method clone (line 175) | Bubble clone()
method copyWith (line 179) | Bubble copyWith(void Function(Bubble) updates)
method create (line 184) | Bubble create()
method createEmptyInstance (line 185) | Bubble createEmptyInstance()
method createRepeated (line 186) | $pb.PbList<Bubble> createRepeated()
method getDefault (line 188) | Bubble getDefault()
method hasText (line 200) | $core.bool hasText()
method clearText (line 202) | void clearText()
method hasUrl (line 212) | $core.bool hasUrl()
method clearUrl (line 214) | void clearUrl()
class BubbleV2 (line 217) | class BubbleV2 extends $pb.GeneratedMessage {
method clone (line 297) | BubbleV2 clone()
method copyWith (line 301) | BubbleV2 copyWith(void Function(BubbleV2) updates)
method create (line 306) | BubbleV2 create()
method createEmptyInstance (line 307) | BubbleV2 createEmptyInstance()
method createRepeated (line 308) | $pb.PbList<BubbleV2> createRepeated()
method getDefault (line 310) | BubbleV2 getDefault()
method hasText (line 322) | $core.bool hasText()
method clearText (line 324) | void clearText()
method hasUrl (line 334) | $core.bool hasUrl()
method clearUrl (line 336) | void clearUrl()
method hasBubbleType (line 346) | $core.bool hasBubbleType()
method clearBubbleType (line 348) | void clearBubbleType()
method hasExposureOnce (line 358) | $core.bool hasExposureOnce()
method clearExposureOnce (line 360) | void clearExposureOnce()
method hasExposureType (line 370) | $core.bool hasExposureType()
method clearExposureType (line 372) | void clearExposureType()
class Button (line 375) | class Button extends $pb.GeneratedMessage {
method clone (line 421) | Button clone()
method copyWith (line 425) | Button copyWith(void Function(Button) updates)
method create (line 430) | Button create()
method createEmptyInstance (line 431) | Button createEmptyInstance()
method createRepeated (line 432) | $pb.PbList<Button> createRepeated()
method getDefault (line 434) | Button getDefault()
method hasText (line 446) | $core.bool hasText()
method clearText (line 448) | void clearText()
method hasAction (line 458) | $core.bool hasAction()
method clearAction (line 460) | void clearAction()
class BuzzwordConfig (line 463) | class BuzzwordConfig extends $pb.GeneratedMessage {
method clone (line 501) | BuzzwordConfig clone()
method copyWith (line 505) | BuzzwordConfig copyWith(void Function(BuzzwordConfig) updates)
method create (line 510) | BuzzwordConfig create()
method createEmptyInstance (line 511) | BuzzwordConfig createEmptyInstance()
method createRepeated (line 512) | $pb.PbList<BuzzwordConfig> createRepeated()
method getDefault (line 515) | BuzzwordConfig getDefault()
class BuzzwordShowConfig (line 523) | class BuzzwordShowConfig extends $pb.GeneratedMessage {
method clone (line 606) | BuzzwordShowConfig clone()
method copyWith (line 610) | BuzzwordShowConfig copyWith(void Function(BuzzwordShowConfig) updates)
method create (line 615) | BuzzwordShowConfig create()
method createEmptyInstance (line 616) | BuzzwordShowConfig createEmptyInstance()
method createRepeated (line 617) | $pb.PbList<BuzzwordShowConfig> createRepeated()
method getDefault (line 620) | BuzzwordShowConfig getDefault()
method hasName (line 632) | $core.bool hasName()
method clearName (line 634) | void clearName()
method hasSchema (line 644) | $core.bool hasSchema()
method clearSchema (line 646) | void clearSchema()
method hasSource (line 656) | $core.bool hasSource()
method clearSource (line 658) | void clearSource()
method hasId (line 668) | $core.bool hasId()
method clearId (line 670) | void clearId()
method hasBuzzwordId (line 680) | $core.bool hasBuzzwordId()
method clearBuzzwordId (line 682) | void clearBuzzwordId()
method hasSchemaType (line 692) | $core.bool hasSchemaType()
method clearSchemaType (line 694) | void clearSchemaType()
class CheckBox (line 697) | class CheckBox extends $pb.GeneratedMessage {
method clone (line 764) | CheckBox clone()
method copyWith (line 768) | CheckBox copyWith(void Function(CheckBox) updates)
method create (line 773) | CheckBox create()
method createEmptyInstance (line 774) | CheckBox createEmptyInstance()
method createRepeated (line 775) | $pb.PbList<CheckBox> createRepeated()
method getDefault (line 777) | CheckBox getDefault()
method hasText (line 789) | $core.bool hasText()
method clearText (line 791) | void clearText()
method hasType (line 801) | $core.bool hasType()
method clearType (line 803) | void clearType()
method hasDefaultValue (line 813) | $core.bool hasDefaultValue()
method clearDefaultValue (line 815) | void clearDefaultValue()
method hasShow (line 825) | $core.bool hasShow()
method clearShow (line 827) | void clearShow()
class CheckBoxV2 (line 830) | class CheckBoxV2 extends $pb.GeneratedMessage {
method clone (line 885) | CheckBoxV2 clone()
method copyWith (line 889) | CheckBoxV2 copyWith(void Function(CheckBoxV2) updates)
method create (line 894) | CheckBoxV2 create()
method createEmptyInstance (line 895) | CheckBoxV2 createEmptyInstance()
method createRepeated (line 896) | $pb.PbList<CheckBoxV2> createRepeated()
method getDefault (line 898) | CheckBoxV2 getDefault()
method hasText (line 910) | $core.bool hasText()
method clearText (line 912) | void clearText()
method hasType (line 922) | $core.bool hasType()
method clearType (line 924) | void clearType()
method hasDefaultValue (line 934) | $core.bool hasDefaultValue()
method clearDefaultValue (line 936) | void clearDefaultValue()
class ClickButton (line 939) | class ClickButton extends $pb.GeneratedMessage {
method clone (line 1034) | ClickButton clone()
method copyWith (line 1038) | ClickButton copyWith(void Function(ClickButton) updates)
method create (line 1043) | ClickButton create()
method createEmptyInstance (line 1044) | ClickButton createEmptyInstance()
method createRepeated (line 1045) | $pb.PbList<ClickButton> createRepeated()
method getDefault (line 1047) | ClickButton getDefault()
method hasRenderType (line 1071) | $core.bool hasRenderType()
method clearRenderType (line 1073) | void clearRenderType()
method hasShow (line 1083) | $core.bool hasShow()
method clearShow (line 1085) | void clearShow()
method hasBubble (line 1095) | $core.bool hasBubble()
method clearBubble (line 1097) | void clearBubble()
method ensureBubble (line 1099) | Bubble ensureBubble()
class ClickButtonV2 (line 1102) | class ClickButtonV2 extends $pb.GeneratedMessage {
method clone (line 1203) | ClickButtonV2 clone()
method copyWith (line 1207) | ClickButtonV2 copyWith(void Function(ClickButtonV2) updates)
method create (line 1212) | ClickButtonV2 create()
method createEmptyInstance (line 1213) | ClickButtonV2 createEmptyInstance()
method createRepeated (line 1214) | $pb.PbList<ClickButtonV2> createRepeated()
method getDefault (line 1217) | ClickButtonV2 getDefault()
method hasRenderType (line 1241) | $core.bool hasRenderType()
method clearRenderType (line 1243) | void clearRenderType()
method hasTextInputPost (line 1253) | $core.bool hasTextInputPost()
method clearTextInputPost (line 1255) | void clearTextInputPost()
method hasExposureOnce (line 1265) | $core.bool hasExposureOnce()
method clearExposureOnce (line 1267) | void clearExposureOnce()
method hasExposureType (line 1277) | $core.bool hasExposureType()
method clearExposureType (line 1279) | void clearExposureType()
class CommandDm (line 1282) | class CommandDm extends $pb.GeneratedMessage {
method clone (line 1401) | CommandDm clone()
method copyWith (line 1405) | CommandDm copyWith(void Function(CommandDm) updates)
method create (line 1410) | CommandDm create()
method createEmptyInstance (line 1411) | CommandDm createEmptyInstance()
method createRepeated (line 1412) | $pb.PbList<CommandDm> createRepeated()
method getDefault (line 1414) | CommandDm getDefault()
method hasId (line 1426) | $core.bool hasId()
method clearId (line 1428) | void clearId()
method hasOid (line 1438) | $core.bool hasOid()
method clearOid (line 1440) | void clearOid()
method hasMid (line 1450) | $core.bool hasMid()
method clearMid (line 1452) | void clearMid()
method hasCommand (line 1462) | $core.bool hasCommand()
method clearCommand (line 1464) | void clearCommand()
method hasContent (line 1474) | $core.bool hasContent()
method clearContent (line 1476) | void clearContent()
method hasProgress (line 1486) | $core.bool hasProgress()
method clearProgress (line 1488) | void clearProgress()
method hasCtime (line 1498) | $core.bool hasCtime()
method clearCtime (line 1500) | void clearCtime()
method hasMtime (line 1510) | $core.bool hasMtime()
method clearMtime (line 1512) | void clearMtime()
method hasExtra (line 1522) | $core.bool hasExtra()
method clearExtra (line 1524) | void clearExtra()
method hasIdStr (line 1534) | $core.bool hasIdStr()
method clearIdStr (line 1536) | void clearIdStr()
class DanmakuAIFlag (line 1539) | class DanmakuAIFlag extends $pb.GeneratedMessage {
method clone (line 1577) | DanmakuAIFlag clone()
method copyWith (line 1581) | DanmakuAIFlag copyWith(void Function(DanmakuAIFlag) updates)
method create (line 1586) | DanmakuAIFlag create()
method createEmptyInstance (line 1587) | DanmakuAIFlag createEmptyInstance()
method createRepeated (line 1588) | $pb.PbList<DanmakuAIFlag> createRepeated()
method getDefault (line 1591) | DanmakuAIFlag getDefault()
class DanmakuElem (line 1599) | class DanmakuElem extends $pb.GeneratedMessage {
method clone (line 1761) | DanmakuElem clone()
method copyWith (line 1765) | DanmakuElem copyWith(void Function(DanmakuElem) updates)
method create (line 1770) | DanmakuElem create()
method createEmptyInstance (line 1771) | DanmakuElem createEmptyInstance()
method createRepeated (line 1772) | $pb.PbList<DanmakuElem> createRepeated()
method getDefault (line 1774) | DanmakuElem getDefault()
method hasId (line 1786) | $core.bool hasId()
method clearId (line 1788) | void clearId()
method hasProgress (line 1798) | $core.bool hasProgress()
method clearProgress (line 1800) | void clearProgress()
method hasMode (line 1810) | $core.bool hasMode()
method clearMode (line 1812) | void clearMode()
method hasFontsize (line 1822) | $core.bool hasFontsize()
method clearFontsize (line 1824) | void clearFontsize()
method hasColor (line 1834) | $core.bool hasColor()
method clearColor (line 1836) | void clearColor()
method hasMidHash (line 1846) | $core.bool hasMidHash()
method clearMidHash (line 1848) | void clearMidHash()
method hasContent (line 1858) | $core.bool hasContent()
method clearContent (line 1860) | void clearContent()
method hasCtime (line 1870) | $core.bool hasCtime()
method clearCtime (line 1872) | void clearCtime()
method hasWeight (line 1882) | $core.bool hasWeight()
method clearWeight (line 1884) | void clearWeight()
method hasAction (line 1894) | $core.bool hasAction()
method clearAction (line 1896) | void clearAction()
method hasPool (line 1906) | $core.bool hasPool()
method clearPool (line 1908) | void clearPool()
method hasIdStr (line 1918) | $core.bool hasIdStr()
method clearIdStr (line 1920) | void clearIdStr()
method hasAttr (line 1930) | $core.bool hasAttr()
method clearAttr (line 1932) | void clearAttr()
method hasAnimation (line 1942) | $core.bool hasAnimation()
method clearAnimation (line 1944) | void clearAnimation()
class DanmakuFlag (line 1947) | class DanmakuFlag extends $pb.GeneratedMessage {
method clone (line 1993) | DanmakuFlag clone()
method copyWith (line 1997) | DanmakuFlag copyWith(void Function(DanmakuFlag) updates)
method create (line 2002) | DanmakuFlag create()
method createEmptyInstance (line 2003) | DanmakuFlag createEmptyInstance()
method createRepeated (line 2004) | $pb.PbList<DanmakuFlag> createRepeated()
method getDefault (line 2006) | DanmakuFlag getDefault()
method hasDmid (line 2018) | $core.bool hasDmid()
method clearDmid (line 2020) | void clearDmid()
method hasFlag (line 2030) | $core.bool hasFlag()
method clearFlag (line 2032) | void clearFlag()
class DanmakuFlagConfig (line 2035) | class DanmakuFlagConfig extends $pb.GeneratedMessage {
method clone (line 2091) | DanmakuFlagConfig clone()
method copyWith (line 2095) | DanmakuFlagConfig copyWith(void Function(DanmakuFlagConfig) updates)
method create (line 2100) | DanmakuFlagConfig create()
method createEmptyInstance (line 2101) | DanmakuFlagConfig createEmptyInstance()
method createRepeated (line 2102) | $pb.PbList<DanmakuFlagConfig> createRepeated()
method getDefault (line 2105) | DanmakuFlagConfig getDefault()
method hasRecFlag (line 2117) | $core.bool hasRecFlag()
method clearRecFlag (line 2119) | void clearRecFlag()
method hasRecText (line 2129) | $core.bool hasRecText()
method clearRecText (line 2131) | void clearRecText()
method hasRecSwitch (line 2141) | $core.bool hasRecSwitch()
method clearRecSwitch (line 2143) | void clearRecSwitch()
class DanmuDefaultPlayerConfig (line 2146) | class DanmuDefaultPlayerConfig extends $pb.GeneratedMessage {
method clone (line 2341) | DanmuDefaultPlayerConfig clone()
method copyWith (line 2346) | DanmuDefaultPlayerConfig copyWith(
method create (line 2352) | DanmuDefaultPlayerConfig create()
method createEmptyInstance (line 2353) | DanmuDefaultPlayerConfig createEmptyInstance()
method createRepeated (line 2354) | $pb.PbList<DanmuDefaultPlayerConfig> createRepeated()
method getDefault (line 2357) | DanmuDefaultPlayerConfig getDefault()
method hasPlayerDanmakuUseDefaultConfig (line 2369) | $core.bool hasPlayerDanmakuUseDefaultConfig()
method clearPlayerDanmakuUseDefaultConfig (line 2371) | void clearPlayerDanmakuUseDefaultConfig()
method hasPlayerDanmakuAiRecommendedSwitch (line 2381) | $core.bool hasPlayerDanmakuAiRecommendedSwitch()
method clearPlayerDanmakuAiRecommendedSwitch (line 2383) | void clearPlayerDanmakuAiRecommendedSwitch()
method hasPlayerDanmakuAiRecommendedLevel (line 2393) | $core.bool hasPlayerDanmakuAiRecommendedLevel()
method clearPlayerDanmakuAiRecommendedLevel (line 2395) | void clearPlayerDanmakuAiRecommendedLevel()
method hasPlayerDanmakuBlocktop (line 2405) | $core.bool hasPlayerDanmakuBlocktop()
method clearPlayerDanmakuBlocktop (line 2407) | void clearPlayerDanmakuBlocktop()
method hasPlayerDanmakuBlockscroll (line 2417) | $core.bool hasPlayerDanmakuBlockscroll()
method clearPlayerDanmakuBlockscroll (line 2419) | void clearPlayerDanmakuBlockscroll()
method hasPlayerDanmakuBlockbottom (line 2429) | $core.bool hasPlayerDanmakuBlockbottom()
method clearPlayerDanmakuBlockbottom (line 2431) | void clearPlayerDanmakuBlockbottom()
method hasPlayerDanmakuBlockcolorful (line 2441) | $core.bool hasPlayerDanmakuBlockcolorful()
method clearPlayerDanmakuBlockcolorful (line 2443) | void clearPlayerDanmakuBlockcolorful()
method hasPlayerDanmakuBlockrepeat (line 2453) | $core.bool hasPlayerDanmakuBlockrepeat()
method clearPlayerDanmakuBlockrepeat (line 2455) | void clearPlayerDanmakuBlockrepeat()
method hasPlayerDanmakuBlockspecial (line 2465) | $core.bool hasPlayerDanmakuBlockspecial()
method clearPlayerDanmakuBlockspecial (line 2467) | void clearPlayerDanmakuBlockspecial()
method hasPlayerDanmakuOpacity (line 2477) | $core.bool hasPlayerDanmakuOpacity()
method clearPlayerDanmakuOpacity (line 2479) | void clearPlayerDanmakuOpacity()
method hasPlayerDanmakuScalingfactor (line 2489) | $core.bool hasPlayerDanmakuScalingfactor()
method clearPlayerDanmakuScalingfactor (line 2491) | void clearPlayerDanmakuScalingfactor()
method hasPlayerDanmakuDomain (line 2501) | $core.bool hasPlayerDanmakuDomain()
method clearPlayerDanmakuDomain (line 2503) | void clearPlayerDanmakuDomain()
method hasPlayerDanmakuSpeed (line 2513) | $core.bool hasPlayerDanmakuSpeed()
method clearPlayerDanmakuSpeed (line 2515) | void clearPlayerDanmakuSpeed()
method hasInlinePlayerDanmakuSwitch (line 2525) | $core.bool hasInlinePlayerDanmakuSwitch()
method clearInlinePlayerDanmakuSwitch (line 2527) | void clearInlinePlayerDanmakuSwitch()
method hasPlayerDanmakuSeniorModeSwitch (line 2537) | $core.bool hasPlayerDanmakuSeniorModeSwitch()
method clearPlayerDanmakuSeniorModeSwitch (line 2539) | void clearPlayerDanmakuSeniorModeSwitch()
method hasPlayerDanmakuAiRecommendedLevelV2 (line 2549) | $core.bool hasPlayerDanmakuAiRecommendedLevelV2()
method clearPlayerDanmakuAiRecommendedLevelV2 (line 2551) | void clearPlayerDanmakuAiRecommendedLevelV2()
class DanmuPlayerConfig (line 2558) | class DanmuPlayerConfig extends $pb.GeneratedMessage {
method clone (line 2800) | DanmuPlayerConfig clone()
method copyWith (line 2804) | DanmuPlayerConfig copyWith(void Function(DanmuPlayerConfig) updates)
method create (line 2809) | DanmuPlayerConfig create()
method createEmptyInstance (line 2810) | DanmuPlayerConfig createEmptyInstance()
method createRepeated (line 2811) | $pb.PbList<DanmuPlayerConfig> createRepeated()
method getDefault (line 2814) | DanmuPlayerConfig getDefault()
method hasPlayerDanmakuSwitch (line 2826) | $core.bool hasPlayerDanmakuSwitch()
method clearPlayerDanmakuSwitch (line 2828) | void clearPlayerDanmakuSwitch()
method hasPlayerDanmakuSwitchSave (line 2838) | $core.bool hasPlayerDanmakuSwitchSave()
method clearPlayerDanmakuSwitchSave (line 2840) | void clearPlayerDanmakuSwitchSave()
method hasPlayerDanmakuUseDefaultConfig (line 2850) | $core.bool hasPlayerDanmakuUseDefaultConfig()
method clearPlayerDanmakuUseDefaultConfig (line 2852) | void clearPlayerDanmakuUseDefaultConfig()
method hasPlayerDanmakuAiRecommendedSwitch (line 2862) | $core.bool hasPlayerDanmakuAiRecommendedSwitch()
method clearPlayerDanmakuAiRecommendedSwitch (line 2864) | void clearPlayerDanmakuAiRecommendedSwitch()
method hasPlayerDanmakuAiRecommendedLevel (line 2874) | $core.bool hasPlayerDanmakuAiRecommendedLevel()
method clearPlayerDanmakuAiRecommendedLevel (line 2876) | void clearPlayerDanmakuAiRecommendedLevel()
method hasPlayerDanmakuBlocktop (line 2886) | $core.bool hasPlayerDanmakuBlocktop()
method clearPlayerDanmakuBlocktop (line 2888) | void clearPlayerDanmakuBlocktop()
method hasPlayerDanmakuBlockscroll (line 2898) | $core.bool hasPlayerDanmakuBlockscroll()
method clearPlayerDanmakuBlockscroll (line 2900) | void clearPlayerDanmakuBlockscroll()
method hasPlayerDanmakuBlockbottom (line 2910) | $core.bool hasPlayerDanmakuBlockbottom()
method clearPlayerDanmakuBlockbottom (line 2912) | void clearPlayerDanmakuBlockbottom()
method hasPlayerDanmakuBlockcolorful (line 2922) | $core.bool hasPlayerDanmakuBlockcolorful()
method clearPlayerDanmakuBlockcolorful (line 2924) | void clearPlayerDanmakuBlockcolorful()
method hasPlayerDanmakuBlockrepeat (line 2934) | $core.bool hasPlayerDanmakuBlockrepeat()
method clearPlayerDanmakuBlockrepeat (line 2936) | void clearPlayerDanmakuBlockrepeat()
method hasPlayerDanmakuBlockspecial (line 2946) | $core.bool hasPlayerDanmakuBlockspecial()
method clearPlayerDanmakuBlockspecial (line 2948) | void clearPlayerDanmakuBlockspecial()
method hasPlayerDanmakuOpacity (line 2958) | $core.bool hasPlayerDanmakuOpacity()
method clearPlayerDanmakuOpacity (line 2960) | void clearPlayerDanmakuOpacity()
method hasPlayerDanmakuScalingfactor (line 2970) | $core.bool hasPlayerDanmakuScalingfactor()
method clearPlayerDanmakuScalingfactor (line 2972) | void clearPlayerDanmakuScalingfactor()
method hasPlayerDanmakuDomain (line 2982) | $core.bool hasPlayerDanmakuDomain()
method clearPlayerDanmakuDomain (line 2984) | void clearPlayerDanmakuDomain()
method hasPlayerDanmakuSpeed (line 2994) | $core.bool hasPlayerDanmakuSpeed()
method clearPlayerDanmakuSpeed (line 2996) | void clearPlayerDanmakuSpeed()
method hasPlayerDanmakuEnableblocklist (line 3006) | $core.bool hasPlayerDanmakuEnableblocklist()
method clearPlayerDanmakuEnableblocklist (line 3008) | void clearPlayerDanmakuEnableblocklist()
method hasInlinePlayerDanmakuSwitch (line 3018) | $core.bool hasInlinePlayerDanmakuSwitch()
method clearInlinePlayerDanmakuSwitch (line 3020) | void clearInlinePlayerDanmakuSwitch()
method hasInlinePlayerDanmakuConfig (line 3030) | $core.bool hasInlinePlayerDanmakuConfig()
method clearInlinePlayerDanmakuConfig (line 3032) | void clearInlinePlayerDanmakuConfig()
method hasPlayerDanmakuIosSwitchSave (line 3042) | $core.bool hasPlayerDanmakuIosSwitchSave()
method clearPlayerDanmakuIosSwitchSave (line 3044) | void clearPlayerDanmakuIosSwitchSave()
method hasPlayerDanmakuSeniorModeSwitch (line 3054) | $core.bool hasPlayerDanmakuSeniorModeSwitch()
method clearPlayerDanmakuSeniorModeSwitch (line 3056) | void clearPlayerDanmakuSeniorModeSwitch()
method hasPlayerDanmakuAiRecommendedLevelV2 (line 3066) | $core.bool hasPlayerDanmakuAiRecommendedLevelV2()
method clearPlayerDanmakuAiRecommendedLevelV2 (line 3068) | void clearPlayerDanmakuAiRecommendedLevelV2()
class DanmuPlayerConfigPanel (line 3075) | class DanmuPlayerConfigPanel extends $pb.GeneratedMessage {
method clone (line 3111) | DanmuPlayerConfigPanel clone()
method copyWith (line 3116) | DanmuPlayerConfigPanel copyWith(
method create (line 3122) | DanmuPlayerConfigPanel create()
method createEmptyInstance (line 3123) | DanmuPlayerConfigPanel createEmptyInstance()
method createRepeated (line 3124) | $pb.PbList<DanmuPlayerConfigPanel> createRepeated()
method getDefault (line 3127) | DanmuPlayerConfigPanel getDefault()
method hasSelectionText (line 3139) | $core.bool hasSelectionText()
method clearSelectionText (line 3141) | void clearSelectionText()
class DanmuPlayerDynamicConfig (line 3144) | class DanmuPlayerDynamicConfig extends $pb.GeneratedMessage {
method clone (line 3191) | DanmuPlayerDynamicConfig clone()
method copyWith (line 3196) | DanmuPlayerDynamicConfig copyWith(
method create (line 3202) | DanmuPlayerDynamicConfig create()
method createEmptyInstance (line 3203) | DanmuPlayerDynamicConfig createEmptyInstance()
method createRepeated (line 3204) | $pb.PbList<DanmuPlayerDynamicConfig> createRepeated()
method getDefault (line 3207) | DanmuPlayerDynamicConfig getDefault()
method hasProgress (line 3219) | $core.bool hasProgress()
method clearProgress (line 3221) | void clearProgress()
method hasPlayerDanmakuDomain (line 3231) | $core.bool hasPlayerDanmakuDomain()
method clearPlayerDanmakuDomain (line 3233) | void clearPlayerDanmakuDomain()
class DanmuPlayerViewConfig (line 3236) | class DanmuPlayerViewConfig extends $pb.GeneratedMessage {
method clone (line 3304) | DanmuPlayerViewConfig clone()
method copyWith (line 3309) | DanmuPlayerViewConfig copyWith(
method create (line 3315) | DanmuPlayerViewConfig create()
method createEmptyInstance (line 3316) | DanmuPlayerViewConfig createEmptyInstance()
method createRepeated (line 3317) | $pb.PbList<DanmuPlayerViewConfig> createRepeated()
method getDefault (line 3320) | DanmuPlayerViewConfig getDefault()
method hasDanmukuDefaultPlayerConfig (line 3332) | $core.bool hasDanmukuDefaultPlayerConfig()
method clearDanmukuDefaultPlayerConfig (line 3334) | void clearDanmukuDefaultPlayerConfig()
method ensureDanmukuDefaultPlayerConfig (line 3336) | DanmuDefaultPlayerConfig ensureDanmukuDefaultPlayerConfig()
method hasDanmukuPlayerConfig (line 3346) | $core.bool hasDanmukuPlayerConfig()
method clearDanmukuPlayerConfig (line 3348) | void clearDanmukuPlayerConfig()
method ensureDanmukuPlayerConfig (line 3350) | DanmuPlayerConfig ensureDanmukuPlayerConfig()
method hasDanmukuPlayerConfigPanel (line 3364) | $core.bool hasDanmukuPlayerConfigPanel()
method clearDanmukuPlayerConfigPanel (line 3366) | void clearDanmukuPlayerConfigPanel()
method ensureDanmukuPlayerConfigPanel (line 3368) | DanmuPlayerConfigPanel ensureDanmukuPlayerConfigPanel()
class DanmuWebPlayerConfig (line 3371) | class DanmuWebPlayerConfig extends $pb.GeneratedMessage {
method clone (line 3617) | DanmuWebPlayerConfig clone()
method copyWith (line 3622) | DanmuWebPlayerConfig copyWith(void Function(DanmuWebPlayerConfig) upda...
method create (line 3627) | DanmuWebPlayerConfig create()
method createEmptyInstance (line 3628) | DanmuWebPlayerConfig createEmptyInstance()
method createRepeated (line 3629) | $pb.PbList<DanmuWebPlayerConfig> createRepeated()
method getDefault (line 3632) | DanmuWebPlayerConfig getDefault()
method hasDmSwitch (line 3644) | $core.bool hasDmSwitch()
method clearDmSwitch (line 3646) | void clearDmSwitch()
method hasAiSwitch (line 3656) | $core.bool hasAiSwitch()
method clearAiSwitch (line 3658) | void clearAiSwitch()
method hasAiLevel (line 3668) | $core.bool hasAiLevel()
method clearAiLevel (line 3670) | void clearAiLevel()
method hasBlocktop (line 3680) | $core.bool hasBlocktop()
method clearBlocktop (line 3682) | void clearBlocktop()
method hasBlockscroll (line 3692) | $core.bool hasBlockscroll()
method clearBlockscroll (line 3694) | void clearBlockscroll()
method hasBlockbottom (line 3704) | $core.bool hasBlockbottom()
method clearBlockbottom (line 3706) | void clearBlockbottom()
method hasBlockcolor (line 3716) | $core.bool hasBlockcolor()
method clearBlockcolor (line 3718) | void clearBlockcolor()
method hasBlockspecial (line 3728) | $core.bool hasBlockspecial()
method clearBlockspecial (line 3730) | void clearBlockspecial()
method hasPreventshade (line 3740) | $core.bool hasPreventshade()
method clearPreventshade (line 3742) | void clearPreventshade()
method hasDmask (line 3752) | $core.bool hasDmask()
method clearDmask (line 3754) | void clearDmask()
method hasOpacity (line 3764) | $core.bool hasOpacity()
method clearOpacity (line 3766) | void clearOpacity()
method hasDmarea (line 3776) | $core.bool hasDmarea()
method clearDmarea (line 3778) | void clearDmarea()
method hasSpeedplus (line 3788) | $core.bool hasSpeedplus()
method clearSpeedplus (line 3790) | void clearSpeedplus()
method hasFontsize (line 3800) | $core.bool hasFontsize()
method clearFontsize (line 3802) | void clearFontsize()
method hasScreensync (line 3812) | $core.bool hasScreensync()
method clearScreensync (line 3814) | void clearScreensync()
method hasSpeedsync (line 3824) | $core.bool hasSpeedsync()
method clearSpeedsync (line 3826) | void clearSpeedsync()
method hasFontfamily (line 3836) | $core.bool hasFontfamily()
method clearFontfamily (line 3838) | void clearFontfamily()
method hasBold (line 3848) | $core.bool hasBold()
method clearBold (line 3850) | void clearBold()
method hasFontborder (line 3860) | $core.bool hasFontborder()
method clearFontborder (line 3862) | void clearFontborder()
method hasDrawType (line 3872) | $core.bool hasDrawType()
method clearDrawType (line 3874) | void clearDrawType()
method hasSeniorModeSwitch (line 3884) | $core.bool hasSeniorModeSwitch()
method clearSeniorModeSwitch (line 3886) | void clearSeniorModeSwitch()
method hasAiLevelV2 (line 3896) | $core.bool hasAiLevelV2()
method clearAiLevelV2 (line 3898) | void clearAiLevelV2()
class DmExpoReportReq (line 3904) | class DmExpoReportReq extends $pb.GeneratedMessage {
method clone (line 3958) | DmExpoReportReq clone()
method copyWith (line 3962) | DmExpoReportReq copyWith(void Function(DmExpoReportReq) updates)
method create (line 3967) | DmExpoReportReq create()
method createEmptyInstance (line 3968) | DmExpoReportReq createEmptyInstance()
method createRepeated (line 3969) | $pb.PbList<DmExpoReportReq> createRepeated()
method getDefault (line 3972) | DmExpoReportReq getDefault()
method hasSessionId (line 3984) | $core.bool hasSessionId()
method clearSessionId (line 3986) | void clearSessionId()
method hasOid (line 3996) | $core.bool hasOid()
method clearOid (line 3998) | void clearOid()
method hasSpmid (line 4008) | $core.bool hasSpmid()
method clearSpmid (line 4010) | void clearSpmid()
class DmExpoReportRes (line 4013) | class DmExpoReportRes extends $pb.GeneratedMessage {
method clone (line 4036) | DmExpoReportRes clone()
method copyWith (line 4040) | DmExpoReportRes copyWith(void Function(DmExpoReportRes) updates)
method create (line 4045) | DmExpoReportRes create()
method createEmptyInstance (line 4046) | DmExpoReportRes createEmptyInstance()
method createRepeated (line 4047) | $pb.PbList<DmExpoReportRes> createRepeated()
method getDefault (line 4050) | DmExpoReportRes getDefault()
class DmPlayerConfigReq (line 4055) | class DmPlayerConfigReq extends $pb.GeneratedMessage {
method clone (line 4282) | DmPlayerConfigReq clone()
method copyWith (line 4286) | DmPlayerConfigReq copyWith(void Function(DmPlayerConfigReq) updates)
method create (line 4291) | DmPlayerConfigReq create()
method createEmptyInstance (line 4292) | DmPlayerConfigReq createEmptyInstance()
method createRepeated (line 4293) | $pb.PbList<DmPlayerConfigReq> createRepeated()
method getDefault (line 4296) | DmPlayerConfigReq getDefault()
method hasTs (line 4308) | $core.bool hasTs()
method clearTs (line 4310) | void clearTs()
method hasSwitch_2 (line 4320) | $core.bool hasSwitch_2()
method clearSwitch_2 (line 4322) | void clearSwitch_2()
method ensureSwitch_2 (line 4324) | PlayerDanmakuSwitch ensureSwitch_2()
method hasSwitchSave (line 4334) | $core.bool hasSwitchSave()
method clearSwitchSave (line 4336) | void clearSwitchSave()
method ensureSwitchSave (line 4338) | PlayerDanmakuSwitchSave ensureSwitchSave()
method hasUseDefaultConfig (line 4348) | $core.bool hasUseDefaultConfig()
method clearUseDefaultConfig (line 4350) | void clearUseDefaultConfig()
method ensureUseDefaultConfig (line 4352) | PlayerDanmakuUseDefaultConfig ensureUseDefaultConfig()
method hasAiRecommendedSwitch (line 4362) | $core.bool hasAiRecommendedSwitch()
method clearAiRecommendedSwitch (line 4364) | void clearAiRecommendedSwitch()
method ensureAiRecommendedSwitch (line 4366) | PlayerDanmakuAiRecommendedSwitch ensureAiRecommendedSwitch()
method hasAiRecommendedLevel (line 4376) | $core.bool hasAiRecommendedLevel()
method clearAiRecommendedLevel (line 4378) | void clearAiRecommendedLevel()
method ensureAiRecommendedLevel (line 4380) | PlayerDanmakuAiRecommendedLevel ensureAiRecommendedLevel()
method hasBlocktop (line 4390) | $core.bool hasBlocktop()
method clearBlocktop (line 4392) | void clearBlocktop()
method ensureBlocktop (line 4394) | PlayerDanmakuBlocktop ensureBlocktop()
method hasBlockscroll (line 4404) | $core.bool hasBlockscroll()
method clearBlockscroll (line 4406) | void clearBlockscroll()
method ensureBlockscroll (line 4408) | PlayerDanmakuBlockscroll ensureBlockscroll()
method hasBlockbottom (line 4418) | $core.bool hasBlockbottom()
method clearBlockbottom (line 4420) | void clearBlockbottom()
method ensureBlockbottom (line 4422) | PlayerDanmakuBlockbottom ensureBlockbottom()
method hasBlockcolorful (line 4432) | $core.bool hasBlockcolorful()
method clearBlockcolorful (line 4434) | void clearBlockcolorful()
method ensureBlockcolorful (line 4436) | PlayerDanmakuBlockcolorful ensureBlockcolorful()
method hasBlockrepeat (line 4446) | $core.bool hasBlockrepeat()
method clearBlockrepeat (line 4448) | void clearBlockrepeat()
method ensureBlockrepeat (line 4450) | PlayerDanmakuBlockrepeat ensureBlockrepeat()
method hasBlockspecial (line 4460) | $core.bool hasBlockspecial()
method clearBlockspecial (line 4462) | void clearBlockspecial()
method ensureBlockspecial (line 4464) | PlayerDanmakuBlockspecial ensureBlockspecial()
method hasOpacity (line 4474) | $core.bool hasOpacity()
method clearOpacity (line 4476) | void clearOpacity()
method ensureOpacity (line 4478) | PlayerDanmakuOpacity ensureOpacity()
method hasScalingfactor (line 4488) | $core.bool hasScalingfactor()
method clearScalingfactor (line 4490) | void clearScalingfactor()
method ensureScalingfactor (line 4492) | PlayerDanmakuScalingfactor ensureScalingfactor()
method hasDomain (line 4502) | $core.bool hasDomain()
method clearDomain (line 4504) | void clearDomain()
method ensureDomain (line 4506) | PlayerDanmakuDomain ensureDomain()
method hasSpeed (line 4516) | $core.bool hasSpeed()
method clearSpeed (line 4518) | void clearSpeed()
method ensureSpeed (line 4520) | PlayerDanmakuSpeed ensureSpeed()
method hasEnableblocklist (line 4530) | $core.bool hasEnableblocklist()
method clearEnableblocklist (line 4532) | void clearEnableblocklist()
method ensureEnableblocklist (line 4534) | PlayerDanmakuEnableblocklist ensureEnableblocklist()
method hasInlinePlayerDanmakuSwitch (line 4544) | $core.bool hasInlinePlayerDanmakuSwitch()
method clearInlinePlayerDanmakuSwitch (line 4546) | void clearInlinePlayerDanmakuSwitch()
method ensureInlinePlayerDanmakuSwitch (line 4548) | InlinePlayerDanmakuSwitch ensureInlinePlayerDanmakuSwitch()
method hasSeniorModeSwitch (line 4558) | $core.bool hasSeniorModeSwitch()
method clearSeniorModeSwitch (line 4560) | void clearSeniorModeSwitch()
method ensureSeniorModeSwitch (line 4562) | PlayerDanmakuSeniorModeSwitch ensureSeniorModeSwitch()
method hasAiRecommendedLevelV2 (line 4572) | $core.bool hasAiRecommendedLevelV2()
method clearAiRecommendedLevelV2 (line 4574) | void clearAiRecommendedLevelV2()
method ensureAiRecommendedLevelV2 (line 4576) | PlayerDanmakuAiRecommendedLevelV2 ensureAiRecommendedLevelV2()
class DmSegConfig (line 4580) | class DmSegConfig extends $pb.GeneratedMessage {
method clone (line 4625) | DmSegConfig clone()
method copyWith (line 4629) | DmSegConfig copyWith(void Function(DmSegConfig) updates)
method create (line 4634) | DmSegConfig create()
method createEmptyInstance (line 4635) | DmSegConfig createEmptyInstance()
method createRepeated (line 4636) | $pb.PbList<DmSegConfig> createRepeated()
method getDefault (line 4638) | DmSegConfig getDefault()
method hasPageSize (line 4650) | $core.bool hasPageSize()
method clearPageSize (line 4652) | void clearPageSize()
method hasTotal (line 4662) | $core.bool hasTotal()
method clearTotal (line 4664) | void clearTotal()
class DmSegMobileReply (line 4667) | class DmSegMobileReply extends $pb.GeneratedMessage {
method clone (line 4725) | DmSegMobileReply clone()
method copyWith (line 4729) | DmSegMobileReply copyWith(void Function(DmSegMobileReply) updates)
method create (line 4734) | DmSegMobileReply create()
method createEmptyInstance (line 4735) | DmSegMobileReply createEmptyInstance()
method createRepeated (line 4736) | $pb.PbList<DmSegMobileReply> createRepeated()
method getDefault (line 4739) | DmSegMobileReply getDefault()
method hasState (line 4754) | $core.bool hasState()
method clearState (line 4756) | void clearState()
method hasAiFlag (line 4766) | $core.bool hasAiFlag()
method clearAiFlag (line 4768) | void clearAiFlag()
method ensureAiFlag (line 4770) | DanmakuAIFlag ensureAiFlag()
class DmSegMobileReq (line 4773) | class DmSegMobileReq extends $pb.GeneratedMessage {
method clone (line 4885) | DmSegMobileReq clone()
method copyWith (line 4889) | DmSegMobileReq copyWith(void Function(DmSegMobileReq) updates)
method create (line 4894) | DmSegMobileReq create()
method createEmptyInstance (line 4895) | DmSegMobileReq createEmptyInstance()
method createRepeated (line 4896) | $pb.PbList<DmSegMobileReq> createRepeated()
method getDefault (line 4899) | DmSegMobileReq getDefault()
method hasPid (line 4911) | $core.bool hasPid()
method clearPid (line 4913) | void clearPid()
method hasOid (line 4923) | $core.bool hasOid()
method clearOid (line 4925) | void clearOid()
method hasType (line 4935) | $core.bool hasType()
method clearType (line 4937) | void clearType()
method hasSegmentIndex (line 4947) | $core.bool hasSegmentIndex()
method clearSegmentIndex (line 4949) | void clearSegmentIndex()
method hasTeenagersMode (line 4959) | $core.bool hasTeenagersMode()
method clearTeenagersMode (line 4961) | void clearTeenagersMode()
method hasPs (line 4971) | $core.bool hasPs()
method clearPs (line 4973) | void clearPs()
method hasPe (line 4983) | $core.bool hasPe()
method clearPe (line 4985) | void clearPe()
method hasPullMode (line 4995) | $core.bool hasPullMode()
method clearPullMode (line 4997) | void clearPullMode()
method hasFromScene (line 5007) | $core.bool hasFromScene()
method clearFromScene (line 5009) | void clearFromScene()
class DmSegOttReply (line 5012) | class DmSegOttReply extends $pb.GeneratedMessage {
method clone (line 5059) | DmSegOttReply clone()
method copyWith (line 5063) | DmSegOttReply copyWith(void Function(DmSegOttReply) updates)
method create (line 5068) | DmSegOttReply create()
method createEmptyInstance (line 5069) | DmSegOttReply createEmptyInstance()
method createRepeated (line 5070) | $pb.PbList<DmSegOttReply> createRepeated()
method getDefault (line 5073) | DmSegOttReply getDefault()
method hasClosed (line 5085) | $core.bool hasClosed()
method clearClosed (line 5087) | void clearClosed()
class DmSegOttReq (line 5093) | class DmSegOttReq extends $pb.GeneratedMessage {
method clone (line 5157) | DmSegOttReq clone()
method copyWith (line 5161) | DmSegOttReq copyWith(void Function(DmSegOttReq) updates)
method create (line 5166) | DmSegOttReq create()
method createEmptyInstance (line 5167) | DmSegOttReq createEmptyInstance()
method createRepeated (line 5168) | $pb.PbList<DmSegOttReq> createRepeated()
method getDefault (line 5170) | DmSegOttReq getDefault()
method hasPid (line 5182) | $core.bool hasPid()
method clearPid (line 5184) | void clearPid()
method hasOid (line 5194) | $core.bool hasOid()
method clearOid (line 5196) | void clearOid()
method hasType (line 5206) | $core.bool hasType()
method clearType (line 5208) | void clearType()
method hasSegmentIndex (line 5218) | $core.bool hasSegmentIndex()
method clearSegmentIndex (line 5220) | void clearSegmentIndex()
class DmSegSDKReply (line 5223) | class DmSegSDKReply extends $pb.GeneratedMessage {
method clone (line 5270) | DmSegSDKReply clone()
method copyWith (line 5274) | DmSegSDKReply copyWith(void Function(DmSegSDKReply) updates)
method create (line 5279) | DmSegSDKReply create()
method createEmptyInstance (line 5280) | DmSegSDKReply createEmptyInstance()
method createRepeated (line 5281) | $pb.PbList<DmSegSDKReply> createRepeated()
method getDefault (line 5284) | DmSegSDKReply getDefault()
method hasClosed (line 5296) | $core.bool hasClosed()
method clearClosed (line 5298) | void clearClosed()
class DmSegSDKReq (line 5304) | class DmSegSDKReq extends $pb.GeneratedMessage {
method clone (line 5368) | DmSegSDKReq clone()
method copyWith (line 5372) | DmSegSDKReq copyWith(void Function(DmSegSDKReq) updates)
method create (line 5377) | DmSegSDKReq create()
method createEmptyInstance (line 5378) | DmSegSDKReq createEmptyInstance()
method createRepeated (line 5379) | $pb.PbList<DmSegSDKReq> createRepeated()
method getDefault (line 5381) | DmSegSDKReq getDefault()
method hasPid (line 5393) | $core.bool hasPid()
method clearPid (line 5395) | void clearPid()
method hasOid (line 5405) | $core.bool hasOid()
method clearOid (line 5407) | void clearOid()
method hasType (line 5417) | $core.bool hasType()
method clearType (line 5419) | void clearType()
method hasSegmentIndex (line 5429) | $core.bool hasSegmentIndex()
method clearSegmentIndex (line 5431) | void clearSegmentIndex()
class DmViewReply (line 5434) | class DmViewReply extends $pb.GeneratedMessage {
method clone (line 5645) | DmViewReply clone()
method copyWith (line 5649) | DmViewReply copyWith(void Function(DmViewReply) updates)
method create (line 5654) | DmViewReply create()
method createEmptyInstance (line 5655) | DmViewReply createEmptyInstance()
method createRepeated (line 5656) | $pb.PbList<DmViewReply> createRepeated()
method getDefault (line 5658) | DmViewReply getDefault()
method hasClosed (line 5670) | $core.bool hasClosed()
method clearClosed (line 5672) | void clearClosed()
method hasMask (line 5682) | $core.bool hasMask()
method clearMask (line 5684) | void clearMask()
method ensureMask (line 5686) | VideoMask ensureMask()
method hasSubtitle (line 5696) | $core.bool hasSubtitle()
method clearSubtitle (line 5698) | void clearSubtitle()
method ensureSubtitle (line 5700) | VideoSubtitle ensureSubtitle()
method hasAiFlag (line 5713) | $core.bool hasAiFlag()
method clearAiFlag (line 5715) | void clearAiFlag()
method ensureAiFlag (line 5717) | DanmakuFlagConfig ensureAiFlag()
method hasPlayerConfig (line 5727) | $core.bool hasPlayerConfig()
method clearPlayerConfig (line 5729) | void clearPlayerConfig()
method ensurePlayerConfig (line 5731) | DanmuPlayerViewConfig ensurePlayerConfig()
method hasSendBoxStyle (line 5741) | $core.bool hasSendBoxStyle()
method clearSendBoxStyle (line 5743) | void clearSendBoxStyle()
method hasAllow (line 5753) | $core.bool hasAllow()
method clearAllow (line 5755) | void clearAllow()
method hasCheckBox (line 5765) | $core.bool hasCheckBox()
method clearCheckBox (line 5767) | void clearCheckBox()
method hasCheckBoxShowMsg (line 5777) | $core.bool hasCheckBoxShowMsg()
method clearCheckBoxShowMsg (line 5779) | void clearCheckBoxShowMsg()
method hasTextPlaceholder (line 5789) | $core.bool hasTextPlaceholder()
method clearTextPlaceholder (line 5791) | void clearTextPlaceholder()
method hasInputPlaceholder (line 5801) | $core.bool hasInputPlaceholder()
method clearInputPlaceholder (line 5803) | void clearInputPlaceholder()
method hasExpoReport (line 5816) | $core.bool hasExpoReport()
method clearExpoReport (line 5818) | void clearExpoReport()
method ensureExpoReport (line 5820) | ExpoReport ensureExpoReport()
method hasBuzzwordConfig (line 5830) | $core.bool hasBuzzwordConfig()
method clearBuzzwordConfig (line 5832) | void clearBuzzwordConfig()
method ensureBuzzwordConfig (line 5834) | BuzzwordConfig ensureBuzzwordConfig()
class DmViewReq (line 5849) | class DmViewReq extends $pb.GeneratedMessage {
method clone (line 5923) | DmViewReq clone()
method copyWith (line 5927) | DmViewReq copyWith(void Function(DmViewReq) updates)
method create (line 5932) | DmViewReq create()
method createEmptyInstance (line 5933) | DmViewReq createEmptyInstance()
method createRepeated (line 5934) | $pb.PbList<DmViewReq> createRepeated()
method getDefault (line 5936) | DmViewReq getDefault()
method hasPid (line 5948) | $core.bool hasPid()
method clearPid (line 5950) | void clearPid()
method hasOid (line 5960) | $core.bool hasOid()
method clearOid (line 5962) | void clearOid()
method hasType (line 5972) | $core.bool hasType()
method clearType (line 5974) | void clearType()
method hasSpmid (line 5984) | $core.bool hasSpmid()
method clearSpmid (line 5986) | void clearSpmid()
method hasIsHardBoot (line 5996) | $core.bool hasIsHardBoot()
method clearIsHardBoot (line 5998) | void clearIsHardBoot()
class DmWebViewReply (line 6001) | class DmWebViewReply extends $pb.GeneratedMessage {
method clone (line 6165) | DmWebViewReply clone()
method copyWith (line 6169) | DmWebViewReply copyWith(void Function(DmWebViewReply) updates)
method create (line 6174) | DmWebViewReply create()
method createEmptyInstance (line 6175) | DmWebViewReply createEmptyInstance()
method createRepeated (line 6176) | $pb.PbList<DmWebViewReply> createRepeated()
method getDefault (line 6179) | DmWebViewReply getDefault()
method hasState (line 6191) | $core.bool hasState()
method clearState (line 6193) | void clearState()
method hasText (line 6203) | $core.bool hasText()
method clearText (line 6205) | void clearText()
method hasTextSide (line 6215) | $core.bool hasTextSide()
method clearTextSide (line 6217) | void clearTextSide()
method hasDmSge (line 6227) | $core.bool hasDmSge()
method clearDmSge (line 6229) | void clearDmSge()
method ensureDmSge (line 6231) | DmSegConfig ensureDmSge()
method hasFlag (line 6241) | $core.bool hasFlag()
method clearFlag (line 6243) | void clearFlag()
method ensureFlag (line 6245) | DanmakuFlagConfig ensureFlag()
method hasCheckBox (line 6258) | $core.bool hasCheckBox()
method clearCheckBox (line 6260) | void clearCheckBox()
method hasCount (line 6270) | $core.bool hasCount()
method clearCount (line 6272) | void clearCount()
method hasPlayerConfig (line 6285) | $core.bool hasPlayerConfig()
method clearPlayerConfig (line 6287) | void clearPlayerConfig()
method ensurePlayerConfig (line 6289) | DanmuWebPlayerConfig ensurePlayerConfig()
class ExpoReport (line 6304) | class ExpoReport extends $pb.GeneratedMessage {
method clone (line 6340) | ExpoReport clone()
method copyWith (line 6344) | ExpoReport copyWith(void Function(ExpoReport) updates)
method create (line 6349) | ExpoReport create()
method createEmptyInstance (line 6350) | ExpoReport createEmptyInstance()
method createRepeated (line 6351) | $pb.PbList<ExpoReport> createRepeated()
method getDefault (line 6353) | ExpoReport getDefault()
method hasShouldReportAtEnd (line 6365) | $core.bool hasShouldReportAtEnd()
method clearShouldReportAtEnd (line 6367) | void clearShouldReportAtEnd()
class Expression (line 6370) | class Expression extends $pb.GeneratedMessage {
method clone (line 6426) | Expression clone()
method copyWith (line 6430) | Expression copyWith(void Function(Expression) updates)
method create (line 6435) | Expression create()
method createEmptyInstance (line 6436) | Expression createEmptyInstance()
method createRepeated (line 6437) | $pb.PbList<Expression> createRepeated()
method getDefault (line 6439) | Expression getDefault()
method hasUrl (line 6454) | $core.bool hasUrl()
method clearUrl (line 6456) | void clearUrl()
class Expressions (line 6462) | class Expressions extends $pb.GeneratedMessage {
method clone (line 6500) | Expressions clone()
method copyWith (line 6504) | Expressions copyWith(void Function(Expressions) updates)
method create (line 6509) | Expressions create()
method createEmptyInstance (line 6510) | Expressions createEmptyInstance()
method createRepeated (line 6511) | $pb.PbList<Expressions> createRepeated()
method getDefault (line 6513) | Expressions getDefault()
class InlinePlayerDanmakuSwitch (line 6521) | class InlinePlayerDanmakuSwitch extends $pb.GeneratedMessage {
method clone (line 6557) | InlinePlayerDanmakuSwitch clone()
method copyWith (line 6562) | InlinePlayerDanmakuSwitch copyWith(
method create (line 6568) | InlinePlayerDanmakuSwitch create()
method createEmptyInstance (line 6569) | InlinePlayerDanmakuSwitch createEmptyInstance()
method createRepeated (line 6570) | $pb.PbList<InlinePlayerDanmakuSwitch> createRepeated()
method getDefault (line 6573) | InlinePlayerDanmakuSwitch getDefault()
method hasValue (line 6585) | $core.bool hasValue()
method clearValue (line 6587) | void clearValue()
class Label (line 6590) | class Label extends $pb.GeneratedMessage {
method clone (line 6635) | Label clone()
method copyWith (line 6639) | Label copyWith(void Function(Label) updates)
method create (line 6644) | Label create()
method createEmptyInstance (line 6645) | Label createEmptyInstance()
method createRepeated (line 6646) | $pb.PbList<Label> createRepeated()
method getDefault (line 6648) | Label getDefault()
method hasTitle (line 6660) | $core.bool hasTitle()
method clearTitle (line 6662) | void clearTitle()
class LabelV2 (line 6668) | class LabelV2 extends $pb.GeneratedMessage {
method clone (line 6732) | LabelV2 clone()
method copyWith (line 6736) | LabelV2 copyWith(void Function(LabelV2) updates)
method create (line 6741) | LabelV2 create()
method createEmptyInstance (line 6742) | LabelV2 createEmptyInstance()
method createRepeated (line 6743) | $pb.PbList<LabelV2> createRepeated()
method getDefault (line 6745) | LabelV2 getDefault()
method hasTitle (line 6757) | $core.bool hasTitle()
method clearTitle (line 6759) | void clearTitle()
method hasExposureOnce (line 6772) | $core.bool hasExposureOnce()
method clearExposureOnce (line 6774) | void clearExposureOnce()
method hasExposureType (line 6784) | $core.bool hasExposureType()
method clearExposureType (line 6786) | void clearExposureType()
class Period (line 6789) | class Period extends $pb.GeneratedMessage {
method clone (line 6834) | Period clone()
method copyWith (line 6838) | Period copyWith(void Function(Period) updates)
method create (line 6843) | Period create()
method createEmptyInstance (line 6844) | Period createEmptyInstance()
method createRepeated (line 6845) | $pb.PbList<Period> createRepeated()
method getDefault (line 6847) | Period getDefault()
method hasStart (line 6859) | $core.bool hasStart()
method clearStart (line 6861) | void clearStart()
method hasEnd (line 6871) | $core.bool hasEnd()
method clearEnd (line 6873) | void clearEnd()
class PlayerDanmakuAiRecommendedLevel (line 6876) | class PlayerDanmakuAiRecommendedLevel extends $pb.GeneratedMessage {
method clone (line 6912) | PlayerDanmakuAiRecommendedLevel clone()
method copyWith (line 6917) | PlayerDanmakuAiRecommendedLevel copyWith(
method create (line 6924) | PlayerDanmakuAiRecommendedLevel create()
method createEmptyInstance (line 6926) | PlayerDanmakuAiRecommendedLevel createEmptyInstance()
method createRepeated (line 6927) | $pb.PbList<PlayerDanmakuAiRecommendedLevel> createRepeated()
method getDefault (line 6930) | PlayerDanmakuAiRecommendedLevel getDefault()
method hasValue (line 6943) | $core.bool hasValue()
method clearValue (line 6945) | void clearValue()
class PlayerDanmakuAiRecommendedLevelV2 (line 6948) | class PlayerDanmakuAiRecommendedLevelV2 extends $pb.GeneratedMessage {
method clone (line 6985) | PlayerDanmakuAiRecommendedLevelV2 clone()
method copyWith (line 6990) | PlayerDanmakuAiRecommendedLevelV2 copyWith(
method create (line 6997) | PlayerDanmakuAiRecommendedLevelV2 create()
method createEmptyInstance (line 6999) | PlayerDanmakuAiRecommendedLevelV2 createEmptyInstance()
method createRepeated (line 7000) | $pb.PbList<PlayerDanmakuAiRecommendedLevelV2> createRepeated()
method getDefault (line 7003) | PlayerDanmakuAiRecommendedLevelV2 getDefault()
method hasValue (line 7016) | $core.bool hasValue()
method clearValue (line 7018) | void clearValue()
class PlayerDanmakuAiRecommendedSwitch (line 7021) | class PlayerDanmakuAiRecommendedSwitch extends $pb.GeneratedMessage {
method clone (line 7057) | PlayerDanmakuAiRecommendedSwitch clone()
method copyWith (line 7062) | PlayerDanmakuAiRecommendedSwitch copyWith(
method create (line 7069) | PlayerDanmakuAiRecommendedSwitch create()
method createEmptyInstance (line 7071) | PlayerDanmakuAiRecommendedSwitch createEmptyInstance()
method createRepeated (line 7072) | $pb.PbList<PlayerDanmakuAiRecommendedSwitch> createRepeated()
method getDefault (line 7075) | PlayerDanmakuAiRecommendedSwitch getDefault()
method hasValue (line 7088) | $core.bool hasValue()
method clearValue (line 7090) | void clearValue()
class PlayerDanmakuBlockbottom (line 7093) | class PlayerDanmakuBlockbottom extends $pb.GeneratedMessage {
method clone (line 7129) | PlayerDanmakuBlockbottom clone()
method copyWith (line 7134) | PlayerDanmakuBlockbottom copyWith(
method create (line 7140) | PlayerDanmakuBlockbottom create()
method createEmptyInstance (line 7141) | PlayerDanmakuBlockbottom createEmptyInstance()
method createRepeated (line 7142) | $pb.PbList<PlayerDanmakuBlockbottom> createRepeated()
method getDefault (line 7145) | PlayerDanmakuBlockbottom getDefault()
method hasValue (line 7157) | $core.bool hasValue()
method clearValue (line 7159) | void clearValue()
class PlayerDanmakuBlockcolorful (line 7162) | class PlayerDanmakuBlockcolorful extends $pb.GeneratedMessage {
method clone (line 7198) | PlayerDanmakuBlockcolorful clone()
method copyWith (line 7203) | PlayerDanmakuBlockcolorful copyWith(
method create (line 7210) | PlayerDanmakuBlockcolorful create()
method createEmptyInstance (line 7211) | PlayerDanmakuBlockcolorful createEmptyInstance()
method createRepeated (line 7212) | $pb.PbList<PlayerDanmakuBlockcolorful> createRepeated()
method getDefault (line 7215) | PlayerDanmakuBlockcolorful getDefault()
method hasValue (line 7227) | $core.bool hasValue()
method clearValue (line 7229) | void clearValue()
class PlayerDanmakuBlockrepeat (line 7232) | class PlayerDanmakuBlockrepeat extends $pb.GeneratedMessage {
method clone (line 7268) | PlayerDanmakuBlockrepeat clone()
method copyWith (line 7273) | PlayerDanmakuBlockrepeat copyWith(
method create (line 7279) | PlayerDanmakuBlockrepeat create()
method createEmptyInstance (line 7280) | PlayerDanmakuBlockrepeat createEmptyInstance()
method createRepeated (line 7281) | $pb.PbList<PlayerDanmakuBlockrepeat> createRepeated()
method getDefault (line 7284) | PlayerDanmakuBlockrepeat getDefault()
method hasValue (line 7296) | $core.bool hasValue()
method clearValue (line 7298) | void clearValue()
class PlayerDanmakuBlockscroll (line 7301) | class PlayerDanmakuBlockscroll extends $pb.GeneratedMessage {
method clone (line 7337) | PlayerDanmakuBlockscroll clone()
method copyWith (line 7342) | PlayerDanmakuBlockscroll copyWith(
method create (line 7348) | PlayerDanmakuBlockscroll create()
method createEmptyInstance (line 7349) | PlayerDanmakuBlockscroll createEmptyInstance()
method createRepeated (line 7350) | $pb.PbList<PlayerDanmakuBlockscroll> createRepeated()
method getDefault (line 7353) | PlayerDanmakuBlockscroll getDefault()
method hasValue (line 7365) | $core.bool hasValue()
method clearValue (line 7367) | void clearValue()
class PlayerDanmakuBlockspecial (line 7370) | class PlayerDanmakuBlockspecial extends $pb.GeneratedMessage {
method clone (line 7406) | PlayerDanmakuBlockspecial clone()
method copyWith (line 7411) | PlayerDanmakuBlockspecial copyWith(
method create (line 7417) | PlayerDanmakuBlockspecial create()
method createEmptyInstance (line 7418) | PlayerDanmakuBlockspecial createEmptyInstance()
method createRepeated (line 7419) | $pb.PbList<PlayerDanmakuBlockspecial> createRepeated()
method getDefault (line 7422) | PlayerDanmakuBlockspecial getDefault()
method hasValue (line 7434) | $core.bool hasValue()
method clearValue (line 7436) | void clearValue()
class PlayerDanmakuBlocktop (line 7439) | class PlayerDanmakuBlocktop extends $pb.GeneratedMessage {
method clone (line 7475) | PlayerDanmakuBlocktop clone()
method copyWith (line 7480) | PlayerDanmakuBlocktop copyWith(
method create (line 7486) | PlayerDanmakuBlocktop create()
method createEmptyInstance (line 7487) | PlayerDanmakuBlocktop createEmptyInstance()
method createRepeated (line 7488) | $pb.PbList<PlayerDanmakuBlocktop> createRepeated()
method getDefault (line 7491) | PlayerDanmakuBlocktop getDefault()
method hasValue (line 7503) | $core.bool hasValue()
method clearValue (line 7505) | void clearValue()
class PlayerDanmakuDomain (line 7508) | class PlayerDanmakuDomain extends $pb.GeneratedMessage {
method clone (line 7545) | PlayerDanmakuDomain clone()
method copyWith (line 7549) | PlayerDanmakuDomain copyWith(void Function(PlayerDanmakuDomain) updates)
method create (line 7554) | PlayerDanmakuDomain create()
method createEmptyInstance (line 7555) | PlayerDanmakuDomain createEmptyInstance()
method createRepeated (line 7556) | $pb.PbList<PlayerDanmakuDomain> createRepeated()
method getDefault (line 7559) | PlayerDanmakuDomain getDefault()
method hasValue (line 7571) | $core.bool hasValue()
method clearValue (line 7573) | void clearValue()
class PlayerDanmakuEnableblocklist (line 7576) | class PlayerDanmakuEnableblocklist extends $pb.GeneratedMessage {
method clone (line 7612) | PlayerDanmakuEnableblocklist clone()
method copyWith (line 7617) | PlayerDanmakuEnableblocklist copyWith(
method create (line 7624) | PlayerDanmakuEnableblocklist create()
method createEmptyInstance (line 7626) | PlayerDanmakuEnableblocklist createEmptyInstance()
method createRepeated (line 7627) | $pb.PbList<PlayerDanmakuEnableblocklist> createRepeated()
method getDefault (line 7630) | PlayerDanmakuEnableblocklist getDefault()
method hasValue (line 7642) | $core.bool hasValue()
method clearValue (line 7644) | void clearValue()
class PlayerDanmakuOpacity (line 7647) | class PlayerDanmakuOpacity extends $pb.GeneratedMessage {
method clone (line 7684) | PlayerDanmakuOpacity clone()
method copyWith (line 7689) | PlayerDanmakuOpacity copyWith(void Function(PlayerDanmakuOpacity) upda...
method create (line 7694) | PlayerDanmakuOpacity create()
method createEmptyInstance (line 7695) | PlayerDanmakuOpacity createEmptyInstance()
method createRepeated (line 7696) | $pb.PbList<PlayerDanmakuOpacity> createRepeated()
method getDefault (line 7699) | PlayerDanmakuOpacity getDefault()
method hasValue (line 7711) | $core.bool hasValue()
method clearValue (line 7713) | void clearValue()
class PlayerDanmakuScalingfactor (line 7716) | class PlayerDanmakuScalingfactor extends $pb.GeneratedMessage {
method clone (line 7753) | PlayerDanmakuScalingfactor clone()
method copyWith (line 7758) | PlayerDanmakuScalingfactor copyWith(
method create (line 7765) | PlayerDanmakuScalingfactor create()
method createEmptyInstance (line 7766) | PlayerDanmakuScalingfactor createEmptyInstance()
method createRepeated (line 7767) | $pb.PbList<PlayerDanmakuScalingfactor> createRepeated()
method getDefault (line 7770) | PlayerDanmakuScalingfactor getDefault()
method hasValue (line 7782) | $core.bool hasValue()
method clearValue (line 7784) | void clearValue()
class PlayerDanmakuSeniorModeSwitch (line 7787) | class PlayerDanmakuSeniorModeSwitch extends $pb.GeneratedMessage {
method clone (line 7824) | PlayerDanmakuSeniorModeSwitch clone()
method copyWith (line 7829) | PlayerDanmakuSeniorModeSwitch copyWith(
method create (line 7836) | PlayerDanmakuSeniorModeSwitch create()
method createEmptyInstance (line 7838) | PlayerDanmakuSeniorModeSwitch createEmptyInstance()
method createRepeated (line 7839) | $pb.PbList<PlayerDanmakuSeniorModeSwitch> createRepeated()
method getDefault (line 7842) | PlayerDanmakuSeniorModeSwitch getDefault()
method hasValue (line 7854) | $core.bool hasValue()
method clearValue (line 7856) | void clearValue()
class PlayerDanmakuSpeed (line 7859) | class PlayerDanmakuSpeed extends $pb.GeneratedMessage {
method clone (line 7896) | PlayerDanmakuSpeed clone()
method copyWith (line 7900) | PlayerDanmakuSpeed copyWith(void Function(PlayerDanmakuSpeed) updates)
method create (line 7905) | PlayerDanmakuSpeed create()
method createEmptyInstance (line 7906) | PlayerDanmakuSpeed createEmptyInstance()
method createRepeated (line 7907) | $pb.PbList<PlayerDanmakuSpeed> createRepeated()
method getDefault (line 7910) | PlayerDanmakuSpeed getDefault()
method hasValue (line 7922) | $core.bool hasValue()
method clearValue (line 7924) | void clearValue()
class PlayerDanmakuSwitch (line 7927) | class PlayerDanmakuSwitch extends $pb.GeneratedMessage {
method clone (line 7972) | PlayerDanmakuSwitch clone()
method copyWith (line 7976) | PlayerDanmakuSwitch copyWith(void Function(PlayerDanmakuSwitch) updates)
method create (line 7981) | PlayerDanmakuSwitch create()
method createEmptyInstance (line 7982) | PlayerDanmakuSwitch createEmptyInstance()
method createRepeated (line 7983) | $pb.PbList<PlayerDanmakuSwitch> createRepeated()
method getDefault (line 7986) | PlayerDanmakuSwitch getDefault()
method hasValue (line 7998) | $core.bool hasValue()
method clearValue (line 8000) | void clearValue()
method hasCanIgnore (line 8010) | $core.bool hasCanIgnore()
method clearCanIgnore (line 8012) | void clearCanIgnore()
class PlayerDanmakuSwitchSave (line 8015) | class PlayerDanmakuSwitchSave extends $pb.GeneratedMessage {
method clone (line 8051) | PlayerDanmakuSwitchSave clone()
method copyWith (line 8056) | PlayerDanmakuSwitchSave copyWith(
method create (line 8062) | PlayerDanmakuSwitchSave create()
method createEmptyInstance (line 8063) | PlayerDanmakuSwitchSave createEmptyInstance()
method createRepeated (line 8064) | $pb.PbList<PlayerDanmakuSwitchSave> createRepeated()
method getDefault (line 8067) | PlayerDanmakuSwitchSave getDefault()
method hasValue (line 8079) | $core.bool hasValue()
method clearValue (line 8081) | void clearValue()
class PlayerDanmakuUseDefaultConfig (line 8084) | class PlayerDanmakuUseDefaultConfig extends $pb.GeneratedMessage {
method clone (line 8120) | PlayerDanmakuUseDefaultConfig clone()
method copyWith (line 8125) | PlayerDanmakuUseDefaultConfig copyWith(
method create (line 8132) | PlayerDanmakuUseDefaultConfig create()
method createEmptyInstance (line 8134) | PlayerDanmakuUseDefaultConfig createEmptyInstance()
method createRepeated (line 8135) | $pb.PbList<PlayerDanmakuUseDefaultConfig> createRepeated()
method getDefault (line 8138) | PlayerDanmakuUseDefaultConfig getDefault()
method hasValue (line 8150) | $core.bool hasValue()
method clearValue (line 8152) | void clearValue()
class PostPanel (line 8155) | class PostPanel extends $pb.GeneratedMessage {
method clone (line 8271) | PostPanel clone()
method copyWith (line 8275) | PostPanel copyWith(void Function(PostPanel) updates)
method create (line 8280) | PostPanel create()
method createEmptyInstance (line 8281) | PostPanel createEmptyInstance()
method createRepeated (line 8282) | $pb.PbList<PostPanel> createRepeated()
method getDefault (line 8284) | PostPanel getDefault()
method hasStart (line 8296) | $core.bool hasStart()
method clearStart (line 8298) | void clearStart()
method hasEnd (line 8308) | $core.bool hasEnd()
method clearEnd (line 8310) | void clearEnd()
method hasPriority (line 8320) | $core.bool hasPriority()
method clearPriority (line 8322) | void clearPriority()
method hasBizId (line 8332) | $core.bool hasBizId()
method clearBizId (line 8334) | void clearBizId()
method hasBizType (line 8344) | $core.bool hasBizType()
method clearBizType (line 8346) | void clearBizType()
method hasClickButton (line 8356) | $core.bool hasClickButton()
method clearClickButton (line 8358) | void clearClickButton()
method ensureClickButton (line 8360) | ClickButton ensureClickButton()
method hasTextInput (line 8370) | $core.bool hasTextInput()
method clearTextInput (line 8372) | void clearTextInput()
method ensureTextInput (line 8374) | TextInput ensureTextInput()
method hasCheckBox (line 8384) | $core.bool hasCheckBox()
method clearCheckBox (line 8386) | void clearCheckBox()
method ensureCheckBox (line 8388) | CheckBox ensureCheckBox()
method hasToast (line 8398) | $core.bool hasToast()
method clearToast (line 8400) | void clearToast()
method ensureToast (line 8402) | Toast ensureToast()
class PostPanelV2 (line 8405) | class PostPanelV2 extends $pb.GeneratedMessage {
method clone (line 8530) | PostPanelV2 clone()
method copyWith (line 8534) | PostPanelV2 copyWith(void Function(PostPanelV2) updates)
method create (line 8539) | PostPanelV2 create()
method createEmptyInstance (line 8540) | PostPanelV2 createEmptyInstance()
method createRepeated (line 8541) | $pb.PbList<PostPanelV2> createRepeated()
method getDefault (line 8543) | PostPanelV2 getDefault()
method hasStart (line 8555) | $core.bool hasStart()
method clearStart (line 8557) | void clearStart()
method hasEnd (line 8567) | $core.bool hasEnd()
method clearEnd (line 8569) | void clearEnd()
method hasBizType (line 8579) | $core.bool hasBizType()
method clearBizType (line 8581) | void clearBizType()
method hasClickButton (line 8591) | $core.bool hasClickButton()
method clearClickButton (line 8593) | void clearClickButton()
method ensureClickButton (line 8595) | ClickButtonV2 ensureClickButton()
method hasTextInput (line 8605) | $core.bool hasTextInput()
method clearTextInput (line 8607) | void clearTextInput()
method ensureTextInput (line 8609) | TextInputV2 ensureTextInput()
method hasCheckBox (line 8619) | $core.bool hasCheckBox()
method clearCheckBox (line 8621) | void clearCheckBox()
method ensureCheckBox (line 8623) | CheckBoxV2 ensureCheckBox()
method hasToast (line 8633) | $core.bool hasToast()
method clearToast (line 8635) | void clearToast()
method ensureToast (line 8637) | ToastV2 ensureToast()
method hasBubble (line 8647) | $core.bool hasBubble()
method clearBubble (line 8649) | void clearBubble()
method ensureBubble (line 8651) | BubbleV2 ensureBubble()
method hasLabel (line 8661) | $core.bool hasLabel()
method clearLabel (line 8663) | void clearLabel()
method ensureLabel (line 8665) | LabelV2 ensureLabel()
method hasPostStatus (line 8675) | $core.bool hasPostStatus()
method clearPostStatus (line 8677) | void clearPostStatus()
class Response (line 8680) | class Response extends $pb.GeneratedMessage {
method clone (line 8726) | Response clone()
method copyWith (line 8730) | Response copyWith(void Function(Response) updates)
method create (line 8735) | Response create()
method createEmptyInstance (line 8736) | Response createEmptyInstance()
method createRepeated (line 8737) | $pb.PbList<Response> createRepeated()
method getDefault (line 8739) | Response getDefault()
method hasCode (line 8751) | $core.bool hasCode()
method clearCode (line 8753) | void clearCode()
method hasMessage (line 8763) | $core.bool hasMessage()
method clearMessage (line 8765) | void clearMessage()
class SubtitleItem (line 8768) | class SubtitleItem extends $pb.GeneratedMessage {
method clone (line 8898) | SubtitleItem clone()
method copyWith (line 8902) | SubtitleItem copyWith(void Function(SubtitleItem) updates)
method create (line 8907) | SubtitleItem create()
method createEmptyInstance (line 8908) | SubtitleItem createEmptyInstance()
method createRepeated (line 8909) | $pb.PbList<SubtitleItem> createRepeated()
method getDefault (line 8912) | SubtitleItem getDefault()
method hasId (line 8924) | $core.bool hasId()
method clearId (line 8926) | void clearId()
method hasIdStr (line 8936) | $core.bool hasIdStr()
method clearIdStr (line 8938) | void clearIdStr()
method hasLan (line 8948) | $core.bool hasLan()
method clearLan (line 8950) | void clearLan()
method hasLanDoc (line 8960) | $core.bool hasLanDoc()
method clearLanDoc (line 8962) | void clearLanDoc()
method hasSubtitleUrl (line 8972) | $core.bool hasSubtitleUrl()
method clearSubtitleUrl (line 8974) | void clearSubtitleUrl()
method hasAuthor (line 8984) | $core.bool hasAuthor()
method clearAuthor (line 8986) | void clearAuthor()
method ensureAuthor (line 8988) | UserInfo ensureAuthor()
method hasType (line 8998) | $core.bool hasType()
method clearType (line 9000) | void clearType()
method hasLanDocBrief (line 9010) | $core.bool hasLanDocBrief()
method clearLanDocBrief (line 9012) | void clearLanDocBrief()
method hasAiType (line 9022) | $core.bool hasAiType()
method clearAiType (line 9024) | void clearAiType()
method hasAiStatus (line 9034) | $core.bool hasAiStatus()
method clearAiStatus (line 9036) | void clearAiStatus()
class TextInput (line 9039) | class TextInput extends $pb.GeneratedMessage {
method clone (line 9149) | TextInput clone()
method copyWith (line 9153) | TextInput copyWith(void Function(TextInput) updates)
method create (line 9158) | TextInput create()
method createEmptyInstance (line 9159) | TextInput createEmptyInstance()
method createRepeated (line 9160) | $pb.PbList<TextInput> createRepeated()
method getDefault (line 9162) | TextInput getDefault()
method hasRenderType (line 9180) | $core.bool hasRenderType()
method clearRenderType (line 9182) | void clearRenderType()
method hasPlaceholderPost (line 9192) | $core.bool hasPlaceholderPost()
method clearPlaceholderPost (line 9194) | void clearPlaceholderPost()
method hasShow (line 9204) | $core.bool hasShow()
method clearShow (line 9206) | void clearShow()
method hasPostStatus (line 9219) | $core.bool hasPostStatus()
method clearPostStatus (line 9221) | void clearPostStatus()
method hasLabel (line 9231) | $core.bool hasLabel()
method clearLabel (line 9233) | void clearLabel()
method ensureLabel (line 9235) | Label ensureLabel()
class TextInputV2 (line 9238) | class TextInputV2 extends $pb.GeneratedMessage {
method clone (line 9326) | TextInputV2 clone()
method copyWith (line 9330) | TextInputV2 copyWith(void Function(TextInputV2) updates)
method create (line 9335) | TextInputV2 create()
method createEmptyInstance (line 9336) | TextInputV2 createEmptyInstance()
method createRepeated (line 9337) | $pb.PbList<TextInputV2> createRepeated()
method getDefault (line 9339) | TextInputV2 getDefault()
method hasRenderType (line 9357) | $core.bool hasRenderType()
method clearRenderType (line 9359) | void clearRenderType()
method hasPlaceholderPost (line 9369) | $core.bool hasPlaceholderPost()
method clearPlaceholderPost (line 9371) | void clearPlaceholderPost()
method hasTextInputLimit (line 9384) | $core.bool hasTextInputLimit()
method clearTextInputLimit (line 9386) | void clearTextInputLimit()
class Toast (line 9389) | class Toast extends $pb.GeneratedMessage {
method clone (line 9454) | Toast clone()
method copyWith (line 9458) | Toast copyWith(void Function(Toast) updates)
method create (line 9463) | Toast create()
method createEmptyInstance (line 9464) | Toast createEmptyInstance()
method createRepeated (line 9465) | $pb.PbList<Toast> createRepeated()
method getDefault (line 9467) | Toast getDefault()
method hasText (line 9479) | $core.bool hasText()
method clearText (line 9481) | void clearText()
method hasDuration (line 9491) | $core.bool hasDuration()
method clearDuration (line 9493) | void clearDuration()
method hasShow (line 9503) | $core.bool hasShow()
method clearShow (line 9505) | void clearShow()
method hasButton (line 9515) | $core.bool hasButton()
method clearButton (line 9517) | void clearButton()
method ensureButton (line 9519) | Button ensureButton()
class ToastButtonV2 (line 9522) | class ToastButtonV2 extends $pb.GeneratedMessage {
method clone (line 9568) | ToastButtonV2 clone()
method copyWith (line 9572) | ToastButtonV2 copyWith(void Function(ToastButtonV2) updates)
method create (line 9577) | ToastButtonV2 create()
method createEmptyInstance (line 9578) | ToastButtonV2 createEmptyInstance()
method createRepeated (line 9579) | $pb.PbList<ToastButtonV2> createRepeated()
method getDefault (line 9582) | ToastButtonV2 getDefault()
method hasText (line 9594) | $core.bool hasText()
method clearText (line 9596) | void clearText()
method hasAction (line 9606) | $core.bool hasAction()
method clearAction (line 9608) | void clearAction()
class ToastV2 (line 9611) | class ToastV2 extends $pb.GeneratedMessage {
method clone (line 9667) | ToastV2 clone()
method copyWith (line 9671) | ToastV2 copyWith(void Function(ToastV2) updates)
method create (line 9676) | ToastV2 create()
method createEmptyInstance (line 9677) | ToastV2 createEmptyInstance()
method createRepeated (line 9678) | $pb.PbList<ToastV2> createRepeated()
method getDefault (line 9680) | ToastV2 getDefault()
method hasText (line 9692) | $core.bool hasText()
method clearText (line 9694) | void clearText()
method hasDuration (line 9704) | $core.bool hasDuration()
method clearDuration (line 9706) | void clearDuration()
method hasToastButtonV2 (line 9716) | $core.bool hasToastButtonV2()
method clearToastButtonV2 (line 9718) | void clearToastButtonV2()
method ensureToastButtonV2 (line 9720) | ToastButtonV2 ensureToastButtonV2()
class UserInfo (line 9723) | class UserInfo extends $pb.GeneratedMessage {
method clone (line 9805) | UserInfo clone()
method copyWith (line 9809) | UserInfo copyWith(void Function(UserInfo) updates)
method create (line 9814) | UserInfo create()
method createEmptyInstance (line 9815) | UserInfo createEmptyInstance()
method createRepeated (line 9816) | $pb.PbList<UserInfo> createRepeated()
method getDefault (line 9818) | UserInfo getDefault()
method hasMid (line 9830) | $core.bool hasMid()
method clearMid (line 9832) | void clearMid()
method hasName (line 9842) | $core.bool hasName()
method clearName (line 9844) | void clearName()
method hasSex (line 9854) | $core.bool hasSex()
method clearSex (line 9856) | void clearSex()
method hasFace (line 9866) | $core.bool hasFace()
method clearFace (line 9868) | void clearFace()
method hasSign (line 9878) | $core.bool hasSign()
method clearSign (line 9880) | void clearSign()
method hasRank (line 9890) | $core.bool hasRank()
method clearRank (line 9892) | void clearRank()
class VideoMask (line 9895) | class VideoMask extends $pb.GeneratedMessage {
method clone (line 9969) | VideoMask clone()
method copyWith (line 9973) | VideoMask copyWith(void Function(VideoMask) updates)
method create (line 9978) | VideoMask create()
method createEmptyInstance (line 9979) | VideoMask createEmptyInstance()
method createRepeated (line 9980) | $pb.PbList<VideoMask> createRepeated()
method getDefault (line 9982) | VideoMask getDefault()
method hasCid (line 9994) | $core.bool hasCid()
method clearCid (line 9996) | void clearCid()
method hasPlat (line 10006) | $core.bool hasPlat()
method clearPlat (line 10008) | void clearPlat()
method hasFps (line 10018) | $core.bool hasFps()
method clearFps (line 10020) | void clearFps()
method hasTime (line 10030) | $core.bool hasTime()
method clearTime (line 10032) | void clearTime()
method hasMaskUrl (line 10042) | $core.bool hasMaskUrl()
method clearMaskUrl (line 10044) | void clearMaskUrl()
class VideoSubtitle (line 10047) | class VideoSubtitle extends $pb.GeneratedMessage {
method clone (line 10104) | VideoSubtitle clone()
method copyWith (line 10108) | VideoSubtitle copyWith(void Function(VideoSubtitle) updates)
method create (line 10113) | VideoSubtitle create()
method createEmptyInstance (line 10114) | VideoSubtitle createEmptyInstance()
method createRepeated (line 10115) | $pb.PbList<VideoSubtitle> createRepeated()
method getDefault (line 10118) | VideoSubtitle getDefault()
method hasLan (line 10130) | $core.bool hasLan()
method clearLan (line 10132) | void clearLan()
method hasLanDoc (line 10142) | $core.bool hasLanDoc()
method clearLanDoc (line 10144) | void clearLanDoc()
class DMApi (line 10150) | class DMApi {
method dmSegMobile (line 10154) | $async.Future<DmSegMobileReply> dmSegMobile(
method dmView (line 10161) | $async.Future<DmViewReply> dmView($pb.ClientContext? ctx, DmViewReq re...
method dmPlayerConfig (line 10167) | $async.Future<Response> dmPlayerConfig(
method dmSegOtt (line 10174) | $async.Future<DmSegOttReply> dmSegOtt(
method dmSegSDK (line 10181) | $async.Future<DmSegSDKReply> dmSegSDK(
method dmExpoReport (line 10188) | $async.Future<DmExpoReportRes> dmExpoReport(
FILE: lib/models/danmaku/dm.pbenum.dart
class AvatarType (line 12) | class AvatarType extends $pb.ProtobufEnum {
method valueOf (line 31) | AvatarType? valueOf($core.int value)
class BubbleType (line 36) | class BubbleType extends $pb.ProtobufEnum {
method valueOf (line 61) | BubbleType? valueOf($core.int value)
class CheckboxType (line 66) | class CheckboxType extends $pb.ProtobufEnum {
method valueOf (line 91) | CheckboxType? valueOf($core.int value)
class DMAttrBit (line 96) | class DMAttrBit extends $pb.ProtobufEnum {
method valueOf (line 121) | DMAttrBit? valueOf($core.int value)
class ExposureType (line 126) | class ExposureType extends $pb.ProtobufEnum {
method valueOf (line 145) | ExposureType? valueOf($core.int value)
class PostPanelBizType (line 150) | class PostPanelBizType extends $pb.ProtobufEnum {
method valueOf (line 193) | PostPanelBizType? valueOf($core.int value)
class PostStatus (line 198) | class PostStatus extends $pb.ProtobufEnum {
method valueOf (line 217) | PostStatus? valueOf($core.int value)
class RenderType (line 222) | class RenderType extends $pb.ProtobufEnum {
method valueOf (line 247) | RenderType? valueOf($core.int value)
class SubtitleAiStatus (line 252) | class SubtitleAiStatus extends $pb.ProtobufEnum {
method valueOf (line 277) | SubtitleAiStatus? valueOf($core.int value)
class SubtitleAiType (line 282) | class SubtitleAiType extends $pb.ProtobufEnum {
method valueOf (line 301) | SubtitleAiType? valueOf($core.int value)
class SubtitleType (line 306) | class SubtitleType extends $pb.ProtobufEnum {
method valueOf (line 319) | SubtitleType? valueOf($core.int value)
class ToastFunctionType (line 324) | class ToastFunctionType extends $pb.ProtobufEnum {
method valueOf (line 344) | ToastFunctionType? valueOf($core.int value)
FILE: lib/models/danmaku/dm.pbserver.dart
class DMServiceBase (line 18) | abstract class DMServiceBase extends $pb.GeneratedService {
method dmSegMobile (line 19) | $async.Future<$0.DmSegMobileReply> dmSegMobile(
method dmView (line 21) | $async.Future<$0.DmViewReply> dmView(
method dmPlayerConfig (line 23) | $async.Future<$0.Response> dmPlayerConfig(
method dmSegOtt (line 25) | $async.Future<$0.DmSegOttReply> dmSegOtt(
method dmSegSDK (line 27) | $async.Future<$0.DmSegSDKReply> dmSegSDK(
method dmExpoReport (line 29) | $async.Future<$0.DmExpoReportRes> dmExpoReport(
method createRequest (line 32) | $pb.GeneratedMessage createRequest($core.String method)
method handleCall (line 51) | $async.Future<$pb.GeneratedMessage> handleCall($pb.ServerContext ctx,
FILE: lib/models/dynamics/result.dart
class DynamicsDataModel (line 3) | class DynamicsDataModel {
class DynamicItemModel (line 23) | class DynamicItemModel {
class ItemOrigModel (line 50) | class ItemOrigModel {
class ItemModulesModel (line 75) | class ItemModulesModel {
class ModuleAuthorModel (line 106) | class ModuleAuthorModel {
class ModuleDynamicModel (line 154) | class ModuleDynamicModel {
class DynamicAddModel (line 192) | class DynamicAddModel {
class Vote (line 223) | class Vote {
class Ugc (line 261) | class Ugc {
class Reserve (line 294) | class Reserve {
class Good (line 334) | class Good {
class GoodItem (line 355) | class GoodItem {
class DynamicDescModel (line 385) | class DynamicDescModel {
class DynamicMajorModel (line 405) | class DynamicMajorModel {
class DynamicTopicModel (line 464) | class DynamicTopicModel {
class DynamicArchiveModel (line 482) | class DynamicArchiveModel {
class DynamicDrawModel (line 529) | class DynamicDrawModel {
class DynamicOpusModel (line 549) | class DynamicOpusModel {
class SummaryModel (line 574) | class SummaryModel {
class RichTextNodeItem (line 591) | class RichTextNodeItem {
class Emoji (line 614) | class Emoji {
class DynamicNoneModel (line 634) | class DynamicNoneModel {
class OpusPicsModel (line 644) | class OpusPicsModel {
class DynamicDrawItemModel (line 668) | class DynamicDrawItemModel {
class DynamicLiveModel (line 690) | class DynamicLiveModel {
class DynamicLive2Model (line 732) | class DynamicLive2Model {
class ModuleStatModel (line 769) | class ModuleStatModel {
class Comment (line 788) | class Comment {
class ForWard (line 803) | class ForWard {
class Like (line 815) | class Like {
class Stat (line 833) | class Stat {
FILE: lib/models/dynamics/up.dart
class FollowUpModel (line 1) | class FollowUpModel {
class LiveUsers (line 30) | class LiveUsers {
class LiveUserItem (line 50) | class LiveUserItem {
class UpItem (line 82) | class UpItem {
class MyInfo (line 107) | class MyInfo {
FILE: lib/models/fans/result.dart
class FansDataModel (line 1) | class FansDataModel {
class FansItemModel (line 18) | class FansItemModel {
FILE: lib/models/follow/result.dart
class FollowDataModel (line 1) | class FollowDataModel {
class FollowItemModel (line 18) | class FollowItemModel {
FILE: lib/models/github/latest.dart
class LatestDataModel (line 1) | class LatestDataModel {
class AssetItem (line 27) | class AssetItem {
FILE: lib/models/home/rcmd/result.dart
class RecVideoItemAppModel (line 3) | class RecVideoItemAppModel {
class RcmdStat (line 92) | class RcmdStat {
class RcmdOwner (line 108) | class RcmdOwner {
class RcmdReason (line 124) | class RcmdReason {
FILE: lib/models/live/follow.dart
class LiveFollowingModel (line 1) | class LiveFollowingModel {
class LiveFollowingItemModel (line 44) | class LiveFollowingItemModel {
FILE: lib/models/live/item.dart
class LiveItemModel (line 1) | class LiveItemModel {
FILE: lib/models/live/message.dart
class LiveMessageModel (line 1) | class LiveMessageModel {
class LiveSuperChatMessage (line 33) | class LiveSuperChatMessage {
type LiveMessageType (line 55) | enum LiveMessageType {
class LiveMessageColor (line 68) | class LiveMessageColor {
method numberToColor (line 72) | LiveMessageColor numberToColor(int intColor)
method toString (line 98) | String toString()
FILE: lib/models/live/quality.dart
type LiveQuality (line 1) | enum LiveQuality {
function fromCode (line 23) | LiveQuality? fromCode(int code)
FILE: lib/models/live/room_info.dart
class RoomInfoModel (line 1) | class RoomInfoModel {
class PlayurlInfo (line 24) | class PlayurlInfo {
class Playurl (line 36) | class Playurl {
class GQnDesc (line 55) | class GQnDesc {
class Streams (line 76) | class Streams {
class FormatItem (line 92) | class FormatItem {
class CodecItem (line 107) | class CodecItem {
class UrlInfoItem (line 142) | class UrlInfoItem {
FILE: lib/models/live/room_info_h5.dart
class RoomInfoH5Model (line 1) | class RoomInfoH5Model {
class RoomInfo (line 28) | class RoomInfo {
class AnchorInfo (line 82) | class AnchorInfo {
class BaseInfo (line 97) | class BaseInfo {
class RelationInfo (line 112) | class RelationInfo {
class LikeInfoV3 (line 122) | class LikeInfoV3 {
FILE: lib/models/login/index.dart
class CaptchaDataModel (line 1) | class CaptchaDataModel {
class GeetestData (line 28) | class GeetestData {
class Tencent (line 43) | class Tencent {
FILE: lib/models/member/archive.dart
class MemberArchiveDataModel (line 1) | class MemberArchiveDataModel {
class ArchiveListModel (line 16) | class ArchiveListModel {
class TListItemModel (line 36) | class TListItemModel {
class VListItemModel (line 54) | class VListItemModel {
class Stat (line 134) | class Stat {
class Owner (line 149) | class Owner {
FILE: lib/models/member/article.dart
class MemberArticleDataModel (line 1) | class MemberArticleDataModel {
class MemberArticleItemModel (line 24) | class MemberArticleItemModel {
FILE: lib/models/member/coin.dart
class MemberCoinsDataModel (line 1) | class MemberCoinsDataModel {
class Owner (line 73) | class Owner {
FILE: lib/models/member/info.dart
class MemberInfoModel (line 1) | class MemberInfoModel {
class Vip (line 44) | class Vip {
class LiveRoom (line 70) | class LiveRoom {
FILE: lib/models/member/like.dart
class MemberLikeDataModel (line 1) | class MemberLikeDataModel {
class Dimension (line 77) | class Dimension {
class Owner (line 95) | class Owner {
class Rights (line 113) | class Rights {
class Stat (line 164) | class Stat {
FILE: lib/models/member/seasons.dart
class MemberSeasonsDataModel (line 1) | class MemberSeasonsDataModel {
class MemberSeasonsList (line 34) | class MemberSeasonsList {
class MemberArchiveItem (line 58) | class MemberArchiveItem {
class MamberMeta (line 94) | class MamberMeta {
FILE: lib/models/member/tags.dart
class MemberTagItemModel (line 1) | class MemberTagItemModel {
FILE: lib/models/model_hot_video_item.dart
class HotVideoItemModel (line 3) | class HotVideoItemModel {
class Stat (line 92) | class Stat {
class Dimension (line 140) | class Dimension {
class RcmdReason (line 154) | class RcmdReason {
FILE: lib/models/model_owner.dart
class Owner (line 1) | class Owner {
FILE: lib/models/model_rec_video_item.dart
class RecVideoItemModel (line 3) | class RecVideoItemModel {
class Stat (line 51) | class Stat {
FILE: lib/models/msg/account.dart
class AccountListModel (line 1) | class AccountListModel {
FILE: lib/models/msg/like.dart
class MessageLikeModel (line 1) | class MessageLikeModel {
class Latest (line 17) | class Latest {
class Total (line 32) | class Total {
class Cursor (line 51) | class Cursor {
class MessageLikeItem (line 69) | class MessageLikeItem {
class MessageLikeUser (line 105) | class MessageLikeUser {
class MessageLikeItemItem (line 133) | class MessageLikeItemItem {
FILE: lib/models/msg/reply.dart
class MessageReplyModel (line 1) | class MessageReplyModel {
class Cursor (line 20) | class Cursor {
class MessageReplyItem (line 38) | class MessageReplyItem {
class ReplyContentItem (line 65) | class ReplyContentItem {
class ReplyUser (line 143) | class ReplyUser {
FILE: lib/models/msg/session.dart
class SessionDataModel (line 5) | class SessionDataModel {
class SessionList (line 22) | class SessionList {
class LastMsg (line 111) | class LastMsg {
class SessionMsgDataModel (line 158) | class SessionMsgDataModel {
class MessageItem (line 184) | class MessageItem {
FILE: lib/models/msg/system.dart
class MessageSystemModel (line 3) | class MessageSystemModel {
class Source (line 66) | class Source {
function isValidJson (line 81) | bool isValidJson(String str)
FILE: lib/models/read/opus.dart
class OpusDataModel (line 1) | class OpusDataModel {
class OpusDetailDataModel (line 27) | class OpusDetailDataModel {
class Basic (line 53) | class Basic {
class OpusModuleDataModel (line 77) | class OpusModuleDataModel {
class ModuleTop (line 120) | class ModuleTop {
class ModuleTitle (line 135) | class ModuleTitle {
class ModuleAuthor (line 147) | class ModuleAuthor {
class ModuleContent (line 168) | class ModuleContent {
class ModuleParagraph (line 188) | class ModuleParagraph {
class Pics (line 217) | class Pics {
class Pic (line 237) | class Pic {
class LinkCard (line 264) | class LinkCard {
class ModuleParagraphText (line 288) | class ModuleParagraphText {
class ModuleParagraphTextNode (line 305) | class ModuleParagraphTextNode {
class ModuleParagraphTextNodeWord (line 325) | class ModuleParagraphTextNodeWord {
class ModuleParagraphTextNodeWordStyle (line 348) | class ModuleParagraphTextNodeWordStyle {
class ModuleExtend (line 360) | class ModuleExtend {
class ModuleExtendItem (line 377) | class ModuleExtendItem {
class ModuleBottom (line 401) | class ModuleBottom {
class ShareInfo (line 415) | class ShareInfo {
class ModuleStat (line 433) | class ModuleStat {
class StatItem (line 460) | class StatItem {
function customDivision (line 478) | double customDivision(int a, int b)
FILE: lib/models/read/read.dart
class ReadDataModel (line 5) | class ReadDataModel {
class ReadInfo (line 49) | class ReadInfo {
class Author (line 114) | class Author {
class Opus (line 141) | class Opus {
class Content (line 271) | class Content {
FILE: lib/models/search/all.dart
class SearchAllModel (line 1) | class SearchAllModel {
FILE: lib/models/search/hot.dart
class HotSearchModel (line 1) | class HotSearchModel {
class HotSearchItem (line 15) | class HotSearchItem {
FILE: lib/models/search/result.dart
class SearchVideoModel (line 4) | class SearchVideoModel {
class SearchVideoItemModel (line 17) | class SearchVideoItemModel {
class Stat (line 104) | class Stat {
class Owner (line 133) | class Owner {
class SearchUserModel (line 150) | class SearchUserModel {
class SearchUserItemModel (line 160) | class SearchUserItemModel {
class SearchLiveModel (line 217) | class SearchLiveModel {
class SearchLiveItemModel (line 227) | class SearchLiveItemModel {
class SearchMBangumiModel (line 294) | class SearchMBangumiModel {
class SearchMBangumiItemModel (line 307) | class SearchMBangumiItemModel {
class SearchArticleModel (line 394) | class SearchArticleModel {
class SearchArticleItemModel (line 409) | class SearchArticleItemModel {
FILE: lib/models/search/suggest.dart
class SearchSuggestModel (line 4) | class SearchSuggestModel {
class SearchSuggestItem (line 21) | class SearchSuggestItem {
function highlightText (line 41) | Widget highlightText(String str)
FILE: lib/models/user/black.dart
class BlackListDataModel (line 1) | class BlackListDataModel {
class BlackListItem (line 18) | class BlackListItem {
FILE: lib/models/user/fav_detail.dart
class FavDetailData (line 3) | class FavDetailData {
class FavDetailItemData (line 25) | class FavDetailItemData {
method resolveEpId (line 96) | String resolveEpId(url)
class Stat (line 107) | class Stat {
FILE: lib/models/user/fav_folder.dart
class FavFolderData (line 1) | class FavFolderData {
class FavFolderItemData (line 23) | class FavFolderItemData {
class Upper (line 92) | class Upper {
FILE: lib/models/user/history.dart
class HistoryData (line 1) | class HistoryData {
class Cursor (line 26) | class Cursor {
class HisTabItem (line 47) | class HisTabItem {
class HisListItem (line 62) | class HisListItem {
class History (line 146) | class History {
FILE: lib/models/user/info.dart
class UserInfoData (line 5) | @HiveType(typeId: 4)
class LevelInfo (line 112) | @HiveType(typeId: 5)
FILE: lib/models/user/info.g.dart
class UserInfoDataAdapter (line 9) | class UserInfoDataAdapter extends TypeAdapter<UserInfoData> {
method read (line 14) | UserInfoData read(BinaryReader reader)
method write (line 48) | void write(BinaryWriter writer, UserInfoData obj)
class LevelInfoAdapter (line 112) | class LevelInfoAdapter extends TypeAdapter<LevelInfo> {
method read (line 117) | LevelInfo read(BinaryReader reader)
method write (line 131) | void write(BinaryWriter writer, LevelInfo obj)
FILE: lib/models/user/stat.dart
class UserStat (line 1) | class UserStat {
FILE: lib/models/user/sub_detail.dart
class SubDetailModelData (line 1) | class SubDetailModelData {
class SubDetailMediaItem (line 18) | class SubDetailMediaItem {
method toJson (line 59) | Map<String, dynamic> toJson()
class DetailInfo (line 75) | class DetailInfo {
method toJson (line 110) | Map<String, dynamic> toJson()
FILE: lib/models/user/sub_folder.dart
class SubFolderModelData (line 1) | class SubFolderModelData {
class SubFolderItemData (line 22) | class SubFolderItemData {
class Upper (line 93) | class Upper {
FILE: lib/models/video/ai.dart
class AiConclusionModel (line 1) | class AiConclusionModel {
class ModelResult (line 28) | class ModelResult {
class OutlineItem (line 50) | class OutlineItem {
class PartOutline (line 67) | class PartOutline {
FILE: lib/models/video/later.dart
class MediaVideoItemModel (line 1) | class MediaVideoItemModel {
class Coin (line 107) | class Coin {
class Page (line 122) | class Page {
class Dimension (line 158) | class Dimension {
class Meta (line 176) | class Meta {
class Rights (line 191) | class Rights {
class Upper (line 230) | class Upper {
FILE: lib/models/video/play/quality.dart
type VideoQuality (line 3) | enum VideoQuality {
function fromCode (line 35) | VideoQuality? fromCode(int code)
function toCode (line 43) | int? toCode(VideoQuality quality)
type AudioQuality (line 71) | enum AudioQuality { k64, k132, k192, dolby, hiRes }
function fromCode (line 83) | AudioQuality? fromCode(int code)
type VideoDecodeFormats (line 103) | enum VideoDecodeFormats {
function fromCode (line 119) | VideoDecodeFormats? fromCode(String code)
function fromString (line 127) | VideoDecodeFormats? fromString(String val)
FILE: lib/models/video/play/url.dart
class PlayUrlModel (line 3) | class PlayUrlModel {
class Dash (line 68) | class Dash {
class VideoItem (line 97) | class VideoItem {
class AudioItem (line 149) | class AudioItem {
class FormatItem (line 202) | class FormatItem {
class Dolby (line 226) | class Dolby {
class Flac (line 244) | class Flac {
class Durl (line 256) | class Durl {
FILE: lib/models/video/reply/config.dart
class ReplyConfig (line 1) | class ReplyConfig {
FILE: lib/models/video/reply/content.dart
class ReplyContent (line 1) | class ReplyContent {
class MemberItemModel (line 48) | class MemberItemModel {
FILE: lib/models/video/reply/data.dart
class ReplyData (line 7) | class ReplyData {
FILE: lib/models/video/reply/emote.dart
class EmoteModelData (line 1) | class EmoteModelData {
class PackageItem (line 26) | class PackageItem {
class Meta (line 71) | class Meta {
class Emote (line 86) | class Emote {
FILE: lib/models/video/reply/item.dart
class ReplyItemModel (line 4) | class ReplyItemModel {
class UpAction (line 106) | class UpAction {
class ReplyControl (line 118) | class ReplyControl {
FILE: lib/models/video/reply/member.dart
class ReplyMember (line 1) | class ReplyMember {
class Pendant (line 41) | class Pendant {
class UserSailing (line 59) | class UserSailing {
FILE: lib/models/video/reply/page.dart
class ReplyPage (line 1) | class ReplyPage {
FILE: lib/models/video/reply/top_replies.dart
class ReplyTop (line 1) | class ReplyTop {}
FILE: lib/models/video/reply/upper.dart
class ReplyUpper (line 3) | class ReplyUpper {
FILE: lib/models/video/subTitile/content.dart
class SubTitileContentModel (line 1) | class SubTitileContentModel {
FILE: lib/models/video/subTitile/result.dart
class SubTitlteModel (line 1) | class SubTitlteModel {
class SubTitlteItemModel (line 38) | class SubTitlteItemModel {
FILE: lib/models/video_detail_res.dart
class VideoDetailResponse (line 3) | class VideoDetailResponse {
method toJson (line 23) | Map<String, dynamic> toJson()
class VideoDetailData (line 34) | class VideoDetailData {
method resolveEpId (line 165) | String resolveEpId(url)
method toJson (line 175) | Map<String, dynamic> toJson()
class DescV2 (line 216) | class DescV2 {
method toRawJson (line 231) | String toRawJson()
method toJson (line 239) | Map<String, dynamic> toJson()
class Dimension (line 250) | class Dimension {
method toRawJson (line 263) | String toRawJson()
method toJson (line 271) | Map<String, dynamic> toJson()
class HonorReply (line 283) | class HonorReply {
method toRawJson (line 292) | String toRawJson()
method toJson (line 300) | Map<String, dynamic> toJson()
class Honor (line 309) | class Honor {
method toRawJson (line 324) | String toRawJson()
method toJson (line 333) | Map<String, dynamic> toJson()
class Owner (line 345) | class Owner {
method toRawJson (line 358) | String toRawJson()
method toJson (line 366) | Map<String, dynamic> toJson()
class Part (line 375) | class Part {
method toRawJson (line 402) | String toRawJson()
method toJson (line 419) | Map<String, dynamic> toJson()
class Stat (line 434) | class Stat {
method toRawJson (line 467) | String toRawJson()
method toJson (line 485) | Map<String, dynamic> toJson()
class Subtitle (line 505) | class Subtitle {
method toRawJson (line 516) | String toRawJson()
method toJson (line 525) | Map<String, dynamic> toJson()
class UserGarb (line 534) | class UserGarb {
method toRawJson (line 543) | String toRawJson()
method toJson (line 549) | Map<String, dynamic> toJson()
class Label (line 552) | class Label {}
class UgcSeason (line 554) | class UgcSeason {
class SectionItem (line 603) | class SectionItem {
class EpisodeItem (line 629) | class EpisodeItem {
class Staff (line 667) | class Staff {
class Vip (line 692) | class Vip {
FILE: lib/pages/about/index.dart
class AboutPage (line 12) | class AboutPage extends StatefulWidget {
method createState (line 16) | State<AboutPage> createState()
class _AboutPageState (line 19) | class _AboutPageState extends State<AboutPage> {
method initState (line 24) | void initState()
method getCacheSize (line 30) | Future<void> getCacheSize()
method build (line 36) | Widget build(BuildContext context)
class AboutController (line 217) | class AboutController extends GetxController {
method onInit (line 226) | void onInit()
method getCurrentApp (line 248) | Future getCurrentApp()
method getRemoteApp (line 254) | Future getRemoteApp()
method onUpdate (line 269) | Future onUpdate()
FILE: lib/pages/bangumi/controller.dart
class BangumiController (line 8) | class BangumiController extends GetxController {
method onInit (line 20) | void onInit()
method queryBangumiListFeed (line 29) | Future queryBangumiListFeed({type = 'init'})
method onLoad (line 47) | Future onLoad()
method queryBangumiFollow (line 52) | Future queryBangumiFollow()
method animateToTop (line 65) | void animateToTop()
FILE: lib/pages/bangumi/introduction/controller.dart
class BangumiIntroController (line 22) | class BangumiIntroController extends GetxController {
method onInit (line 62) | void onInit()
method queryBangumiIntro (line 69) | Future queryBangumiIntro()
method queryHasLikeVideo (line 87) | Future queryHasLikeVideo()
method queryHasCoinVideo (line 94) | Future queryHasCoinVideo()
method queryHasFavVideo (line 100) | Future queryHasFavVideo()
method actionLikeVideo (line 110) | Future actionLikeVideo()
method actionCoinVideo (line 124) | Future actionCoinVideo()
method actionFavVideo (line 170) | Future actionFavVideo()
method actionShareVideo (line 195) | Future actionShareVideo()
method changeSeasonOrbangu (line 218) | Future changeSeasonOrbangu(bvid, cid, aid, cover)
method bangumiAdd (line 241) | Future bangumiAdd()
method bangumiDel (line 248) | Future bangumiDel()
method queryVideoInFolder (line 254) | Future queryVideoInFolder()
method nextPlay (line 264) | void nextPlay()
method showEposideHandler (line 292) | void showEposideHandler()
FILE: lib/pages/bangumi/introduction/view.dart
class BangumiIntroPanel (line 22) | class BangumiIntroPanel extends StatefulWidget {
method createState (line 30) | State<BangumiIntroPanel> createState()
class _BangumiIntroPanelState (line 33) | class _BangumiIntroPanelState extends State<BangumiIntroPanel>
method initState (line 47) | void initState()
method build (line 61) | Widget build(BuildContext context)
class BangumiInfo (line 100) | class BangumiInfo extends StatefulWidget {
method createState (line 111) | State<BangumiInfo> createState()
class _BangumiInfoState (line 114) | class _BangumiInfoState extends State<BangumiInfo> {
method handleState (line 122) | void Function()? handleState(Future Function() action)
method initState (line 133) | void initState()
method build (line 177) | Widget build(BuildContext context)
method actionGrid (line 335) | Widget actionGrid(BuildContext context, bangumiIntroController)
FILE: lib/pages/bangumi/introduction/widgets/intro_detail.dart
class IntroDetail (line 10) | class IntroDetail extends StatelessWidget {
method build (line 19) | Widget build(BuildContext context)
FILE: lib/pages/bangumi/view.dart
class BangumiPage (line 13) | class BangumiPage extends StatefulWidget {
method createState (line 17) | State<BangumiPage> createState()
class _BangumiPageState (line 20) | class _BangumiPageState extends State<BangumiPage>
method initState (line 31) | void initState()
method dispose (line 51) | void dispose()
method build (line 57) | Widget build(BuildContext context)
method contentGrid (line 202) | Widget contentGrid(ctr, bangumiList)
FILE: lib/pages/bangumi/widgets/bangumi_panel.dart
class BangumiPanel (line 15) | class BangumiPanel extends StatefulWidget {
method createState (line 34) | State<BangumiPanel> createState()
class _BangumiPanelState (line 37) | class _BangumiPanelState extends State<BangumiPanel> {
method initState (line 51) | void initState()
method dispose (line 73) | void dispose()
method changeFucCall (line 78) | void changeFucCall(item, i)
method scrollToIndex (line 98) | void scrollToIndex()
method build (line 116) | Widget build(BuildContext context)
FILE: lib/pages/bangumi/widgets/bangumu_card_v.dart
class BangumiCardV (line 12) | class BangumiCardV extends StatelessWidget {
method build (line 21) | Widget build(BuildContext context)
class BangumiContent (line 82) | class BangumiContent extends StatelessWidget {
method build (line 87) | Widget build(BuildContext context)
FILE: lib/pages/blacklist/index.dart
class BlackListPage (line 12) | class BlackListPage extends StatefulWidget {
method createState (line 16) | State<BlackListPage> createState()
class _BlackListPageState (line 19) | class _BlackListPageState extends State<BlackListPage> {
method initState (line 28) | void initState()
method dispose (line 46) | void dispose()
method build (line 55) | Widget build(BuildContext context)
class BlackListController (line 142) | class BlackListController extends GetxController {
method queryBlacklist (line 148) | Future queryBlacklist({type = 'init'})
method removeBlack (line 166) | Future removeBlack(mid)
FILE: lib/pages/danmaku/controller.dart
class PlDanmakuController (line 4) | class PlDanmakuController {
method initiate (line 16) | void initiate(int videoDuration, int progress)
method dispose (line 28) | void dispose()
method calcSegment (line 33) | int calcSegment(int progress)
method queryDanmaku (line 37) | void queryDanmaku(int segmentIndex)
method getCurrentDanmaku (line 55) | List<DanmakuElem>? getCurrentDanmaku(int progress)
FILE: lib/pages/danmaku/view.dart
class PlDanmaku (line 12) | class PlDanmaku extends StatefulWidget {
method createState (line 27) | State<PlDanmaku> createState()
class _PlDanmakuState (line 30) | class _PlDanmakuState extends State<PlDanmaku> {
method initState (line 46) | void initState()
method playerListener (line 80) | void playerListener(PlayerStatus? status)
method videoPositionListen (line 89) | void videoPositionListen(Duration position)
method dispose (line 121) | void dispose()
method build (line 127) | Widget build(BuildContext context)
FILE: lib/pages/dlna/index.dart
class LiveDlnaPage (line 6) | class LiveDlnaPage extends StatefulWidget {
method createState (line 12) | State<LiveDlnaPage> createState()
class _LiveDlnaPageState (line 15) | class _LiveDlnaPageState extends State<LiveDlnaPage> {
method initState (line 25) | void initState()
method dispose (line 36) | void dispose()
method startSearch (line 42) | void startSearch()
method selectDevice (line 59) | void selectDevice(String key)
method build (line 69) | Widget build(BuildContext context)
FILE: lib/pages/dynamics/controller.dart
class DynamicsController (line 18) | class DynamicsController extends GetxController {
method onInit (line 60) | void onInit()
method queryFollowDynamic (line 69) | Future queryFollowDynamic({type = 'init'})
method queryFollowUp (line 233) | Future queryFollowUp({type = 'init'})
method animateToTop (line 269) | void animateToTop()
method resetSearch (line 280) | void resetSearch()
method onTapUp (line 290) | void onTapUp(data)
FILE: lib/pages/dynamics/detail/controller.dart
class DynamicDetailController (line 11) | class DynamicDetailController extends GetxController {
method onInit (line 31) | void onInit()
method queryReplyList (line 50) | Future queryReplyList({reqType = 'init'})
FILE: lib/pages/dynamics/detail/view.dart
class DynamicDetailPage (line 22) | class DynamicDetailPage extends StatefulWidget {
method createState (line 27) | State<DynamicDetailPage> createState()
class _DynamicDetailPageState (line 30) | class _DynamicDetailPageState extends State<DynamicDetailPage>
method initState (line 48) | void initState()
method init (line 67) | void init()
method replyReply (line 109) | void replyReply(replyItem, currentReply, loadMore)
method scrollListener (line 135) | void scrollListener()
method _showFab (line 168) | void _showFab()
method _hideFab (line 175) | void _hideFab()
method dispose (line 183) | void dispose()
method build (line 192) | Widget build(BuildContext context)
class _MySliverPersistentHeaderDelegate (line 415) | class _MySliverPersistentHeaderDelegate extends SliverPersistentHeaderDe...
method build (line 423) | Widget build(
method shouldRebuild (line 440) | bool shouldRebuild(covariant _MySliverPersistentHeaderDelegate oldDele...
FILE: lib/pages/dynamics/up_dynamic/controller.dart
class UpDynamicsController (line 7) | class UpDynamicsController extends GetxController {
method queryFollowDynamic (line 15) | Future queryFollowDynamic({type = 'init'})
FILE: lib/pages/dynamics/up_dynamic/route_panel.dart
class OverlayPanel (line 10) | class OverlayPanel extends StatefulWidget {
method createState (line 17) | State<OverlayPanel> createState()
class _OverlayPanelState (line 20) | class _OverlayPanelState extends State<OverlayPanel>
method initState (line 30) | void initState()
method onClickUp (line 62) | void onClickUp(data, i, {type = 'click'})
method build (line 69) | Widget build(BuildContext context)
method upItemBuild (line 132) | Widget upItemBuild(data)
FILE: lib/pages/dynamics/up_dynamic/view.dart
class UpDyanmicsPage (line 14) | class UpDyanmicsPage extends StatefulWidget {
method createState (line 25) | State<UpDyanmicsPage> createState()
class _UpDyanmicsPageState (line 28) | class _UpDyanmicsPageState extends State<UpDyanmicsPage>
method initState (line 38) | void initState()
method build (line 58) | Widget build(BuildContext context)
method skeleton (line 147) | Widget skeleton()
class _MySliverPersistentHeaderDelegate (line 156) | class _MySliverPersistentHeaderDelegate extends SliverPersistentHeaderDe...
method build (line 163) | Widget build(
method shouldRebuild (line 175) | bool shouldRebuild(covariant _MySliverPersistentHeaderDelegate oldDele...
FILE: lib/pages/dynamics/view.dart
class DynamicsPage (line 24) | class DynamicsPage extends StatefulWidget {
method createState (line 28) | State<DynamicsPage> createState()
class _DynamicsPageState (line 31) | class _DynamicsPageState extends State<DynamicsPage>
method initState (line 44) | void initState()
method dispose (line 73) | void dispose()
method build (line 79) | Widget build(BuildContext context)
method skeleton (line 297) | Widget skeleton()
FILE: lib/pages/dynamics/widgets/action_panel.dart
class ActionPanel (line 14) | class ActionPanel extends StatefulWidget {
method createState (line 23) | State<ActionPanel> createState()
class _ActionPanelState (line 26) | class _ActionPanelState extends State<ActionPanel>
method handleState (line 39) | void Function()? handleState(Future Function() action)
method initState (line 50) | void initState()
method onLikeDynamic (line 61) | Future onLikeDynamic()
method dynamicPreview (line 91) | Widget dynamicPreview()
method forwardHandler (line 225) | void forwardHandler()
method dispose (line 373) | void dispose()
method build (line 379) | Widget build(BuildContext context)
FILE: lib/pages/dynamics/widgets/additional_panel.dart
function addWidget (line 8) | Widget addWidget(item, context, type, {floor = 1})
FILE: lib/pages/dynamics/widgets/article_panel.dart
function articlePanel (line 6) | Widget articlePanel(item, context, {floor = 1})
FILE: lib/pages/dynamics/widgets/author_panel.dart
class AuthorPanel (line 9) | class AuthorPanel extends StatelessWidget {
method build (line 14) | Widget build(BuildContext context)
class MorePanel (line 105) | class MorePanel extends StatelessWidget {
method build (line 110) | Widget build(BuildContext context)
FILE: lib/pages/dynamics/widgets/content_panel.dart
class Content (line 11) | class Content extends StatefulWidget {
method createState (line 21) | State<Content> createState()
class _ContentState (line 24) | class _ContentState extends State<Content> {
method initState (line 29) | void initState()
method picsNodes (line 39) | InlineSpan picsNodes()
method onPreviewImg (line 162) | void onPreviewImg(picList, initIndex, context)
method build (line 175) | Widget build(BuildContext context)
FILE: lib/pages/dynamics/widgets/dynamic_panel.dart
class DynamicPanel (line 9) | class DynamicPanel extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
FILE: lib/pages/dynamics/widgets/forward_panel.dart
function forWard (line 16) | Widget forWard(item, context, ctr, source, {floor = 1})
FILE: lib/pages/dynamics/widgets/live_panel.dart
function livePanel (line 8) | Widget livePanel(item, context, {floor = 1})
FILE: lib/pages/dynamics/widgets/live_rcmd_panel.dart
function liveRcmdPanel (line 13) | Widget liveRcmdPanel(item, context, {floor = 1})
FILE: lib/pages/dynamics/widgets/pic_panel.dart
function onPreviewImg (line 8) | void onPreviewImg(currentUrl, picList, initIndex, context)
function picWidget (line 20) | Widget picWidget(item, context)
FILE: lib/pages/dynamics/widgets/rich_node_panel.dart
function richNode (line 8) | InlineSpan richNode(item, context)
class _VerticalSpaceSpan (line 363) | class _VerticalSpaceSpan extends WidgetSpan {
FILE: lib/pages/dynamics/widgets/up_panel.dart
class UpPanel (line 10) | class UpPanel extends StatefulWidget {
method createState (line 21) | State<UpPanel> createState()
class _UpPanelState (line 24) | class _UpPanelState extends State<UpPanel> {
method listFormat (line 33) | void listFormat()
method onClickUp (line 39) | void onClickUp(data, i)
method build (line 63) | Widget build(BuildContext context)
method upItemBuild (line 146) | Widget upItemBuild(data, i)
class _SliverHeaderDelegate (line 241) | class _SliverHeaderDelegate extends SliverPersistentHeaderDelegate {
method build (line 248) | Widget build(
method shouldRebuild (line 260) | bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate)
class UpPanelSkeleton (line 264) | class UpPanelSkeleton extends StatelessWidget {
method build (line 268) | Widget build(BuildContext context)
FILE: lib/pages/dynamics/widgets/video_panel.dart
function videoSeasonWidget (line 11) | Widget videoSeasonWidget(item, context, type, {floor = 1})
FILE: lib/pages/emote/controller.dart
class EmotePanelController (line 7) | class EmotePanelController extends GetxController
method getEmote (line 12) | Future getEmote()
FILE: lib/pages/emote/view.dart
class EmotePanel (line 6) | class EmotePanel extends StatefulWidget {
method createState (line 11) | State<EmotePanel> createState()
class _EmotePanelState (line 14) | class _EmotePanelState extends State<EmotePanel>
method initState (line 24) | void initState()
method build (line 30) | Widget build(BuildContext context)
FILE: lib/pages/fan/controller.dart
class FansController (line 8) | class FansController extends GetxController {
method onInit (line 21) | void onInit()
method queryFans (line 31) | Future queryFans(type)
FILE: lib/pages/fan/view.dart
class FansPage (line 11) | class FansPage extends StatefulWidget {
method createState (line 15) | State<FansPage> createState()
class _FansPageState (line 18) | class _FansPageState extends State<FansPage> {
method initState (line 25) | void initState()
method dispose (line 43) | void dispose()
method build (line 49) | Widget build(BuildContext context)
FILE: lib/pages/fan/widgets/fan_item.dart
function fanItem (line 6) | Widget fanItem({item})
FILE: lib/pages/fav/controller.dart
class FavController (line 10) | class FavController extends GetxController {
method onInit (line 24) | void onInit()
method queryFavFolder (line 32) | Future<dynamic> queryFavFolder({type = 'init'})
method onLoad (line 62) | Future onLoad()
FILE: lib/pages/fav/view.dart
class FavPage (line 10) | class FavPage extends StatefulWidget {
method createState (line 14) | State<FavPage> createState()
class _FavPageState (line 17) | class _FavPageState extends State<FavPage> {
method initState (line 23) | void initState()
method build (line 40) | Widget build(BuildContext context)
method _buildBody (line 95) | Widget _buildBody()
FILE: lib/pages/fav/widgets/item.dart
class FavItem (line 7) | class FavItem extends StatelessWidget {
method build (line 15) | Widget build(BuildContext context)
class VideoContent (line 69) | class VideoContent extends StatelessWidget {
method build (line 74) | Widget build(BuildContext context)
FILE: lib/pages/fav_detail/controller.dart
class FavDetailController (line 11) | class FavDetailController extends GetxController {
method onInit (line 26) | void onInit()
method queryUserFavFolderDetail (line 37) | Future<dynamic> queryUserFavFolderDetail({type = 'init'})
method toViewPlayAll (line 136) | Future toViewPlayAll()
FILE: lib/pages/fav_detail/view.dart
class FavDetailPage (line 14) | class FavDetailPage extends StatefulWidget {
method createState (line 18) | State<FavDetailPage> createState()
class _FavDetailPageState (line 21) | class _FavDetailPageState extends State<FavDetailPage> {
method initState (line 31) | void initState()
method dispose (line 54) | void dispose()
method build (line 61) | Widget build(BuildContext context)
FILE: lib/pages/fav_detail/widget/fav_video_card.dart
class FavVideoCardH (line 17) | class FavVideoCardH extends StatelessWidget {
method build (line 32) | Widget build(BuildContext context)
class VideoContent (line 142) | class VideoContent extends StatelessWidget {
method build (line 156) | Widget build(BuildContext context)
FILE: lib/pages/fav_edit/controller.dart
class FavEditController (line 6) | class FavEditController extends GetxController {
method onInit (line 24) | void onInit()
method onSubmit (line 39) | void onSubmit()
method editFolder (line 50) | Future<void> editFolder()
method addFolder (line 65) | Future<void> addFolder()
FILE: lib/pages/fav_edit/view.dart
class FavEditPage (line 6) | class FavEditPage extends StatefulWidget {
method createState (line 10) | State<FavEditPage> createState()
class _FavEditPageState (line 13) | class _FavEditPageState extends State<FavEditPage> {
method build (line 19) | Widget build(BuildContext context)
FILE: lib/pages/fav_search/controller.dart
class FavSearchController (line 9) | class FavSearchController extends GetxController {
method onInit (line 26) | void onInit()
method onClear (line 33) | void onClear()
method onChange (line 42) | void onChange(value)
method submit (line 47) | void submit()
method searchFav (line 54) | Future searchFav({type = 'init'})
FILE: lib/pages/fav_search/view.dart
class FavSearchPage (line 10) | class FavSearchPage extends StatefulWidget {
method createState (line 14) | State<FavSearchPage> createState()
class _FavSearchPageState (line 17) | class _FavSearchPageState extends State<FavSearchPage> {
method initState (line 23) | void initState()
method dispose (line 40) | void dispose()
method build (line 47) | Widget build(BuildContext context)
FILE: lib/pages/follow/controller.dart
class FollowController (line 13) | class FollowController extends GetxController with GetTickerProviderStat...
method onInit (line 28) | void onInit()
method queryFollowings (line 38) | Future queryFollowings(type)
method followUpTags (line 70) | Future followUpTags()
FILE: lib/pages/follow/view.dart
class FollowPage (line 7) | class FollowPage extends StatefulWidget {
method createState (line 11) | State<FollowPage> createState()
class _FollowPageState (line 14) | class _FollowPageState extends State<FollowPage> {
method initState (line 20) | void initState()
method build (line 27) | Widget build(BuildContext context)
class _FakeAPI (line 114) | class _FakeAPI {
method search (line 121) | Future<Iterable<String>> search(String query)
FILE: lib/pages/follow/widgets/follow_item.dart
class FollowItem (line 11) | class FollowItem extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
FILE: lib/pages/follow/widgets/follow_list.dart
class FollowList (line 11) | class FollowList extends StatefulWidget {
method createState (line 19) | State<FollowList> createState()
class _FollowListState (line 22) | class _FollowListState extends State<FollowList> {
method initState (line 27) | void initState()
method dispose (line 43) | void dispose()
method build (line 50) | Widget build(BuildContext context)
FILE: lib/pages/follow/widgets/owner_follow_list.dart
class OwnerFollowList (line 12) | class OwnerFollowList extends StatefulWidget {
method createState (line 18) | State<OwnerFollowList> createState()
class _OwnerFollowListState (line 21) | class _OwnerFollowListState extends State<OwnerFollowList>
method initState (line 35) | void initState()
method followUpGroup (line 53) | Future followUpGroup(type)
method dispose (line 72) | void dispose()
method build (line 79) | Widget build(BuildContext context)
FILE: lib/pages/follow_search/controller.dart
class FollowSearchController (line 7) | class FollowSearchController extends GetxController {
method onInit (line 21) | void onInit()
method onClear (line 27) | void onClear()
method onChange (line 36) | void onChange(value)
method submit (line 41) | void submit()
method searchFollow (line 46) | Future searchFollow({type = 'init'})
method onLoad (line 70) | void onLoad()
FILE: lib/pages/follow_search/view.dart
class FollowSearchPage (line 10) | class FollowSearchPage extends StatefulWidget {
method createState (line 14) | State<FollowSearchPage> createState()
class _FollowSearchPageState (line 17) | class _FollowSearchPageState extends State<FollowSearchPage> {
method initState (line 24) | void initState()
method reRequest (line 40) | void reRequest()
method build (line 47) | Widget build(BuildContext context)
FILE: lib/pages/history/controller.dart
class HistoryController (line 10) | class HistoryController extends GetxController {
method onInit (line 23) | void onInit()
method queryHistoryList (line 29) | Future queryHistoryList({type = 'init'})
method onLoad (line 52) | Future onLoad()
method onRefresh (line 56) | Future onRefresh()
method onPauseHistory (line 61) | Future onPauseHistory()
method historyStatus (line 96) | Future historyStatus()
method onClearHistory (line 105) | Future onClearHistory()
method delHistory (line 137) | Future delHistory(kid, business)
method onDelHistory (line 153) | Future onDelHistory()
method onDelCheckedHistory (line 166) | Future onDelCheckedHistory()
FILE: lib/pages/history/view.dart
class HistoryPage (line 12) | class HistoryPage extends StatefulWidget {
method createState (line 16) | State<HistoryPage> createState()
class _HistoryPageState (line 19) | class _HistoryPageState extends State<HistoryPage> {
method initState (line 25) | void initState()
method dispose (line 61) | void dispose()
method build (line 67) | Widget build(BuildContext context)
class AppBarWidget (line 250) | class AppBarWidget extends StatelessWidget implements PreferredSizeWidget {
method build (line 265) | Widget build(BuildContext context)
FILE: lib/pages/history/widgets/item.dart
class HistoryItem (line 19) | class HistoryItem extends StatelessWidget {
method build (line 33) | Widget build(BuildContext context)
class VideoContent (line 286) | class VideoContent extends StatelessWidget {
method build (line 292) | Widget build(BuildContext context)
FILE: lib/pages/history_search/controller.dart
class HistorySearchController (line 7) | class HistorySearchController extends GetxController {
method onClear (line 23) | void onClear()
method onChange (line 32) | void onChange(value)
method submit (line 37) | void submit()
method searchHistories (line 45) | Future searchHistories({type = 'init'})
method delHistory (line 74) | Future delHistory(kid, business)
FILE: lib/pages/history_search/view.dart
class HistorySearchPage (line 10) | class HistorySearchPage extends StatefulWidget {
method createState (line 14) | State<HistorySearchPage> createState()
class _HistorySearchPageState (line 17) | class _HistorySearchPageState extends State<HistorySearchPage> {
method initState (line 22) | void initState()
method dispose (line 38) | void dispose()
method build (line 45) | Widget build(BuildContext context)
FILE: lib/pages/home/controller.dart
class HomeController (line 10) | class HomeController extends GetxController with GetTickerProviderStateM...
method onInit (line 32) | void onInit()
method onRefresh (line 48) | void onRefresh()
method animateToTop (line 54) | void animateToTop()
method updateLoginStatus (line 61) | void updateLoginStatus(val)
method setTabConfig (line 68) | void setTabConfig()
method searchDefault (line 111) | void searchDefault()
method onClose (line 119) | void onClose()
FILE: lib/pages/home/view.dart
class HomePage (line 12) | class HomePage extends StatefulWidget {
method createState (line 16) | State<HomePage> createState()
class _HomePageState (line 19) | class _HomePageState extends State<HomePage>
method initState (line 29) | void initState()
method build (line 48) | Widget build(BuildContext context)
class CustomAppBar (line 124) | class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
method build (line 142) | Widget build(BuildContext context)
class UserInfoWidget (line 171) | class UserInfoWidget extends StatelessWidget {
method buildLoggedInWidget (line 187) | Widget buildLoggedInWidget(context)
method build (line 216) | Widget build(BuildContext context)
class DefaultUser (line 240) | class DefaultUser extends StatelessWidget {
method build (line 245) | Widget build(BuildContext context)
class CustomTabs (line 270) | class CustomTabs extends StatefulWidget {
method createState (line 274) | State<CustomTabs> createState()
class _CustomTabsState (line 277) | class _CustomTabsState extends State<CustomTabs> {
method onTap (line 280) | void onTap(int index)
method build (line 290) | Widget build(BuildContext context)
class CustomChip (line 318) | class CustomChip extends StatelessWidget {
method build (line 330) | Widget build(BuildContext context)
class SearchBar (line 363) | class SearchBar extends StatelessWidget {
method build (line 372) | Widget build(BuildContext context)
FILE: lib/pages/home/widgets/app_bar.dart
class HomeAppBar (line 11) | class HomeAppBar extends StatelessWidget {
method build (line 15) | Widget build(BuildContext context)
FILE: lib/pages/hot/controller.dart
class HotController (line 6) | class HotController extends GetxController {
method queryHotFeed (line 16) | Future queryHotFeed(type)
method onRefresh (line 36) | Future onRefresh()
method onLoad (line 41) | Future onLoad()
method animateToTop (line 46) | void animateToTop()
FILE: lib/pages/hot/view.dart
class HotPage (line 12) | class HotPage extends StatefulWidget {
method createState (line 16) | State<HotPage> createState()
class _HotPageState (line 19) | class _HotPageState extends State<HotPage> with AutomaticKeepAliveClient...
method initState (line 29) | void initState()
method dispose (line 48) | void dispose()
method build (line 54) | Widget build(BuildContext context)
FILE: lib/pages/html/controller.dart
class HtmlRenderController (line 11) | class HtmlRenderController extends GetxController {
method onInit (line 31) | void onInit()
method reqHtml (line 39) | Future reqHtml(id)
method queryReplyList (line 52) | Future queryReplyList({reqType = 'init'})
FILE: lib/pages/html/view.dart
class HtmlRenderPage (line 19) | class HtmlRenderPage extends StatefulWidget {
method createState (line 23) | State<HtmlRenderPage> createState()
class _HtmlRenderPageState (line 26) | class _HtmlRenderPageState extends State<HtmlRenderPage>
method initState (line 40) | void initState()
method scrollListener (line 55) | void scrollListener()
method _showFab (line 88) | void _showFab()
method _hideFab (line 95) | void _hideFab()
method replyReply (line 102) | void replyReply(replyItem)
method build (line 127) | Widget build(BuildContext context)
FILE: lib/pages/later/controller.dart
class LaterController (line 11) | class LaterController extends GetxController {
method onInit (line 20) | void onInit()
method queryLaterList (line 25) | Future queryLaterList()
method toViewDel (line 41) | Future toViewDel({int? aid})
method toViewClear (line 81) | Future toViewClear()
method toViewPlayAll (line 115) | Future toViewPlayAll()
FILE: lib/pages/later/view.dart
class LaterPage (line 10) | class LaterPage extends StatefulWidget {
method createState (line 14) | State<LaterPage> createState()
class _LaterPageState (line 17) | class _LaterPageState extends State<LaterPage> {
method initState (line 22) | void initState()
method build (line 28) | Widget build(BuildContext context)
FILE: lib/pages/live/controller.dart
class LiveController (line 9) | class LiveController extends GetxController {
method onInit (line 22) | void onInit()
method queryLiveList (line 29) | Future queryLiveList(type)
method onRefresh (line 48) | Future onRefresh()
method onLoad (line 54) | Future onLoad()
method animateToTop (line 59) | void animateToTop()
method fetchLiveFollowing (line 70) | Future fetchLiveFollowing()
FILE: lib/pages/live/view.dart
class LivePage (line 16) | class LivePage extends StatefulWidget {
method createState (line 20) | State<LivePage> createState()
class _LivePageState (line 23) | class _LivePageState extends State<LivePage>
method initState (line 34) | void initState()
method dispose (line 54) | void dispose()
method build (line 60) | Widget build(BuildContext context)
method contentGrid (line 118) | Widget contentGrid(ctr, liveList)
method buildFollowingList (line 157) | Widget buildFollowingList()
class LiveFollowingListView (line 232) | class LiveFollowingListView extends StatelessWidget {
method build (line 238) | Widget build(BuildContext context)
FILE: lib/pages/live/widgets/live_item.dart
class LiveCardV (line 11) | class LiveCardV extends StatelessWidget {
method build (line 22) | Widget build(BuildContext context)
class LiveContent (line 79) | class LiveContent extends StatelessWidget {
method build (line 86) | Widget build(BuildContext context)
class VideoStat (line 150) | class VideoStat extends StatelessWidget {
method build (line 159) | Widget build(BuildContext context)
FILE: lib/pages/live_room/controller.dart
class LiveRoomController (line 21) | class LiveRoomController extends GetxController {
method onInit (line 54) | void onInit()
method queryLiveInfo (line 103) | Future queryLiveInfo()
method setVolumn (line 137) | void setVolumn(value)
method queryLiveInfoH5 (line 148) | Future queryLiveInfoH5()
method changeQn (line 157) | void changeQn(int qn)
method liveDanmakuInfo (line 169) | Future liveDanmakuInfo()
method initSocket (line 181) | void initSocket()
method joinRoom (line 252) | void joinRoom()
method sendMsg (line 269) | void sendMsg()
method heartBeat (line 286) | void heartBeat()
method encodeToBase64 (line 290) | String encodeToBase64(String input)
method onClose (line 297) | void onClose()
FILE: lib/pages/live_room/view.dart
class LiveRoomPage (line 16) | class LiveRoomPage extends StatefulWidget {
method createState (line 20) | State<LiveRoomPage> createState()
class _LiveRoomPageState (line 23) | class _LiveRoomPageState extends State<LiveRoomPage>
method initState (line 39) | void initState()
method videoSourceInit (line 55) | Future<void> videoSourceInit()
method _onScroll (line 60) | void _onScroll()
method didChangeDependencies (line 74) | void didChangeDependencies()
method _scrollToBottom (line 83) | void _scrollToBottom()
method dispose (line 99) | void dispose()
method build (line 110) | Widget build(BuildContext context)
function buildMessageListUI (line 436) | Widget buildMessageListUI(
function buildMessageTextSpan (line 526) | List<InlineSpan> buildMessageTextSpan(
FILE: lib/pages/live_room/widgets/bottom_control.dart
class BottomControl (line 13) | class BottomControl extends StatefulWidget implements PreferredSizeWidget {
method createState (line 27) | State<BottomControl> createState()
class _BottomControlState (line 33) | class _BottomControlState extends State<BottomControl> {
method initState (line 41) | void initState()
method build (line 46) | Widget build(BuildContext context)
FILE: lib/pages/login/controller.dart
class LoginPageController (line 13) | class LoginPageController extends GetxController {
method onPageChange (line 51) | void onPageChange(int index)
method nextStep (line 56) | void nextStep()
method previousPage (line 69) | void previousPage()
method changeLoginType (line 80) | void changeLoginType()
method loginInByAppPassword (line 90) | void loginInByAppPassword()
method loginInByWebPassword (line 109) | void loginInByWebPassword()
method loginInByCode (line 149) | void loginInByCode()
method getAppMsgCode (line 167) | void getAppMsgCode()
method getCaptcha (line 183) | Future getCaptcha(oncall)
method getWebMsgCode (line 278) | void getWebMsgCode()
method startTimer (line 302) | void startTimer()
method getWebQrcode (line 315) | Future getWebQrcode()
method queryWebQrcodeStatus (line 336) | Future queryWebQrcodeStatus()
FILE: lib/pages/login/view.dart
class LoginPage (line 7) | class LoginPage extends StatefulWidget {
method createState (line 11) | State<LoginPage> createState()
class _LoginPageState (line 14) | class _LoginPageState extends State<LoginPage> {
method dispose (line 18) | void dispose()
method build (line 25) | Widget build(BuildContext context)
FILE: lib/pages/main/controller.dart
class MainController (line 14) | class MainController extends GetxController {
method onInit (line 34) | void onInit()
method onBackPressed (line 55) | void onBackPressed(BuildContext context)
method getUnreadDynamic (line 70) | void getUnreadDynamic()
method clearUnread (line 85) | void clearUnread()
method setNavBarConfig (line 94) | void setNavBarConfig()
method onClose (line 113) | void onClose()
FILE: lib/pages/main/view.dart
class MainApp (line 16) | class MainApp extends StatefulWidget {
method createState (line 20) | State<MainApp> createState()
class _MainAppState (line 23) | class _MainAppState extends State<MainApp> with SingleTickerProviderStat...
method initState (line 35) | void initState()
method setIndex (line 44) | void setIndex(int value)
method controllerInit (line 99) | void controllerInit()
method dispose (line 113) | void dispose()
method build (line 120) | Widget build(BuildContext context)
FILE: lib/pages/media/controller.dart
class MediaController (line 9) | class MediaController extends GetxController {
method onInit (line 47) | void onInit()
method queryFavFolder (line 53) | Future<dynamic> queryFavFolder()
FILE: lib/pages/media/view.dart
class MediaPage (line 11) | class MediaPage extends StatefulWidget {
method createState (line 15) | State<MediaPage> createState()
class _MediaPageState (line 18) | class _MediaPageState extends State<MediaPage>
method initState (line 27) | void initState()
method dispose (line 39) | void dispose()
method build (line 45) | Widget build(BuildContext context)
method favFolder (line 100) | Widget favFolder(mediaController, context)
class FavFolderItem (line 228) | class FavFolderItem extends StatelessWidget {
method build (line 233) | Widget build(BuildContext context)
FILE: lib/pages/member/controller.dart
class MemberController (line 15) | class MemberController extends GetxController {
method onInit (line 33) | void onInit()
method getInfo (line 45) | Future<Map<String, dynamic>> getInfo()
method getMemberStat (line 57) | Future<Map<String, dynamic>> getMemberStat()
method getMemberView (line 66) | Future<Map<String, dynamic>> getMemberView()
method actionRelationMod (line 75) | Future actionRelationMod()
method relationSearch (line 120) | Future relationSearch()
method blockUser (line 149) | Future blockUser()
method shareUser (line 193) | void shareUser()
method getMemberSeasons (line 198) | Future getMemberSeasons()
method getRecentCoinVideo (line 214) | Future getRecentCoinVideo()
method getRecentLikeVideo (line 222) | Future getRecentLikeVideo()
method pushDynamicsPage (line 230) | void pushDynamicsPage()
method pushArchivesPage (line 233) | void pushArchivesPage()
method pushSeasonsPage (line 236) | void pushSeasonsPage()
method pushRecentCoinsPage (line 238) | void pushRecentCoinsPage()
method pushfavPage (line 242) | void pushfavPage()
method pushArticlePage (line 244) | void pushArticlePage()
FILE: lib/pages/member/view.dart
class MemberPage (line 16) | class MemberPage extends StatefulWidget {
method createState (line 20) | State<MemberPage> createState()
class _MemberPageState (line 23) | class _MemberPageState extends State<MemberPage>
method initState (line 37) | void initState()
method dispose (line 59) | void dispose()
method build (line 66) | Widget build(BuildContext context)
method profileWidget (line 328) | Widget profileWidget()
method commenWidget (line 456) | Widget commenWidget(msg)
FILE: lib/pages/member/widgets/conis.dart
class MemberCoinsPanel (line 6) | class MemberCoinsPanel extends StatelessWidget {
method build (line 11) | Widget build(BuildContext context)
FILE: lib/pages/member/widgets/like.dart
class MemberLikePanel (line 6) | class MemberLikePanel extends StatelessWidget {
method build (line 11) | Widget build(BuildContext context)
FILE: lib/pages/member/widgets/profile.dart
class ProfilePanel (line 9) | class ProfilePanel extends StatelessWidget {
method build (line 19) | Widget build(BuildContext context)
FILE: lib/pages/member/widgets/seasons.dart
class MemberSeasonsPanel (line 8) | class MemberSeasonsPanel extends StatelessWidget {
method build (line 13) | Widget build(BuildContext context)
FILE: lib/pages/member_archive/controller.dart
class MemberArchiveController (line 6) | class MemberArchiveController extends GetxController {
method onInit (line 22) | void onInit()
method getMemberArchive (line 29) | Future getMemberArchive(type)
method onLoad (line 69) | Future onLoad()
FILE: lib/pages/member_archive/view.dart
class MemberArchivePage (line 11) | class MemberArchivePage extends StatefulWidget {
method createState (line 15) | State<MemberArchivePage> createState()
class _MemberArchivePageState (line 18) | class _MemberArchivePageState extends State<MemberArchivePage> {
method initState (line 25) | void initState()
method build (line 47) | Widget build(BuildContext context)
FILE: lib/pages/member_article/controller.dart
class MemberArticleController (line 7) | class MemberArticleController extends GetxController {
method onInit (line 18) | void onInit()
method getWWebid (line 24) | Future getWWebid()
method getMemberArticle (line 34) | Future getMemberArticle(type)
FILE: lib/pages/member_article/view.dart
class MemberArticlePage (line 12) | class MemberArticlePage extends StatefulWidget {
method createState (line 16) | State<MemberArticlePage> createState()
class _MemberArticlePageState (line 19) | class _MemberArticlePageState extends State<MemberArticlePage> {
method initState (line 26) | void initState()
method _scrollListener (line 37) | void _scrollListener()
method build (line 48) | Widget build(BuildContext context)
method _buildContent (line 77) | Widget _buildContent(Map data)
method _buildListItem (line 107) | Widget _buildListItem(dynamic item)
method _buildError (line 140) | Widget _buildError(String errMsg)
method _buildSkeleton (line 154) | Widget _buildSkeleton()
FILE: lib/pages/member_coin/controller.dart
class MemberCoinController (line 3) | class MemberCoinController extends GetxController {}
FILE: lib/pages/member_coin/view.dart
class MemberCoinPage (line 3) | class MemberCoinPage extends StatefulWidget {
method createState (line 7) | State<MemberCoinPage> createState()
class _MemberCoinPageState (line 10) | class _MemberCoinPageState extends State<MemberCoinPage> {
method build (line 12) | Widget build(BuildContext context)
FILE: lib/pages/member_coin/widgets/item.dart
class MemberCoinsItem (line 11) | class MemberCoinsItem extends StatelessWidget {
method build (line 20) | Widget build(BuildContext context)
FILE: lib/pages/member_dynamics/controller.dart
class MemberDynamicsController (line 6) | class MemberDynamicsController extends GetxController {
method onInit (line 15) | void onInit()
method getMemberDynamic (line 20) | Future getMemberDynamic(type)
method onLoad (line 41) | Future onLoad()
FILE: lib/pages/member_dynamics/view.dart
class MemberDynamicsPage (line 11) | class MemberDynamicsPage extends StatefulWidget {
method createState (line 15) | State<MemberDynamicsPage> createState()
class _MemberDynamicsPageState (line 18) | class _MemberDynamicsPageState extends State<MemberDynamicsPage> {
method initState (line 25) | void initState()
method dispose (line 48) | void dispose()
method build (line 54) | Widget build(BuildContext context)
FILE: lib/pages/member_like/controller.dart
class MemberLikeController (line 3) | class MemberLikeController extends GetxController {}
FILE: lib/pages/member_like/view.dart
class MemberLikePage (line 3) | class MemberLikePage extends StatefulWidget {
method createState (line 7) | State<MemberLikePage> createState()
class _MemberLikePageState (line 10) | class _MemberLikePageState extends State<MemberLikePage> {
method build (line 12) | Widget build(BuildContext context)
FILE: lib/pages/member_like/widgets/item.dart
class MemberLikeItem (line 11) | class MemberLikeItem extends StatelessWidget {
method build (line 20) | Widget build(BuildContext context)
FILE: lib/pages/member_search/controller.dart
class MemberSearchController (line 6) | class MemberSearchController extends GetxController {
method onInit (line 26) | void onInit()
method onClear (line 33) | void onClear()
method onChange (line 42) | void onChange(value)
method submit (line 47) | void submit()
method searchArchives (line 56) | Future searchArchives({type = 'init'})
method searchDynamic (line 84) | Future searchDynamic()
FILE: lib/pages/member_search/view.dart
class MemberSearchPage (line 12) | class MemberSearchPage extends StatefulWidget {
method createState (line 16) | State<MemberSearchPage> createState()
class _MemberSearchPageState (line 19) | class _MemberSearchPageState extends State<MemberSearchPage>
method initState (line 26) | void initState()
method dispose (line 43) | void dispose()
method build (line 49) | Widget build(BuildContext context)
FILE: lib/pages/member_seasons/controller.dart
class MemberSeasonsController (line 6) | class MemberSeasonsController extends GetxController {
method onInit (line 19) | void onInit()
method getSeasonDetail (line 32) | Future getSeasonDetail(type)
method getSeriesDetail (line 52) | Future getSeriesDetail(type)
method onLoad (line 71) | Future onLoad()
FILE: lib/pages/member_seasons/view.dart
class MemberSeasonsPage (line 8) | class MemberSeasonsPage extends StatefulWidget {
method createState (line 12) | State<MemberSeasonsPage> createState()
class _MemberSeasonsPageState (line 15) | class _MemberSeasonsPageState extends State<MemberSeasonsPage> {
method initState (line 23) | void initState()
method build (line 44) | Widget build(BuildContext context)
FILE: lib/pages/member_seasons/widgets/item.dart
class MemberSeasonsItem (line 12) | class MemberSeasonsItem extends StatelessWidget {
method build (line 21) | Widget build(BuildContext context)
FILE: lib/pages/message/at/controller.dart
class MessageAtController (line 3) | class MessageAtController extends GetxController {}
FILE: lib/pages/message/at/view.dart
class MessageAtPage (line 3) | class MessageAtPage extends StatefulWidget {
method createState (line 7) | State<MessageAtPage> createState()
class _MessageAtPageState (line 10) | class _MessageAtPageState extends State<MessageAtPage> {
method build (line 12) | Widget build(BuildContext context)
FILE: lib/pages/message/like/controller.dart
class MessageLikeController (line 5) | class MessageLikeController extends GetxController {
method queryMessageLike (line 9) | Future queryMessageLike({String type = 'init'})
method expandedUsersAvatar (line 26) | Future expandedUsersAvatar(i)
FILE: lib/pages/message/like/view.dart
class MessageLikePage (line 13) | class MessageLikePage extends StatefulWidget {
method createState (line 17) | State<MessageLikePage> createState()
class _MessageLikePageState (line 20) | class _MessageLikePageState extends State<MessageLikePage> {
method initState (line 27) | void initState()
method dispose (line 43) | void dispose()
method build (line 49) | Widget build(BuildContext context)
class LikeItem (line 112) | class LikeItem extends StatelessWidget {
method build (line 124) | Widget build(BuildContext context)
FILE: lib/pages/message/reply/controller.dart
class MessageReplyController (line 5) | class MessageReplyController extends GetxController {
method queryMessageReply (line 9) | Future queryMessageReply({String type = 'init'})
FILE: lib/pages/message/reply/view.dart
class MessageReplyPage (line 13) | class MessageReplyPage extends StatefulWidget {
method createState (line 17) | State<MessageReplyPage> createState()
class _MessageReplyPageState (line 20) | class _MessageReplyPageState extends State<MessageReplyPage> {
method initState (line 27) | void initState()
method dispose (line 43) | void dispose()
method build (line 49) | Widget build(BuildContext context)
class ReplyItem (line 109) | class ReplyItem extends StatelessWidget {
method build (line 115) | Widget build(BuildContext context)
function buildContent (line 231) | InlineSpan buildContent(BuildContext context, item)
FILE: lib/pages/message/system/controller.dart
class MessageSystemController (line 6) | class MessageSystemController extends GetxController {
method queryAndProcessMessages (line 9) | Future<void> queryAndProcessMessages({String type = 'init'})
method queryMessageSystem (line 39) | Future queryMessageSystem({String type = 'init'})
method queryMessageSystemAccount (line 45) | Future queryMessageSystemAccount({String type = 'init'})
method systemMarkRead (line 51) | void systemMarkRead(int cursor)
FILE: lib/pages/message/system/view.dart
class MessageSystemPage (line 7) | class MessageSystemPage extends StatefulWidget {
method createState (line 11) | State<MessageSystemPage> createState()
class _MessageSystemPageState (line 14) | class _MessageSystemPageState extends State<MessageSystemPage> {
method initState (line 21) | void initState()
method build (line 27) | Widget build(BuildContext context)
class SystemItem (line 90) | class SystemItem extends StatelessWidget {
method build (line 102) | Widget build(BuildContext context)
FILE: lib/pages/mine/controller.dart
class MineController (line 11) | class MineController extends GetxController {
method queryUserInfo (line 47) | Future queryUserInfo()
method queryUserStatOwner (line 65) | Future queryUserStatOwner()
method resetUserInfo (line 73) | Future resetUserInfo()
FILE: lib/pages/mine/view.dart
class MinePage (line 12) | class MinePage extends StatefulWidget {
method createState (line 16) | State<MinePage> createState()
class _MinePageState (line 19) | class _MinePageState extends State<MinePage> {
method initState (line 24) | void initState()
method build (line 38) | Widget build(BuildContext context)
method userInfoBuild (line 111) | Widget userInfoBuild(_mineController, context)
class ActionItem (line 336) | class ActionItem extends StatelessWidget {
method build (line 349) | Widget build(BuildContext context)
FILE: lib/pages/opus/controller.dart
class OpusController (line 9) | class OpusController extends GetxController {
method onInit (line 19) | void onInit()
method fetchOpusData (line 30) | Future fetchOpusData()
method _scrollListener (line 48) | void _scrollListener()
method onPreviewImg (line 57) | void onPreviewImg(picList, initIndex, context)
method onJumpWebview (line 70) | void onJumpWebview()
method onClose (line 79) | void onClose()
FILE: lib/pages/opus/text_helper.dart
class TextHelper (line 4) | class TextHelper {
method getAlignment (line 5) | Alignment getAlignment(int? align)
method buildTextSpan (line 18) | TextSpan buildTextSpan(
FILE: lib/pages/opus/view.dart
class OpusPage (line 8) | class OpusPage extends StatefulWidget {
method createState (line 12) | State<OpusPage> createState()
class _OpusPageState (line 15) | class _OpusPageState extends State<OpusPage> {
method initState (line 20) | void initState()
method build (line 26) | Widget build(BuildContext context)
method _buildAppBar (line 43) | AppBar _buildAppBar()
method _buildTitle (line 77) | Widget _buildTitle()
method _buildFutureContent (line 94) | Widget _buildFutureContent()
method _buildContent (line 114) | Widget _buildContent(OpusDataModel opusData)
method _buildAuthorWidget (line 208) | Widget _buildAuthorWidget(OpusDataModel opusData)
method _buildStatsWidget (line 243) | Widget _buildStatsWidget(OpusDataModel opusData)
method _buildError (line 257) | Widget _buildError(String message)
method _buildLoading (line 266) | Widget _buildLoading()
class StyledText (line 276) | class StyledText extends StatelessWidget {
method build (line 282) | Widget build(BuildContext context)
FILE: lib/pages/rank/controller.dart
class RankController (line 10) | class RankController extends GetxController with GetTickerProviderStateM...
method onInit (line 22) | void onInit()
method onRefresh (line 28) | void onRefresh()
method animateToTop (line 34) | void animateToTop()
method setTabConfig (line 40) | void setTabConfig()
method onClose (line 56) | void onClose()
FILE: lib/pages/rank/view.dart
class RankPage (line 10) | class RankPage extends StatefulWidget {
method createState (line 14) | State<RankPage> createState()
class _RankPageState (line 17) | class _RankPageState extends State<RankPage>
method initState (line 27) | void initState()
method build (line 33) | Widget build(BuildContext context)
class CustomAppBar (line 99) | class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
method build (line 111) | Widget build(BuildContext context)
FILE: lib/pages/rank/zone/controller.dart
class ZoneController (line 6) | class ZoneController extends GetxController {
method queryRankFeed (line 15) | Future queryRankFeed(type, rid)
method onRefresh (line 34) | Future onRefresh()
method onLoad (line 39) | Future onLoad()
method animateToTop (line 44) | void animateToTop()
FILE: lib/pages/rank/zone/view.dart
class ZonePage (line 12) | class ZonePage extends StatefulWidget {
method createState (line 18) | State<ZonePage> createState()
class _ZonePageState (line 21) | class _ZonePageState extends State<ZonePage>
method initState (line 32) | void initState()
method dispose (line 52) | void dispose()
method build (line 58) | Widget build(BuildContext context)
FILE: lib/pages/rcmd/controller.dart
class RcmdController (line 10) | class RcmdController extends GetxController {
method onInit (line 24) | void onInit()
method queryRcmdFeed (line 40) | Future queryRcmdFeed(type)
method onRefresh (line 90) | Future onRefresh()
method onLoad (line 96) | Future onLoad()
method animateToTop (line 101) | void animateToTop()
method blockUserCb (line 111) | void blockUserCb(mid)
FILE: lib/pages/rcmd/view.dart
class RcmdPage (line 14) | class RcmdPage extends StatefulWidget {
method createState (line 18) | State<RcmdPage> createState()
class _RcmdPageState (line 21) | class _RcmdPageState extends State<RcmdPage>
method initState (line 30) | void initState()
method dispose (line 50) | void dispose()
method build (line 56) | Widget build(BuildContext context)
method contentGrid (line 119) | Widget contentGrid(ctr, videoList)
FILE: lib/pages/read/controller.dart
class ReadPageController (line 9) | class ReadPageController extends GetxController {
method onInit (line 19) | void onInit()
method fetchCvData (line 29) | Future fetchCvData()
method _scrollListener (line 38) | void _scrollListener()
method onPreviewImg (line 47) | void onPreviewImg(picList, initIndex, context)
method fetchViewInfo (line 59) | void fetchViewInfo()
method onJumpWebview (line 64) | void onJumpWebview()
method onClose (line 73) | void onClose()
FILE: lib/pages/read/view.dart
class ReadPage (line 11) | class ReadPage extends StatefulWidget {
method createState (line 15) | State<ReadPage> createState()
class _ReadPageState (line 18) | class _ReadPageState extends State<ReadPage> {
method initState (line 23) | void initState()
method extractDataSrc (line 28) | List<String> extractDataSrc(String input)
method build (line 38) | Widget build(BuildContext context)
method _buildAppBar (line 55) | AppBar _buildAppBar()
method _buildTitle (line 89) | Widget _buildTitle()
method _buildFutureContent (line 106) | Widget _buildFutureContent()
method _buildContent (line 126) | Widget _buildContent(ReadDataModel cvData)
method _extractPicList (line 138) | List<String> _extractPicList(ReadDataModel cvData)
method _buildNonOpusContent (line 154) | Widget _buildNonOpusContent(ReadDataModel cvData, List<String> imgList)
method _buildOpusContent (line 175) | Widget _buildOpusContent(ReadDataModel cvData, List<String> picList)
method _buildTextParagraph (line 206) | Widget _buildTextParagraph(ModuleParagraph paragraph)
method _buildError (line 221) | Widget _buildError(String message)
method _buildLoading (line 230) | Widget _buildLoading()
method _buildStatsWidget (line 239) | Widget _buildStatsWidget(ReadDataModel cvData)
method _buildAuthorWidget (line 257) | Widget _buildAuthorWidget(ReadDataModel cvData)
method _buildPics (line 303) | List<Widget> _buildPics(ModuleParagraph paragraph, List<String> picList)
class StyledText (line 333) | class StyledText extends StatelessWidget {
method build (line 339) | Widget build(BuildContext context)
FILE: lib/pages/search/controller.dart
class SSearchController (line 10) | class SSearchController extends GetxController {
method onInit (line 27) | void onInit()
method onChange (line 44) | void onChange(value)
method onClear (line 53) | void onClear()
method submit (line 64) | void submit()
method queryHotSearchList (line 82) | Future queryHotSearchList()
method onClickKeyword (line 91) | void onClickKeyword(String keyword)
method querySearchSuggest (line 101) | Future querySearchSuggest(String value)
FILE: lib/pages/search/view.dart
class SearchPage (line 9) | class SearchPage extends StatefulWidget {
method createState (line 13) | State<SearchPage> createState()
class _SearchPageState (line 18) | class _SearchPageState extends State<SearchPage> with RouteAware {
method initState (line 23) | void initState()
method didPopNext (line 30) | void didPopNext()
method didChangeDependencies (line 36) | void didChangeDependencies()
method build (line 43) | Widget build(BuildContext context)
method _searchSuggest (line 103) | Widget _searchSuggest()
method hotSearch (line 131) | Widget hotSearch(ctr)
method _history (line 219) | Widget _history()
FILE: lib/pages/search/widgets/hot_keyword.dart
class HotKeyword (line 5) | class HotKeyword extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
FILE: lib/pages/search/widgets/search_text.dart
class SearchText (line 3) | class SearchText extends StatelessWidget {
method build (line 19) | Widget build(BuildContext context)
FILE: lib/pages/search_panel/controller.dart
class SearchPanelController (line 8) | class SearchPanelController extends GetxController {
method onSearch (line 22) | Future onSearch({type = 'init'})
method onRefresh (line 45) | Future onRefresh()
method animateToTop (line 51) | void animateToTop()
method onPushDetail (line 61) | void onPushDetail(keyword, resultList)
FILE: lib/pages/search_panel/view.dart
class SearchPanel (line 18) | class SearchPanel extends StatefulWidget {
method createState (line 27) | State<SearchPanel> createState()
class _SearchPanelState (line 30) | class _SearchPanelState extends State<SearchPanel>
method initState (line 41) | void initState()
method dispose (line 68) | void dispose()
method build (line 74) | Widget build(BuildContext context)
FILE: lib/pages/search_panel/widgets/article_panel.dart
class SearchArticlePanel (line 11) | class SearchArticlePanel extends StatelessWidget {
method build (line 24) | Widget build(BuildContext context)
function searchArticlePanel (line 70) | Widget searchArticlePanel(BuildContext context, ctr, list)
class CustomFilterChip (line 189) | class CustomFilterChip extends StatelessWidget {
method build (line 204) | Widget build(BuildContext context)
class ArticlePanelController (line 234) | class ArticlePanelController extends GetxController {
method onInit (line 239) | void onInit()
FILE: lib/pages/search_panel/widgets/live_panel.dart
function searchLivePanel (line 9) | Widget searchLivePanel(BuildContext context, ctr, list)
class LiveItem (line 31) | class LiveItem extends StatelessWidget {
method build (line 36) | Widget build(BuildContext context)
class LiveContent (line 98) | class LiveContent extends StatelessWidget {
method build (line 102) | Widget build(BuildContext context)
class LiveStat (line 146) | class LiveStat extends StatelessWidget {
method build (line 154) | Widget build(BuildContext context)
FILE: lib/pages/search_panel/widgets/media_bangumi_panel.dart
function searchMbangumiPanel (line 13) | Widget searchMbangumiPanel(BuildContext context, ctr, list)
FILE: lib/pages/search_panel/widgets/user_panel.dart
function searchUserPanel (line 6) | Widget searchUserPanel(BuildContext context, ctr, list)
FILE: lib/pages/search_panel/widgets/video_panel.dart
class SearchVideoPanel (line 10) | class SearchVideoPanel extends StatelessWidget {
method build (line 23) | Widget build(BuildContext context)
class CustomFilterChip (line 125) | class CustomFilterChip extends StatelessWidget {
method build (line 140) | Widget build(BuildContext context)
class VideoPanelController (line 170) | class VideoPanelController extends GetxController {
method onInit (line 209) | void onInit()
FILE: lib/pages/search_result/controller.dart
class SearchResultController (line 5) | class SearchResultController extends GetxController {
method onInit (line 11) | void onInit()
method querySearchCount (line 22) | Future querySearchCount()
FILE: lib/pages/search_result/view.dart
class SearchResultPage (line 7) | class SearchResultPage extends StatefulWidget {
method createState (line 11) | State<SearchResultPage> createState()
class _SearchResultPageState (line 14) | class _SearchResultPageState extends State<SearchResultPage>
method initState (line 20) | void initState()
method build (line 33) | Widget build(BuildContext context)
FILE: lib/pages/setting/controller.dart
class SettingController (line 15) | class SettingController extends GetxController {
method onInit (line 30) | void onInit()
FILE: lib/pages/setting/extra_setting.dart
class ExtraSetting (line 13) | class ExtraSetting extends StatefulWidget {
method createState (line 17) | State<ExtraSetting> createState()
class _ExtraSettingState (line 20) | class _ExtraSettingState extends State<ExtraSetting> {
method initState (line 31) | void initState()
method twoFADialog (line 52) | void twoFADialog()
method build (line 126) | Widget build(BuildContext context)
FILE: lib/pages/setting/pages/action_menu_set.dart
class ActionMenuSetPage (line 8) | class ActionMenuSetPage extends StatefulWidget {
method createState (line 12) | State<ActionMenuSetPage> createState()
class _ActionMenuSetPageState (line 15) | class _ActionMenuSetPageState extends State<ActionMenuSetPage> {
method initState (line 21) | void initState()
method saveEdit (line 35) | void saveEdit()
method onReorder (line 45) | void onReorder(int oldIndex, int newIndex)
method build (line 56) | Widget build(BuildContext context)
FILE: lib/pages/setting/pages/color_select.dart
class ColorSelectPage (line 7) | class ColorSelectPage extends StatefulWidget {
method createState (line 11) | State<ColorSelectPage> createState()
class Item (line 14) | class Item {
function generateItems (line 26) | List<Item> generateItems(int count)
class _ColorSelectPageState (line 35) | class _ColorSelectPageState extends State<ColorSelectPage> {
method build (line 39) | Widget build(BuildContext context)
class ColorSelectController (line 144) | class ColorSelectController extends GetxController {
method onInit (line 152) | void onInit()
FILE: lib/pages/setting/pages/display_mode.dart
class SetDiaplayMode (line 8) | class SetDiaplayMode extends StatefulWidget {
method createState (line 12) | State<SetDiaplayMode> createState()
class _SetDiaplayModeState (line 15) | class _SetDiaplayModeState extends State<SetDiaplayMode> {
method initState (line 27) | void initState()
method fetchAll (line 36) | Future<void> fetchAll()
method init (line 44) | Future<void> init()
method getDisplayModeType (line 56) | Future<DisplayMode> getDisplayModeType(modes)
method build (line 66) | Widget build(BuildContext context)
FILE: lib/pages/setting/pages/font_size_select.dart
class FontSizeSelectPage (line 6) | class FontSizeSelectPage extends StatefulWidget {
method createState (line 10) | State<FontSizeSelectPage> createState()
class _FontSizeSelectPageState (line 13) | class _FontSizeSelectPageState extends State<FontSizeSelectPage> {
method initState (line 21) | void initState()
method build (line 36) | Widget build(BuildContext context)
FILE: lib/pages/setting/pages/home_tabbar_set.dart
class TabbarSetPage (line 7) | class TabbarSetPage extends StatefulWidget {
method createState (line 11) | State<TabbarSetPage> createState()
class _TabbarSetPageState (line 14) | class _TabbarSetPageState extends State<TabbarSetPage> {
method initState (line 20) | void initState()
method saveEdit (line 38) | void saveEdit()
method onReorder (line 47) | void onReorder(int oldIndex, int newIndex)
method build (line 58) | Widget build(BuildContext context)
FILE: lib/pages/setting/pages/logs.dart
class LogsPage (line 8) | class LogsPage extends StatefulWidget {
method createState (line 12) | State<LogsPage> createState()
class _LogsPageState (line 15) | class _LogsPageState extends State<LogsPage> {
method initState (line 21) | void initState()
method getPath (line 26) | void getPath()
method parseLogs (line 33) | Future<List<Map<String, dynamic>>> parseLogs(String fileContent)
method copyLogs (line 70) | void copyLogs()
method feedback (line 79) | void feedback()
method clearLogsHandle (line 87) | void clearLogsHandle()
method build (line 100) | Widget build(BuildContext context)
FILE: lib/pages/setting/pages/navigation_bar_set.dart
class NavigationBarSetPage (line 9) | class NavigationBarSetPage extends StatefulWidget {
method createState (line 13) | State<NavigationBarSetPage> createState()
class _NavigationbarSetPageState (line 16) | class _NavigationbarSetPageState extends State<NavigationBarSetPage> {
method initState (line 22) | void initState()
method saveEdit (line 40) | void saveEdit()
method onReorder (line 49) | void onReorder(int oldIndex, int newIndex)
method build (line 60) | Widget build(BuildContext context)
FILE: lib/pages/setting/pages/play_gesture_set.dart
class PlayGesturePage (line 10) | class PlayGesturePage extends StatefulWidget {
method createState (line 14) | State<PlayGesturePage> createState()
class _PlayGesturePageState (line 17) | class _PlayGesturePageState extends State<PlayGesturePage> {
method initState (line 22) | void initState()
method build (line 29) | Widget build(BuildContext context)
FILE: lib/pages/setting/pages/play_speed_set.dart
class PlaySpeedPage (line 9) | class PlaySpeedPage extends StatefulWidget {
method createState (line 13) | State<PlaySpeedPage> createState()
class _PlaySpeedPageState (line 16) | class _PlaySpeedPageState extends State<PlaySpeedPage> {
method initState (line 55) | void initState()
method onAddSpeed (line 82) | void onAddSpeed()
method showBottomSheet (line 131) | void showBottomSheet(String type, int i)
method menuAction (line 167) | void menuAction(type, int index, id)
method build (line 205) | Widget build(BuildContext context)
FILE: lib/pages/setting/play_setting.dart
class PlaySetting (line 18) | class PlaySetting extends StatefulWidget {
method createState (line 22) | State<PlaySetting> createState()
class _PlaySettingState (line 25) | class _PlaySettingState extends State<PlaySetting> {
method initState (line 36) | void initState()
method dispose (line 55) | void dispose()
method build (line 63) | Widget build(BuildContext context)
FILE: lib/pages/setting/privacy_setting.dart
class PrivacySetting (line 8) | class PrivacySetting extends StatefulWidget {
method createState (line 12) | State<PrivacySetting> createState()
class _PrivacySettingState (line 15) | class _PrivacySettingState extends State<PrivacySetting> {
method initState (line 21) | void initState()
method build (line 28) | Widget build(BuildContext context)
FILE: lib/pages/setting/recommend_setting.dart
class RecommendSetting (line 12) | class RecommendSetting extends StatefulWidget {
method createState (line 16) | State<RecommendSetting> createState()
class _RecommendSettingState (line 19) | class _RecommendSettingState extends State<RecommendSetting> {
method initState (line 32) | void initState()
method build (line 49) | Widget build(BuildContext context)
FILE: lib/pages/setting/style_setting.dart
class StyleSetting (line 19) | class StyleSetting extends StatefulWidget {
method createState (line 23) | State<StyleSetting> createState()
class _StyleSettingState (line 26) | class _StyleSettingState extends State<StyleSetting> {
method initState (line 37) | void initState()
method build (line 45) | Widget build(BuildContext context)
FILE: lib/pages/setting/view.dart
class SettingPage (line 5) | class SettingPage extends StatelessWidget {
method build (line 9) | Widget build(BuildContext context)
FILE: lib/pages/setting/widgets/select_dialog.dart
class SelectDialog (line 3) | class SelectDialog<T> extends StatefulWidget {
method createState (line 14) | _SelectDialogState<T> createState()
class _SelectDialogState (line 17) | class _SelectDialogState<T> extends State<SelectDialog<T>> {
method initState (line 21) | void initState()
method build (line 27) | Widget build(BuildContext context)
FILE: lib/pages/setting/widgets/select_item.dart
class SetSelectItem (line 6) | class SetSelectItem extends StatefulWidget {
method createState (line 18) | State<SetSelectItem> createState()
class _SetSelectItemState (line 21) | class _SetSelectItemState extends State<SetSelectItem> {
method initState (line 29) | void initState()
method build (line 92) | Widget build(BuildContext context)
FILE: lib/pages/setting/widgets/slide_dialog.dart
class SlideDialog (line 4) | class SlideDialog<T extends num> extends StatefulWidget {
method createState (line 23) | _SlideDialogState<T> createState()
class _SlideDialogState (line 26) | class _SlideDialogState<T extends num> extends State<SlideDialog<T>> {
method initState (line 30) | void initState()
method build (line 36) | Widget build(BuildContext context)
FILE: lib/pages/setting/widgets/switch_item.dart
class SetSwitchItem (line 7) | class SetSwitchItem extends StatefulWidget {
method createState (line 26) | State<SetSwitchItem> createState()
class _SetSwitchItemState (line 29) | class _SetSwitchItemState extends State<SetSwitchItem> {
method initState (line 35) | void initState()
method switchChange (line 40) | void switchChange(value)
method build (line 56) | Widget build(BuildContext context)
FILE: lib/pages/subscription/controller.dart
class SubController (line 11) | class SubController extends GetxController {
method onInit (line 24) | void onInit()
method querySubFolder (line 32) | Future<dynamic> querySubFolder({type = 'init'})
method onLoad (line 57) | Future onLoad()
method cancelSub (line 62) | Future<void> cancelSub(SubFolderItemData subFolderItem)
FILE: lib/pages/subscription/view.dart
class SubPage (line 10) | class SubPage extends StatefulWidget {
method createState (line 14) | State<SubPage> createState()
class _SubPageState (line 17) | class _SubPageState extends State<SubPage> {
method initState (line 23) | void initState()
method build (line 40) | Widget build(BuildContext context)
FILE: lib/pages/subscription/widgets/item.dart
class SubItem (line 9) | class SubItem extends StatelessWidget {
method build (line 21) | Widget build(BuildContext context)
class VideoContent (line 77) | class VideoContent extends StatelessWidget {
method build (line 89) | Widget build(BuildContext context)
FILE: lib/pages/subscription_detail/controller.dart
class SubDetailController (line 7) | class SubDetailController extends GetxController {
method onInit (line 20) | void onInit()
method queryUserSeasonList (line 31) | Future<dynamic> queryUserSeasonList({type = 'init'})
FILE: lib/pages/subscription_detail/view.dart
class SubDetailPage (line 16) | class SubDetailPage extends StatefulWidget {
method createState (line 20) | State<SubDetailPage> createState()
class _SubDetailPageState (line 23) | class _SubDetailPageState extends State<SubDetailPage> {
method initState (line 32) | void initState()
method dispose (line 54) | void dispose()
method build (line 61) | Widget build(BuildContext context)
FILE: lib/pages/subscription_detail/widget/sub_video_card.dart
class SubVideoCardH (line 16) | class SubVideoCardH extends StatelessWidget {
method build (line 27) | Widget build(BuildContext context)
class VideoContent (line 117) | class VideoContent extends StatelessWidget {
method build (line 127) | Widget build(BuildContext context)
FILE: lib/pages/video/detail/controller.dart
class VideoDetailController (line 34) | class VideoDetailController extends GetxController
method onInit (line 124) | void onInit()
method playerInit (line 257) | Future playerInit({
method queryVideoUrl (line 305) | Future queryVideoUrl()
method getSubtitle (line 455) | Future getSubtitle()
method getDanmaku (line 466) | Future getDanmaku(List subtitles)
method showShootDanmakuSheet (line 489) | void showShootDanmakuSheet()
method updateCover (line 570) | void updateCover(String? pic)
method onControllerCreated (line 576) | void onControllerCreated(ScrollController controller)
method onTapTabbar (line 580) | void onTapTabbar(int index)
method toggeleWatchLaterVisible (line 587) | void toggeleWatchLaterVisible(bool val)
method fetchMediaList (line 594) | Future fetchMediaList()
method changeMediaList (line 629) | Future changeMediaList(bvidVal, cidVal, aidVal, coverVal)
method queryFavVideoList (line 656) | Future queryFavVideoList()
method onTabChanged (line 671) | void onTabChanged()
method onClose (line 676) | void onClose()
FILE: lib/pages/video/detail/introduction/controller.dart
class VideoIntroController (line 28) | class VideoIntroController extends GetxController {
method onInit (line 67) | void onInit()
method queryVideoIntro (line 86) | Future queryVideoIntro()
method queryUserStat (line 114) | Future queryUserStat()
method queryHasLikeVideo (line 122) | Future queryHasLikeVideo()
method queryHasCoinVideo (line 129) | Future queryHasCoinVideo()
method queryHasFavVideo (line 137) | Future queryHasFavVideo()
method actionOneThree (line 149) | Future actionOneThree()
method actionLikeVideo (line 171) | Future actionLikeVideo()
method actionCoinVideo (line 194) | Future actionCoinVideo()
method actionFavVideo (line 236) | Future actionFavVideo({type = 'choose'})
method actionShareVideo (line 287) | Future actionShareVideo()
method queryVideoInFolder (line 294) | Future queryVideoInFolder()
method queryFollowStatus (line 320) | Future queryFollowStatus()
method actionRelationMod (line 332) | Future actionRelationMod()
method changeSeasonOrbangu (line 414) | Future changeSeasonOrbangu(
method startTimer (line 453) | void startTimer()
method queryOnlineTotal (line 463) | Future queryOnlineTotal()
method onClose (line 475) | void onClose()
method nextPlay (line 483) | void nextPlay()
method setFollowGroup (line 534) | void setFollowGroup()
method aiConclusion (line 557) | Future aiConclusion()
method showEposideHandler (line 578) | void showEposideHandler()
FILE: lib/pages/video/detail/introduction/view.dart
class VideoIntroPanel (line 31) | class VideoIntroPanel extends StatefulWidget {
method createState (line 38) | State<VideoIntroPanel> createState()
class _VideoIntroPanelState (line 41) | class _VideoIntroPanelState extends State<VideoIntroPanel>
method initState (line 53) | void initState()
method dispose (line 67) | void dispose()
method build (line 73) | Widget build(BuildContext context)
class VideoInfo (line 120) | class VideoInfo extends StatefulWidget {
method createState (line 133) | State<VideoInfo> createState()
class _VideoInfoState (line 136) | class _VideoInfoState extends State<VideoInfo> with TickerProviderStateM...
method handleState (line 151) | void Function()? handleState(Future<dynamic> Function() action)
method initState (line 162) | void initState()
method _showFavPanel (line 201) | void _showFavPanel()
method dispose (line 252) | void dispose()
method build (line 258) | Widget build(BuildContext context)
method actionGrid (line 543) | Widget actionGrid(BuildContext context, videoIntroController)
FILE: lib/pages/video/detail/introduction/widgets/action_item.dart
class ActionItem (line 6) | class A
Condensed preview — 585 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,726K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/bug-反馈.md",
"chars": 250,
"preview": "---\nname: Bug 反馈\nabout: 描述你所遇到的bug\ntitle: ''\nlabels: 问题反馈\nassignees: guozhigq\n\n---\n\n### 问题描述\n请提供一个清晰而简明的问题描述。\n\n### 复现步骤\n"
},
{
"path": ".github/ISSUE_TEMPLATE/功能请求.md",
"chars": 198,
"preview": "---\nname: 功能请求\nabout: 对于功能的一些建议\ntitle: ''\nlabels: 功能\nassignees: guozhigq\n\n---\n\n### 功能描述\n请提供对所请求功能的清晰描述。\n\n### 目标\n请描述你希望通过"
},
{
"path": ".github/workflows/beta_ci.yml",
"chars": 5939,
"preview": "name: Pilipala Beta\n\non:\n workflow_dispatch:\n push:\n branches:\n - \"x-main\"\n paths-ignore:\n - \"**.md\"\n "
},
{
"path": ".github/workflows/release_ci.yml",
"chars": 4220,
"preview": "name: Pilipala Release\n\n# action事件触发\non:\n push:\n # push tag时触发\n tags:\n - \"v*.*.*\"\n\n# 可以有多个jobs\njobs:\n andro"
},
{
"path": ".gitignore",
"chars": 2806,
"preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\nmigrate_working_dir/\n\n# IntelliJ re"
},
{
"path": ".metadata",
"chars": 1668,
"preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
},
{
"path": ".vscode/launch.json",
"chars": 621,
"preview": "{\n // 使用 IntelliSense 了解相关属性。 \n // 悬停以查看现有属性的描述。\n // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=83038"
},
{
"path": ".vscode/settings.json",
"chars": 94,
"preview": "{\n \"editor.formatOnSave\": true,\n \"[dart]\": {\n \"editor.formatOnType\": true\n }\n}"
},
{
"path": "LICENSE",
"chars": 35149,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 3360,
"preview": "<div align=\"center\">\n <img width=\"200\" height=\"200\" src=\"https://github.com/guozhigq/pilipala/blob/main/assets/images"
},
{
"path": "analysis_options.yaml",
"chars": 1453,
"preview": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n#"
},
{
"path": "android/.gitignore",
"chars": 285,
"preview": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remembe"
},
{
"path": "android/app/build.gradle",
"chars": 3493,
"preview": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertie"
},
{
"path": "android/app/src/debug/AndroidManifest.xml",
"chars": 414,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"com.guozhigq.pilipala\">\n <!-- The I"
},
{
"path": "android/app/src/main/AndroidManifest.xml",
"chars": 16088,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"com.guozhigq.pilipala\">\n <queries>\n"
},
{
"path": "android/app/src/main/kotlin/com/guozhigq/pilipala/MainActivity.kt",
"chars": 195,
"preview": "package com.guozhigq.pilipala\n\n// import io.flutter.embedding.android.FlutterActivity\nimport com.ryanheise.audioservice."
},
{
"path": "android/app/src/main/res/drawable/ic_baseline_forward_10_24.xml",
"chars": 909,
"preview": "<vector android:height=\"24dp\" android:tint=\"#FFFFFF\"\n android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n andr"
},
{
"path": "android/app/src/main/res/drawable/ic_baseline_replay_10_24.xml",
"chars": 1380,
"preview": "<vector android:height=\"24dp\" android:tint=\"#FFFFFF\"\n android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n andr"
},
{
"path": "android/app/src/main/res/drawable/launch_background.xml",
"chars": 434,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "android/app/src/main/res/drawable-v21/launch_background.xml",
"chars": 438,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
"chars": 332,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <bac"
},
{
"path": "android/app/src/main/res/raw/keep.xml",
"chars": 126,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\"\n tools:keep=\"@drawable"
},
{
"path": "android/app/src/main/res/values/colors.xml",
"chars": 120,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"ic_launcher_background\">#ffffff</color>\n</resources>"
},
{
"path": "android/app/src/main/res/values/styles.xml",
"chars": 1146,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n <!-- Theme applied"
},
{
"path": "android/app/src/main/res/values-night/styles.xml",
"chars": 995,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <!-- Theme applied to the Android Window while the process is sta"
},
{
"path": "android/app/src/profile/AndroidManifest.xml",
"chars": 414,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"com.guozhigq.pilipala\">\n <!-- The I"
},
{
"path": "android/build.gradle",
"chars": 598,
"preview": "buildscript {\n ext.kotlin_version = '1.9.0'\n repositories {\n google()\n mavenCentral()\n }\n\n dep"
},
{
"path": "android/gradle/wrapper/gradle-wrapper.properties",
"chars": 200,
"preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dist"
},
{
"path": "android/gradle.properties",
"chars": 82,
"preview": "org.gradle.jvmargs=-Xmx1536M\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
},
{
"path": "android/settings.gradle",
"chars": 462,
"preview": "include ':app'\n\ndef localPropertiesFile = new File(rootProject.projectDir, \"local.properties\")\ndef properties = new Prop"
},
{
"path": "assets/loading.json",
"chars": 6182,
"preview": "{\"v\":\"5.7.11\",\"fr\":60,\"ip\":0,\"op\":81,\"w\":1920,\"h\":1080,\"nm\":\"Loading Dots\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":"
},
{
"path": "assets/trail_loading.json",
"chars": 5594,
"preview": "{\"v\":\"4.6.8\",\"fr\":60,\"ip\":0,\"op\":106,\"w\":500,\"h\":500,\"nm\":\"Comp 1\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":2,\"ty\":4"
},
{
"path": "change_log/1.0.0.0817.md",
"chars": 117,
"preview": "## 1.0.0\n\n### 初始版本\n+ 直播、推荐、动态功能\n+ 投稿、番剧播放功能\n+ 播放器手势支持\n+ 画质、音质、解码格式支持\n+ 点赞、投币、收藏功能\n+ 关注/取关、用户主页功能\n+ 评论功能\n+ 历史记录、稍后再看功能"
},
{
"path": "change_log/1.0.1.0817.md",
"chars": 59,
"preview": "## 1.0.1\n\n### 修复\n+ 升级播放器依赖\n+ android平台 AV1格式视频支持\n+ 视频全屏功能\n\n"
},
{
"path": "change_log/1.0.10.1016.md",
"chars": 34,
"preview": "## 1.0.10\n\n### 修复\n+ 长按倍速抬起后未恢复默认倍速"
},
{
"path": "change_log/1.0.11.1112.md",
"chars": 276,
"preview": "## 1.0.11\n\n### 新功能\n+ 适配了原生媒体通知栏 @Daydreamer-riri\n+ 视频主题图标 @Daydreamer-riri\n+ 关闭软件后自动画中画播放\n+ UP主分组管理\n+ md2样式底栏\n+ \n\n \n### "
},
{
"path": "change_log/1.0.12.1114.md",
"chars": 100,
"preview": "## 1.0.12\n\n \n### 修复\n+ iOS端视频播放时没有声音\n+ 超过6分钟弹幕不显示\n+ 视频详情页网络异常\n\n\n更多更新日志可在Github上查看\n问题反馈、功能建议请查看「关于」页面。"
},
{
"path": "change_log/1.0.13.1217.md",
"chars": 245,
"preview": "## 1.0.13\r\n\r\n\r\n### 新功能\r\n+ 视频详情页稍后再看\r\n+ 发送弹幕 感谢@orz12\r\n+ 消息展示\r\n+ up主页显示获赞数\r\n+ up主页显示合集\r\n+ 视频详情页「ai总结」增加开关\r\n \r\n### 修复\r\n+ "
},
{
"path": "change_log/1.0.14.1225.md",
"chars": 301,
"preview": "## 1.0.14\n\n圣诞节快乐~ 🎉\n\n大部分内容由@orz12提供,感谢👏\n\n### 修复\n+ 全屏弹幕消失\n+ iOS全屏/退出全屏视频暂停\n+ 个人主页关注状态\n+ 视频合集向下滑动UI问题\n+ 媒体库滑动底栏不隐藏\n+ 个人主页动"
},
{
"path": "change_log/1.0.15.0101.md",
"chars": 216,
"preview": "## 1.0.15\n\n元旦快乐~ 🎉\n\n### 功能\n+ 转发动态评论展示\n+ 推荐、最热、收藏视频增肌日期显示\n\n### 修复\n+ 全屏播放相关问题\n+ 评论区@用户展示问题\n+ 登录状态闪退问题\n+ pip意外触发问题\n+ 动态页tab"
},
{
"path": "change_log/1.0.16.0102.md",
"chars": 147,
"preview": "## 1.0.16\n\n\n### 功能\n+ toast 背景支持透明度调节\n\n### 修复\n+ web端推荐未展示【已关注】\n+ up主动态页异常\n+ 未打开自动播放时,视频详情页异常\n+ 视频暂停状态取消自动ip\n\n\n更多更新日志可在Git"
},
{
"path": "change_log/1.0.17.0125.md",
"chars": 399,
"preview": "## 1.0.17\n\n\n### 功能\n+ 视频全屏时隐藏进度条\n+ 动态内容增加投稿跳转\n+ 未开启自动播放时点击封面播放\n+ 弹幕发送标识\n+ 定时关闭\n+ 推荐视频卡片拉黑up功能\n+ 首页tabbar编辑排序\n\n### 修复\n+ 连续"
},
{
"path": "change_log/1.0.18.0130.md",
"chars": 81,
"preview": "## 1.0.18\n\n\n### 功能\n\n\n### 修复\n\n\n### 优化\n\n \n\n\n更多更新日志可在Github上查看\n问题反馈、功能建议请查看「关于」页面。\n"
},
{
"path": "change_log/1.0.19.0131.md",
"chars": 107,
"preview": "## 1.0.19\n\n\n### 修复\n+ 视频404、评论加载错误\n+ bvav转换\n\n### 优化\n+ 视频详情页内存占用\n\n \n\n\n更多更新日志可在Github上查看\n问题反馈、功能建议请查看「关于」页面。\n"
},
{
"path": "change_log/1.0.2.0819.md",
"chars": 163,
"preview": "## 1.0.2\n\n### 新功能\n+ 自动检查更新\n+ 封面图片保存\n+ 动态跳转番剧\n+ 历史记录番剧记忆播放\n+ 一键清空稍后再看\n \n### 修复\n+ 切换分P cid未切换\n+ cookie存储问题\n+ 登录/退出登录问题\n "
},
{
"path": "change_log/1.0.20.0303.md",
"chars": 246,
"preview": "## 1.0.20\n\n\n### 功能\n+ 评论区增加表情\n+ 首页渐变背景开关\n+ 媒体库显示「我的订阅」\n+ 评论区链接解析\n+ 默认启动页设置\n\n### 修复\n+ 评论区内容重复\n+ pip相关问题\n+ 播放多p视频评论不刷新\n+ 视频"
},
{
"path": "change_log/1.0.21.0306.md",
"chars": 97,
"preview": "## 1.0.21\n\n### 修复\n+ 推荐视频全屏问题\n+ 番剧全屏播放时灰屏问题\n+ 评论回调导致页面卡死问题\n\n更多更新日志可在Github上查看\n问题反馈、功能建议请查看「关于」页面。\n"
},
{
"path": "change_log/1.0.22.0430.md",
"chars": 250,
"preview": "## 1.0.22\n\n### 功能\n+ 字幕\n+ 全屏时选集\n+ 动态转发\n+ 评论视频并转发\n+ 收藏夹删除\n+ 合集显示封面\n+ 底部导航栏编辑、排序功能\n+ 历史记录进度条展示\n+ 直播画质切换\n+ 排行榜功能\n+ 视频详情页推荐视频"
},
{
"path": "change_log/1.0.23.0504.md",
"chars": 107,
"preview": "## 1.0.23\n\n### 功能\n+ 封面下载\n\n \n### 修复\n+ 全屏问题\n+ 视频播放器灰屏问题\n+ 评论区点击区域问题\n\n\n更多更新日志可在Github上查看\n问题反馈、功能建议请查看「关于」页面。\n"
},
{
"path": "change_log/1.0.23.0505.md",
"chars": 120,
"preview": "## 1.0.23\n\n### 功能\n+ 封面下载\n\n \n### 修复\n+ 全屏问题\n+ 视频播放器灰屏问题\n+ 评论区点击区域问题\n+ 动态详情跳转异常问题\n\n\n更多更新日志可在Github上查看\n问题反馈、功能建议请查看「关于」页面。\n"
},
{
"path": "change_log/1.0.24.0626.md",
"chars": 183,
"preview": "## 1.0.24\n\n### 功能\n+ 私信功能\n+ 回复我的、收到的赞查看\n+ 新的登录方式\n+ 全屏选集\n+ 一键三连\n+ 按分区搜索\n\n### 优化\n+ 页面跳转动画\n+ 评论区跳转\n \n### 修复\n+ 音画不同步问题\n+ 分集字"
},
{
"path": "change_log/1.0.25.1010.md",
"chars": 399,
"preview": "## 1.0.25\n\n### 功能\n+ 直播弹幕\n+ 稍后再看、收藏夹播放全部\n+ 收藏夹新建、编辑\n+ 评论删除\n+ 评论保存为图片\n+ 动态页滑动切换up\n+ up投稿筛选充电视频\n+ 直播tab展示关注up\n+ up主页专栏展示\n\n#"
},
{
"path": "change_log/1.0.3.0821.md",
"chars": 175,
"preview": "## 1.0.3\n\n建议卸载1.0.2版本,重新安装\n### 新功能\n+ 底部播放进度条设置\n+ 复制图片链接\n\n \n### 修复\n+ 用户数据格式修改\n+ video Fit\n+ 没有audio 资源的视频异常\n+ 评论区域图片无法点击"
},
{
"path": "change_log/1.0.4.0822.md",
"chars": 198,
"preview": "## 1.0.4\n\n### 新功能\n+ 热搜刷新\n+ 视频搜索排序、筛选\n+ app字体大小自定义\n+ app主题色自定义\n+ 「课堂」类动态渲染\n\n \n### 修复\n+ 搜索词联想richText渲染异常\n+ 部分动态点赞异常\n+ 默认"
},
{
"path": "change_log/1.0.5.0826.md",
"chars": 308,
"preview": "## 1.0.5\n\n主要是bug修复跟一部分小功能,弹幕功能需要下一版。\n问题反馈请前往QQ频道或提交issues。\n感谢🙏酷友「无力感*」「斤斤计较呀」「Pseudopamine」\n\n### 新功能\n+ 高帧率支持\n+ 默认评论排序设置\n"
},
{
"path": "change_log/1.0.6.0902.md",
"chars": 374,
"preview": "## 1.0.6\n\n问题反馈、功能建议请查看「关于」页面。\n\n### 新功能\n+ 首页单列布局\n+ 首页推荐展示播放量、弹幕数\n+ 简单弹幕功能实现(持续开发中...)\n+ 评论区搜索关键词开关 issues#46\n+ 热搜榜隐藏功能 is"
},
{
"path": "change_log/1.0.7.0908.md",
"chars": 232,
"preview": "## 1.0.7\n\n默认倍速、直播弹幕、专栏等功能开发中\n\n### 新功能\n+ 弹幕设置、屏蔽功能\n+ 不是很完美的后台播放功能\n+ 不是很完美的画中画(pip)功能(Android端)\n \n### 修复\n+ 动态页面加载异常\n+ 网络异常"
},
{
"path": "change_log/1.0.8.0917.md",
"chars": 228,
"preview": "## 1.0.8\n\n直播弹幕、循环播放等功能开发中\n\n### 新功能\n+ 用户拉黑功能\n+ gif图片保存\n+ 删除已看历史记录\n \n### 修复\n+ 弹幕数量较少\n+ 弹幕屏蔽设置自动记忆\n+ 动态页面渲染\n+ 用户主页数据错乱\n+ 大家"
},
{
"path": "change_log/1.0.9.1015.md",
"chars": 230,
"preview": "## 1.0.9\n\n\n### 新功能\n+ 自定义倍速、默认倍速\n+ 历史记录搜索\n+ 收藏夹搜索\n+ 历史记录多选删除\n+ 视频循环播放\n+ 免登录看1080P\n+ 评论区视频链接跳转\n+ up主分组\n+ up主投稿搜索\n \n### 修复\n"
},
{
"path": "fastlane/metadata/android/en-US/full_description.txt",
"chars": 214,
"preview": "PiliPala is a third-party Bilibili client developed in Flutter.\n\nTop Features:\n\n* List of recommended videos\n* List of h"
},
{
"path": "fastlane/metadata/android/en-US/short_description.txt",
"chars": 51,
"preview": "A third-party Bilibili client developed in Flutter\n"
},
{
"path": "fastlane/metadata/android/en-US/title.txt",
"chars": 9,
"preview": "PiliPala\n"
},
{
"path": "fastlane/metadata/android/zh-CN/changelogs/2001.txt",
"chars": 217,
"preview": "修复\n\n* 全屏弹幕消失\n* iOS 全屏/退出全屏视频暂停\n* 个人主页关注状态\n* 视频合集向下滑动UI问题\n* 媒体库滑动底栏不隐藏\n* 个人主页动态加载问题 * 2\n* 未登录状态访问个人主页异常\n* 视频搜索标题特殊字符转义\n* "
},
{
"path": "fastlane/metadata/android/zh-CN/full_description.txt",
"chars": 103,
"preview": "PiliPala 是使用 Flutter 开发的 BiliBili 第三方客户端。\n\n主要功能:\n\n* 推荐视频列表 (app 端)\n* 最热视频列表\n* 热门直播\n* 番剧列表\n* 屏蔽黑名单内用户视频\n"
},
{
"path": "fastlane/metadata/android/zh-CN/short_description.txt",
"chars": 31,
"preview": "使用 Flutter 开发的 BiliBili 第三方客户端\n"
},
{
"path": "fastlane/metadata/android/zh-CN/title.txt",
"chars": 9,
"preview": "PiliPala\n"
},
{
"path": "ios/.gitignore",
"chars": 569,
"preview": "**/dgph\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/De"
},
{
"path": "ios/Flutter/AppFrameworkInfo.plist",
"chars": 774,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Flutter/Debug.xcconfig",
"chars": 107,
"preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
},
{
"path": "ios/Flutter/Release.xcconfig",
"chars": 109,
"preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
},
{
"path": "ios/Podfile",
"chars": 1662,
"preview": "# Uncomment this line to define a global platform for your project\nplatform :ios, '13.0'\n\n# CocoaPods analytics sends ne"
},
{
"path": "ios/Runner/AppDelegate.swift",
"chars": 642,
"preview": "import UIKit\nimport Flutter\nimport AVFoundation\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n over"
},
{
"path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 2519,
"preview": "{\n \"images\" : [\n {\n \"size\" : \"20x20\",\n \"idiom\" : \"iphone\",\n \"filename\" : \"Icon-App-20x20@2x.png\",\n "
},
{
"path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
"chars": 391,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"LaunchImage.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
"chars": 336,
"preview": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in"
},
{
"path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
"chars": 2377,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "ios/Runner/Base.lproj/Main.storyboard",
"chars": 1811,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "ios/Runner/Info.plist",
"chars": 3437,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner/Runner-Bridging-Header.h",
"chars": 38,
"preview": "#import \"GeneratedPluginRegistrant.h\"\n"
},
{
"path": "ios/Runner.xcodeproj/project.pbxproj",
"chars": 23145,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 226,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
"chars": 3185,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1510\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
"chars": 224,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:Runner.xcodepr"
},
{
"path": "ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 226,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "lib/common/constants.dart",
"chars": 717,
"preview": "import 'package:flutter/material.dart';\n\nclass StyleString {\n static const double cardSpace = 8;\n static const double "
},
{
"path": "lib/common/pages_bottom_sheet.dart",
"chars": 5521,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package"
},
{
"path": "lib/common/skeleton/dynamic_card.dart",
"chars": 4228,
"preview": "import 'package:flutter/material.dart';\nimport 'skeleton.dart';\n\nclass DynamicCardSkeleton extends StatelessWidget {\n c"
},
{
"path": "lib/common/skeleton/media_bangumi.dart",
"chars": 2704,
"preview": "import 'package:flutter/material.dart';\nimport 'package:pilipala/common/constants.dart';\n\nimport 'skeleton.dart';\n\nclass"
},
{
"path": "lib/common/skeleton/skeleton.dart",
"chars": 4550,
"preview": "import 'package:flutter/material.dart';\n\nclass Skeleton extends StatelessWidget {\n final Widget child;\n\n const Skeleto"
},
{
"path": "lib/common/skeleton/video_card_h.dart",
"chars": 3633,
"preview": "import 'package:pilipala/common/constants.dart';\nimport 'package:flutter/material.dart';\nimport 'skeleton.dart';\n\nclass "
},
{
"path": "lib/common/skeleton/video_card_v.dart",
"chars": 1787,
"preview": "import 'package:pilipala/common/constants.dart';\nimport 'package:flutter/material.dart';\nimport 'skeleton.dart';\n\nclass "
},
{
"path": "lib/common/skeleton/video_reply.dart",
"chars": 2604,
"preview": "import 'package:flutter/material.dart';\nimport 'skeleton.dart';\n\nclass VideoReplySkeleton extends StatelessWidget {\n co"
},
{
"path": "lib/common/widgets/animated_dialog.dart",
"chars": 1606,
"preview": "import 'package:flutter/material.dart';\n\nclass AnimatedDialog extends StatefulWidget {\n const AnimatedDialog({Key? key,"
},
{
"path": "lib/common/widgets/app_expansion_panel_list.dart",
"chars": 11815,
"preview": "import 'package:flutter/material.dart';\n\nconst double _kPanelHeaderCollapsedHeight = kMinInteractiveDimension;\n\nclass _S"
},
{
"path": "lib/common/widgets/appbar.dart",
"chars": 793,
"preview": "import 'package:flutter/material.dart';\n\nclass AppBarWidget extends StatelessWidget implements PreferredSizeWidget {\n c"
},
{
"path": "lib/common/widgets/badge.dart",
"chars": 2045,
"preview": "import 'package:flutter/material.dart';\n\nclass PBadge extends StatelessWidget {\n final String? text;\n final double? to"
},
{
"path": "lib/common/widgets/content_container.dart",
"chars": 1360,
"preview": "import 'package:flutter/material.dart';\n\nclass ContentContainer extends StatelessWidget {\n final Widget? contentWidget;"
},
{
"path": "lib/common/widgets/custom_toast.dart",
"chars": 1023,
"preview": "import 'package:flutter/material.dart';\nimport 'package:hive/hive.dart';\nimport 'package:pilipala/utils/storage.dart';\n\n"
},
{
"path": "lib/common/widgets/html_render.dart",
"chars": 5379,
"preview": "import 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/material.dart';\nimport 'package"
},
{
"path": "lib/common/widgets/http_error.dart",
"chars": 1634,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_svg/flutter_svg.dart';\n\nclass HttpError extends Stateles"
},
{
"path": "lib/common/widgets/live_card.dart",
"chars": 4723,
"preview": "import 'package:flutter/material.dart';\nimport '../../utils/utils.dart';\nimport '../constants.dart';\nimport 'network_img"
},
{
"path": "lib/common/widgets/network_img_layer.dart",
"chars": 4012,
"preview": "import 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/material.dart';\nimport 'package"
},
{
"path": "lib/common/widgets/no_data.dart",
"chars": 798,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_svg/flutter_svg.dart';\n\nclass NoData extends StatelessWi"
},
{
"path": "lib/common/widgets/sliver_header.dart",
"chars": 547,
"preview": "import 'package:flutter/material.dart';\n\nclass SliverHeaderDelegate extends SliverPersistentHeaderDelegate {\n SliverHea"
},
{
"path": "lib/common/widgets/stat/danmu.dart",
"chars": 1406,
"preview": "import 'package:flutter/material.dart';\nimport 'package:pilipala/utils/utils.dart';\n\nclass StatDanMu extends StatelessWi"
},
{
"path": "lib/common/widgets/stat/view.dart",
"chars": 1418,
"preview": "import 'package:flutter/material.dart';\nimport 'package:pilipala/utils/utils.dart';\n\nclass StatView extends StatelessWid"
},
{
"path": "lib/common/widgets/video_card_h.dart",
"chars": 14778,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package"
},
{
"path": "lib/common/widgets/video_card_v.dart",
"chars": 12886,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package"
},
{
"path": "lib/http/api.dart",
"chars": 18103,
"preview": "import 'constants.dart';\n\nclass Api {\n // 推荐视频\n static const String recommendListApp =\n '${HttpString.appBaseUrl}"
},
{
"path": "lib/http/bangumi.dart",
"chars": 877,
"preview": "import '../models/bangumi/list.dart';\nimport 'index.dart';\n\nclass BangumiHttp {\n static Future bangumiList({int? page})"
},
{
"path": "lib/http/black.dart",
"chars": 1136,
"preview": "import '../models/user/black.dart';\nimport 'index.dart';\n\nclass BlackHttp {\n static Future blackList({required int pn, "
},
{
"path": "lib/http/common.dart",
"chars": 455,
"preview": "import 'index.dart';\n\nclass CommonHttp {\n static Future unReadDynamic() async {\n var res = await Request().get(Api.g"
},
{
"path": "lib/http/constants.dart",
"chars": 873,
"preview": "class HttpString {\n static const String baseUrl = 'https://www.bilibili.com';\n static const String apiBaseUrl = 'https"
},
{
"path": "lib/http/danmaku.dart",
"chars": 2547,
"preview": "import 'package:dio/dio.dart';\nimport '../models/danmaku/dm.pb.dart';\nimport 'index.dart';\n\nclass DanmakaHttp {\n // 获取视"
},
{
"path": "lib/http/dynamics.dart",
"chars": 5043,
"preview": "import 'dart:math';\nimport 'package:dio/dio.dart';\nimport '../models/dynamics/result.dart';\nimport '../models/dynamics/u"
},
{
"path": "lib/http/fan.dart",
"chars": 564,
"preview": "import '../models/fans/result.dart';\nimport 'index.dart';\n\nclass FanHttp {\n static Future fans({int? vmid, int? pn, int"
},
{
"path": "lib/http/fav.dart",
"chars": 1359,
"preview": "import 'index.dart';\n\nclass FavHttp {\n /// 编辑收藏夹\n static Future editFolder({\n required String title,\n required S"
},
{
"path": "lib/http/follow.dart",
"chars": 614,
"preview": "import '../models/follow/result.dart';\nimport 'index.dart';\n\nclass FollowHttp {\n static Future followings(\n {int? "
},
{
"path": "lib/http/html.dart",
"chars": 3424,
"preview": "import 'package:html/dom.dart';\nimport 'package:html/parser.dart';\nimport 'index.dart';\n\nclass HtmlHttp {\n // article\n "
},
{
"path": "lib/http/index.dart",
"chars": 39,
"preview": "export 'api.dart';\nexport 'init.dart';\n"
},
{
"path": "lib/http/init.dart",
"chars": 10183,
"preview": "// ignore_for_file: avoid_print\nimport 'dart:async';\nimport 'dart:convert';\nimport 'dart:developer';\nimport 'dart:io';\ni"
},
{
"path": "lib/http/interceptor.dart",
"chars": 3481,
"preview": "// ignore_for_file: avoid_print\n\nimport 'package:connectivity_plus/connectivity_plus.dart';\nimport 'package:dio/dio.dart"
},
{
"path": "lib/http/live.dart",
"chars": 3893,
"preview": "import 'package:pilipala/models/live/follow.dart';\n\nimport '../models/live/item.dart';\nimport '../models/live/room_info."
},
{
"path": "lib/http/login.dart",
"chars": 7054,
"preview": "import 'dart:convert';\nimport 'dart:math';\nimport 'package:crypto/crypto.dart';\nimport 'package:dio/dio.dart';\nimport 'p"
},
{
"path": "lib/http/member.dart",
"chars": 15559,
"preview": "import 'dart:convert';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:hive/hive.dart';"
},
{
"path": "lib/http/msg.dart",
"chars": 8611,
"preview": "import 'dart:convert';\nimport 'dart:math';\nimport 'package:pilipala/models/msg/like.dart';\nimport 'package:pilipala/mode"
},
{
"path": "lib/http/read.dart",
"chars": 3532,
"preview": "import 'dart:convert';\nimport 'package:html/parser.dart';\nimport 'package:pilipala/models/read/opus.dart';\nimport 'packa"
},
{
"path": "lib/http/reply.dart",
"chars": 3088,
"preview": "import '../models/video/reply/data.dart';\nimport '../models/video/reply/emote.dart';\nimport 'api.dart';\nimport 'init.dar"
},
{
"path": "lib/http/search.dart",
"chars": 6023,
"preview": "import 'dart:convert';\nimport 'package:hive/hive.dart';\nimport 'package:pilipala/models/search/all.dart';\nimport 'packag"
},
{
"path": "lib/http/user.dart",
"chars": 14012,
"preview": "import 'dart:convert';\nimport 'dart:developer';\n\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport"
},
{
"path": "lib/http/video.dart",
"chars": 15819,
"preview": "import 'dart:developer';\nimport 'package:hive/hive.dart';\nimport '../common/constants.dart';\nimport '../models/common/re"
},
{
"path": "lib/main.dart",
"chars": 8515,
"preview": "import 'dart:io';\n\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:flutter/services.dart';\nimpo"
},
{
"path": "lib/models/bangumi/info.dart",
"chars": 4695,
"preview": "class BangumiInfoModel {\n BangumiInfoModel({\n this.activity,\n this.actors,\n this.alias,\n this.areas,\n th"
},
{
"path": "lib/models/bangumi/list.dart",
"chars": 1966,
"preview": "class BangumiListDataModel {\n BangumiListDataModel({\n this.hasNext,\n this.list,\n this.num,\n this.size,\n "
},
{
"path": "lib/models/common/action_type.dart",
"chars": 1856,
"preview": "// 操作类型的枚举值:点赞 不喜欢 收藏 投币 稍后再看 下载封面 后台播放 听视频 分享 下载视频\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart"
},
{
"path": "lib/models/common/business_type.dart",
"chars": 449,
"preview": "enum BusinessType {\n // 普通视频\n archive,\n // 剧集(番剧 / 影视)\n pgc,\n // 直播\n live,\n // 文章\n articleList,\n // 文章\n articl"
},
{
"path": "lib/models/common/color_type.dart",
"chars": 945,
"preview": "import 'package:flutter/material.dart';\n\nfinal List<Map<String, dynamic>> colorThemeTypes = [\n {'color': const Color.fr"
},
{
"path": "lib/models/common/dynamic_badge_mode.dart",
"chars": 251,
"preview": "enum DynamicBadgeMode { hidden, point, number }\n\nextension DynamicBadgeModeDesc on DynamicBadgeMode {\n String get descr"
},
{
"path": "lib/models/common/dynamics_type.dart",
"chars": 231,
"preview": "enum DynamicsType {\n all,\n video,\n pgc,\n article,\n}\n\nextension BusinessTypeExtension on DynamicsType {\n String get "
},
{
"path": "lib/models/common/gesture_mode.dart",
"chars": 293,
"preview": "enum FullScreenGestureMode {\n /// 从上滑到下\n fromToptoBottom,\n\n /// 从下滑到上\n fromBottomtoTop,\n}\n\nextension FullScreenGestu"
},
{
"path": "lib/models/common/index.dart",
"chars": 85,
"preview": "library commonn_model;\n\nexport './business_type.dart';\nexport './gesture_mode.dart';\n"
},
{
"path": "lib/models/common/nav_bar_config.dart",
"chars": 1229,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../pages/dynamics/index.dart';\nimport '../../pages/home/index.dart';"
},
{
"path": "lib/models/common/rank_type.dart",
"chars": 3493,
"preview": "import 'package:flutter/material.dart';\nimport 'package:pilipala/pages/rank/zone/index.dart';\n\nenum RandType {\n all,\n "
},
{
"path": "lib/models/common/rcmd_type.dart",
"chars": 206,
"preview": "// 首页推荐类型\nenum RcmdType { web, app, notLogin }\n\nextension RcmdTypeExtension on RcmdType {\n String get values => ['web',"
},
{
"path": "lib/models/common/reply_sort_type.dart",
"chars": 181,
"preview": "enum ReplySortType { time, like }\n\nextension ReplySortTypeExtension on ReplySortType {\n String get titles => ['最新评论', '"
},
{
"path": "lib/models/common/reply_type.dart",
"chars": 492,
"preview": "enum ReplyType {\n unset,\n // 视频\n video,\n // 话题\n topic,\n //\n unset2,\n // 活动\n activity,\n // 小视频\n videoS,\n // 小"
},
{
"path": "lib/models/common/search_type.dart",
"chars": 1138,
"preview": "// ignore_for_file: constant_identifier_names\nenum SearchType {\n // 视频:video\n video,\n // 番剧:media_bangumi,\n media_ba"
},
{
"path": "lib/models/common/tab_type.dart",
"chars": 1309,
"preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:pilipala/pages/bangumi/index.dart"
},
{
"path": "lib/models/common/theme_type.dart",
"chars": 223,
"preview": "enum ThemeType {\n light,\n dark,\n system,\n}\n\nextension ThemeTypeDesc on ThemeType {\n String get description => ['浅色',"
},
{
"path": "lib/models/common/video_episode_type.dart",
"chars": 73,
"preview": "enum VideoEpidoesType {\n videoEpisode,\n videoPart,\n bangumiEpisode,\n}\n"
},
{
"path": "lib/models/danmaku/dm.pb.dart",
"chars": 326936,
"preview": "///\n// Generated code. Do not modify.\n// source: dm.proto\n//\n// @dart = 2.12\n// ignore_for_file: annotate_overrides,ca"
},
{
"path": "lib/models/danmaku/dm.pbenum.dart",
"chars": 11745,
"preview": "///\n// Generated code. Do not modify.\n// source: dm.proto\n//\n// @dart = 2.12\n// ignore_for_file: annotate_overrides,ca"
},
{
"path": "lib/models/danmaku/dm.pbjson.dart",
"chars": 96649,
"preview": "///\n// Generated code. Do not modify.\n// source: dm.proto\n//\n// @dart = 2.12\n// ignore_for_file: annotate_overrides,ca"
},
{
"path": "lib/models/danmaku/dm.pbserver.dart",
"chars": 2793,
"preview": "///\n// Generated code. Do not modify.\n// source: dm.proto\n//\n// @dart = 2.12\n// ignore_for_file: annotate_overrides,ca"
},
{
"path": "lib/models/danmaku/dm.proto",
"chars": 20318,
"preview": "syntax = \"proto3\";\n\npackage bilibili.community.service.dm.v1;\n\n// 说明文档\n// https://github.com/SocialSisterYi/bilibili-API"
},
{
"path": "lib/models/dynamics/result.dart",
"chars": 17684,
"preview": "import 'dart:convert';\n\nclass DynamicsDataModel {\n DynamicsDataModel({\n this.hasMore,\n this.items,\n this.offse"
},
{
"path": "lib/models/dynamics/up.dart",
"chars": 2447,
"preview": "class FollowUpModel {\n FollowUpModel({\n this.liveUsers,\n this.upList,\n this.liveList,\n this.myInfo,\n });\n\n"
},
{
"path": "lib/models/fans/result.dart",
"chars": 1014,
"preview": "class FansDataModel {\n FansDataModel({\n this.total,\n this.list,\n });\n\n int? total;\n List<FansItemModel>? list;"
},
{
"path": "lib/models/follow/result.dart",
"chars": 1046,
"preview": "class FollowDataModel {\n FollowDataModel({\n this.total,\n this.list,\n });\n\n int? total;\n List<FollowItemModel>?"
},
{
"path": "lib/models/github/latest.dart",
"chars": 971,
"preview": "class LatestDataModel {\n LatestDataModel({\n this.url,\n this.tagName,\n this.createdAt,\n this.assets,\n thi"
},
{
"path": "lib/models/home/rcmd/result.dart",
"chars": 3069,
"preview": "import 'package:pilipala/utils/id_utils.dart';\n\nclass RecVideoItemAppModel {\n RecVideoItemAppModel({\n this.id,\n t"
},
{
"path": "lib/models/live/follow.dart",
"chars": 2983,
"preview": "class LiveFollowingModel {\n int? count;\n List<LiveFollowingItemModel>? list;\n int? liveCount;\n int? neverLivedCount;"
},
{
"path": "lib/models/live/item.dart",
"chars": 1653,
"preview": "class LiveItemModel {\n LiveItemModel({\n this.roomId,\n this.uid,\n this.title,\n this.uname,\n this.online,\n"
},
{
"path": "lib/models/live/message.dart",
"chars": 2224,
"preview": "class LiveMessageModel {\n // 消息类型\n final LiveMessageType type;\n\n // 用户名\n final String userName;\n\n // 信息\n final Str"
},
{
"path": "lib/models/live/quality.dart",
"chars": 665,
"preview": "enum LiveQuality {\n dolby,\n super4K,\n origin,\n bluRay,\n superHD,\n smooth,\n flunt,\n}\n\nextension LiveQualityCode on"
},
{
"path": "lib/models/live/room_info.dart",
"chars": 3095,
"preview": "class RoomInfoModel {\n RoomInfoModel({\n this.roomId,\n this.isPortrait,\n this.liveStatus,\n this.liveTime,\n "
},
{
"path": "lib/models/live/room_info_h5.dart",
"chars": 2714,
"preview": "class RoomInfoH5Model {\n RoomInfoH5Model({\n this.roomInfo,\n this.anchorInfo,\n this.isRoomFeed,\n this.watche"
},
{
"path": "lib/models/login/index.dart",
"chars": 940,
"preview": "class CaptchaDataModel {\n CaptchaDataModel({\n this.type,\n this.token,\n this.geetest,\n this.tencent,\n thi"
},
{
"path": "lib/models/member/archive.dart",
"chars": 3145,
"preview": "class MemberArchiveDataModel {\n MemberArchiveDataModel({\n this.list,\n this.page,\n });\n\n ArchiveListModel? list;"
},
{
"path": "lib/models/member/article.dart",
"chars": 968,
"preview": "class MemberArticleDataModel {\n MemberArticleDataModel({\n this.hasMore,\n this.items,\n this.offset,\n this.up"
},
{
"path": "lib/models/member/coin.dart",
"chars": 1704,
"preview": "class MemberCoinsDataModel {\n MemberCoinsDataModel({\n this.aid,\n this.bvid,\n this.cid,\n this.coins,\n thi"
},
{
"path": "lib/models/member/info.dart",
"chars": 2060,
"preview": "class MemberInfoModel {\n MemberInfoModel({\n this.mid,\n this.name,\n this.sex,\n this.face,\n this.sign,\n "
},
{
"path": "lib/models/member/like.dart",
"chars": 4870,
"preview": "class MemberLikeDataModel {\n MemberLikeDataModel({\n this.aid,\n this.videos,\n this.tid,\n this.tname,\n thi"
},
{
"path": "lib/models/member/seasons.dart",
"chars": 2765,
"preview": "class MemberSeasonsDataModel {\n MemberSeasonsDataModel({\n this.page,\n this.seasonsList,\n this.seriesList,\n })"
},
{
"path": "lib/models/member/tags.dart",
"chars": 401,
"preview": "class MemberTagItemModel {\n MemberTagItemModel({\n this.count,\n this.name,\n this.tagid,\n this.tip,\n this."
},
{
"path": "lib/models/model_hot_video_item.dart",
"chars": 3335,
"preview": "import './model_owner.dart';\n\nclass HotVideoItemModel {\n HotVideoItemModel({\n this.aid,\n this.cid,\n this.bvid,"
},
{
"path": "lib/models/model_owner.dart",
"chars": 245,
"preview": "class Owner {\n Owner({\n this.mid,\n this.name,\n this.face,\n });\n\n int? mid;\n String? name;\n String? face;\n\n"
},
{
"path": "lib/models/model_rec_video_item.dart",
"chars": 1302,
"preview": "import './model_owner.dart';\n\nclass RecVideoItemModel {\n RecVideoItemModel({\n this.id,\n this.bvid,\n this.cid,\n"
},
{
"path": "lib/models/msg/account.dart",
"chars": 1759,
"preview": "class AccountListModel {\n AccountListModel({\n this.mid,\n this.name,\n this.sex,\n this.face,\n this.sign,\n "
},
{
"path": "lib/models/msg/like.dart",
"chars": 3896,
"preview": "class MessageLikeModel {\n MessageLikeModel({\n this.latest,\n this.total,\n });\n\n Latest? latest;\n Total? total;\n"
},
{
"path": "lib/models/msg/reply.dart",
"chars": 3527,
"preview": "class MessageReplyModel {\n MessageReplyModel({\n this.cursor,\n this.items,\n });\n\n Cursor? cursor;\n List<Message"
},
{
"path": "lib/models/msg/session.dart",
"chars": 5304,
"preview": "import 'dart:convert';\n\nimport 'package:pilipala/models/msg/account.dart';\n\nclass SessionDataModel {\n SessionDataModel("
},
{
"path": "lib/models/msg/system.dart",
"chars": 1877,
"preview": "import 'dart:convert';\n\nclass MessageSystemModel {\n int? id;\n int? cursor;\n int? type;\n String? title;\n dynamic con"
},
{
"path": "lib/models/read/opus.dart",
"chars": 9852,
"preview": "class OpusDataModel {\n OpusDataModel({\n this.id,\n this.detail,\n this.type,\n this.theme,\n this.themeMode,"
},
{
"path": "lib/models/read/read.dart",
"chars": 7340,
"preview": "import 'package:pilipala/models/member/info.dart';\n\nimport 'opus.dart';\n\nclass ReadDataModel {\n ReadDataModel({\n thi"
},
{
"path": "lib/models/search/all.dart",
"chars": 172,
"preview": "class SearchAllModel {\n SearchAllModel({this.topTList});\n\n Map? topTList;\n\n SearchAllModel.fromJson(Map<String, dynam"
},
{
"path": "lib/models/search/hot.dart",
"chars": 659,
"preview": "class HotSearchModel {\n HotSearchModel({\n this.list,\n });\n\n List<HotSearchItem>? list;\n\n HotSearchModel.fromJson("
},
{
"path": "lib/models/search/result.dart",
"chars": 10105,
"preview": "import 'package:pilipala/utils/em.dart';\nimport 'package:pilipala/utils/utils.dart';\n\nclass SearchVideoModel {\n SearchV"
},
{
"path": "lib/models/search/suggest.dart",
"chars": 2161,
"preview": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass SearchSuggestModel {\n SearchSuggestModel("
},
{
"path": "lib/models/user/black.dart",
"chars": 660,
"preview": "class BlackListDataModel {\n BlackListDataModel({\n this.list,\n this.total,\n });\n\n List<BlackListItem>? list;\n i"
},
{
"path": "lib/models/user/fav_detail.dart",
"chars": 2400,
"preview": "import 'package:pilipala/models/model_owner.dart';\n\nclass FavDetailData {\n FavDetailData({\n this.info,\n this.medi"
},
{
"path": "lib/models/user/fav_folder.dart",
"chars": 2071,
"preview": "class FavFolderData {\n FavFolderData({\n this.count,\n this.list,\n this.hasMore,\n });\n\n int? count;\n List<Fav"
},
{
"path": "lib/models/user/history.dart",
"chars": 3513,
"preview": "class HistoryData {\n HistoryData({\n this.cursor,\n this.tab,\n this.list,\n this.page,\n });\n\n Cursor? cursor"
},
{
"path": "lib/models/user/info.dart",
"chars": 3011,
"preview": "import 'package:hive/hive.dart';\n\npart 'info.g.dart';\n\n@HiveType(typeId: 4)\nclass UserInfoData {\n UserInfoData({\n th"
},
{
"path": "lib/models/user/info.g.dart",
"chars": 4231,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'info.dart';\n\n// ****************************************************"
},
{
"path": "lib/models/user/stat.dart",
"chars": 321,
"preview": "class UserStat {\n UserStat({\n this.following,\n this.follower,\n this.dynamicCount,\n });\n\n int? following;\n i"
},
{
"path": "lib/models/user/sub_detail.dart",
"chars": 2650,
"preview": "class SubDetailModelData {\n DetailInfo? info;\n List<SubDetailMediaItem>? medias;\n\n SubDetailModelData({this.info, thi"
}
]
// ... and 385 more files (download for full content)
About this extraction
This page contains the full source code of the guozhigq/pilipala GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 585 files (2.5 MB), approximately 678.4k tokens, and a symbol index with 3342 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.