├── .gitattributes
├── .gitignore
├── .vscode
└── launch.json
├── README.md
├── android
├── .gitignore
├── android_key.jks
├── app
│ ├── build.gradle
│ ├── release
│ │ ├── app-release.apk
│ │ └── output.json
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── wanjuanlink
│ │ │ │ └── lychee
│ │ │ │ ├── MainActivity.java
│ │ │ │ ├── TestActivity.java
│ │ │ │ ├── crossplatform
│ │ │ │ ├── handlers
│ │ │ │ │ └── CrossPlatformServiceMessageToNative.java
│ │ │ │ └── service
│ │ │ │ │ ├── CrossPlatformService.java
│ │ │ │ │ └── CrossPlatformServiceRegister.java
│ │ │ │ └── loader
│ │ │ │ └── ServiceLoader.java
│ │ └── res
│ │ │ ├── drawable
│ │ │ └── launch_background.xml
│ │ │ ├── layout
│ │ │ ├── main.xml
│ │ │ └── native_page.xml
│ │ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ │ └── values
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Podfile
├── Podfile.lock
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── WorkspaceSettings.xcsettings
└── Runner
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ ├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── lychee@2x.png
│ │ └── lychee@3x.png
│ ├── Contents.json
│ ├── LaunchImage.imageset
│ │ ├── Contents.json
│ │ ├── LaunchImage.png
│ │ ├── LaunchImage@2x.png
│ │ ├── LaunchImage@3x.png
│ │ └── README.md
│ ├── arrow_left_white.imageset
│ │ ├── Contents.json
│ │ └── arrow_left_white.png
│ ├── light_white.imageset
│ │ ├── Contents.json
│ │ └── light_white.png
│ ├── logo.imageset
│ │ ├── Contents.json
│ │ ├── logo@2x.png
│ │ └── logo@3x.png
│ ├── scan_bg.imageset
│ │ ├── Contents.json
│ │ └── scan_bg.png
│ ├── scan_line.imageset
│ │ ├── Contents.json
│ │ └── scan_line.png
│ └── selected.imageset
│ │ ├── Contents.json
│ │ └── selected.png
│ ├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
│ ├── Config.h
│ ├── Info.plist
│ ├── Runner-Bridging-Header.h
│ ├── Runner.entitlements
│ ├── Scan
│ ├── YYScanBGView.h
│ ├── YYScanBGView.m
│ ├── YYScanViewController.h
│ ├── YYScanViewController.m
│ └── YYScanViewController.xib
│ ├── XService
│ └── cross_platform
│ │ ├── handlers
│ │ ├── YYCrossPlatformServiceMessageToNative.h
│ │ └── YYCrossPlatformServiceMessageToNative.mm
│ │ └── service
│ │ ├── YYCrossPlatformService.h
│ │ └── YYCrossPlatformService.mm
│ ├── main.m
│ └── mix.swift
├── lib
├── common
│ ├── db
│ │ ├── SqlManager.dart
│ │ ├── SqlProvider.dart
│ │ └── provider
│ │ │ └── SearchDbProvider.dart
│ ├── event
│ │ ├── HttpErrorEvent.dart
│ │ └── NeedRefreshEvent.dart
│ ├── local
│ │ └── LocalStorage.dart
│ ├── manager
│ │ ├── HttpManager.dart
│ │ ├── MapManager.dart
│ │ ├── PushManager.dart
│ │ └── ShareManager.dart
│ ├── model
│ │ ├── Activity.dart
│ │ ├── Activity.g.dart
│ │ ├── Banner.dart
│ │ ├── Banner.g.dart
│ │ ├── Book.dart
│ │ ├── Book.g.dart
│ │ ├── BookHome.dart
│ │ ├── BookHome.g.dart
│ │ ├── BookResult.dart
│ │ ├── BookResult.g.dart
│ │ ├── Category.dart
│ │ ├── Category.g.dart
│ │ ├── Copy.dart
│ │ ├── Copy.g.dart
│ │ ├── Course.dart
│ │ ├── Course.g.dart
│ │ ├── CourseHome.dart
│ │ ├── CourseHome.g.dart
│ │ ├── CourseResult.dart
│ │ ├── CourseResult.g.dart
│ │ ├── Frame.dart
│ │ ├── Frame.g.dart
│ │ ├── Index.dart
│ │ ├── Index.g.dart
│ │ ├── Lesson.dart
│ │ ├── Lesson.g.dart
│ │ ├── LessonHome.dart
│ │ ├── LessonHome.g.dart
│ │ ├── LessonResult.dart
│ │ ├── LessonResult.g.dart
│ │ ├── Library.dart
│ │ ├── Library.g.dart
│ │ ├── Member.dart
│ │ ├── Member.g.dart
│ │ ├── QRCode.dart
│ │ ├── QRCode.g.dart
│ │ ├── Receipt.dart
│ │ ├── Receipt.g.dart
│ │ ├── ReceiptResult.dart
│ │ ├── ReceiptResult.g.dart
│ │ ├── RichBook.dart
│ │ ├── RichBook.g.dart
│ │ ├── Scholar.dart
│ │ ├── Scholar.g.dart
│ │ ├── ScholarResult.dart
│ │ ├── ScholarResult.g.dart
│ │ ├── Search.dart
│ │ ├── Search.g.dart
│ │ ├── SearchResult.dart
│ │ ├── SearchResult.g.dart
│ │ ├── Shadow.dart
│ │ ├── Shadow.g.dart
│ │ ├── Speaker.dart
│ │ ├── Speaker.g.dart
│ │ ├── User.dart
│ │ └── User.g.dart
│ ├── style
│ │ └── Style.dart
│ ├── util
│ │ └── CommonUtils.dart
│ └── xservice
│ │ ├── cross-platform
│ │ ├── handlers
│ │ │ └── CrossPlatformServiceMessageToFlutter.dart
│ │ └── service
│ │ │ ├── CrossPlatformService.dart
│ │ │ └── CrossPlatformServiceRegister.dart
│ │ └── loader
│ │ └── ServiceLoader.dart
├── main.dart
├── page
│ ├── AboutUsPage.dart
│ ├── BookDetailPage.dart
│ ├── CategoryPage.dart
│ ├── CourseAllPage.dart
│ ├── CourseDetailPage.dart
│ ├── CoursePage.dart
│ ├── DiscoverPage.dart
│ ├── HomeBookPage.dart
│ ├── HomePage.dart
│ ├── HomeTabBarPage.dart
│ ├── LessonAllPage.dart
│ ├── LessonDetailPage.dart
│ ├── LessonPage.dart
│ ├── LoginPage.dart
│ ├── MineBookPage.dart
│ ├── MineBorrowedBookPage.dart
│ ├── MineCollectionBookPage.dart
│ ├── MineCoursePage.dart
│ ├── MineFollowPage.dart
│ ├── MineFramePage.dart
│ ├── MineInfoPage.dart
│ ├── MineLentBookPage.dart
│ ├── MineLessonPage.dart
│ ├── MinePage.dart
│ ├── MineShareBookPage.dart
│ ├── MineUnShareBookPage.dart
│ ├── MineWantBorrowBookPage.dart
│ ├── MineWantReadBookPage.dart
│ ├── NearLibraryPage.dart
│ ├── QRCodePage.dart
│ ├── ScholarBookPage.dart
│ ├── ScholarCoursePage.dart
│ ├── ScholarHomePage.dart
│ ├── ScholarLessonPage.dart
│ ├── ScholarPage.dart
│ ├── SearchBookPage.dart
│ ├── SearchCoursePage.dart
│ ├── SearchDetailBookPage.dart
│ ├── SearchDetailCompositePage.dart
│ ├── SearchDetailCoursePage.dart
│ ├── SearchDetailLessonPage.dart
│ ├── SearchDetailPage.dart
│ ├── SearchLessonPage.dart
│ ├── SearchPage.dart
│ ├── SearchScholarCompositePage.dart
│ ├── SearchScholarPage.dart
│ ├── SexPage.dart
│ ├── TopCollectionBookPage.dart
│ ├── TopLatestBookPage.dart
│ ├── TopPopularBookPage.dart
│ ├── TopReadBookPage.dart
│ ├── TopReadingBookPage.dart
│ ├── UpdatePage.dart
│ └── WebViewPage.dart
└── widget
│ ├── BookGrid.dart
│ ├── BookHeaderItem.dart
│ ├── BookItem.dart
│ ├── BookRadioItem.dart
│ ├── CategoryLeftItem.dart
│ ├── CategoryRightItem.dart
│ ├── CategoryWidget.dart
│ ├── CopyItem.dart
│ ├── CourseDetailItem.dart
│ ├── CourseItem.dart
│ ├── IconText.dart
│ ├── InputWidget.dart
│ ├── LessonItem.dart
│ ├── MineFrame.dart
│ ├── MineLibrary.dart
│ ├── NearLibraryItem.dart
│ ├── ScholarCourseItem.dart
│ ├── ScholarItem.dart
│ ├── ScholarLessonItem.dart
│ ├── SectionWdiget.dart
│ ├── SeparatorWidget.dart
│ ├── SwiperWidget.dart
│ └── base
│ ├── BaseBookListState.dart
│ ├── BaseBookListWidget.dart
│ ├── BaseBookRadioListState.dart
│ ├── BaseBookRadioListWidget.dart
│ ├── BaseDecorationState.dart
│ ├── BaseListState.dart
│ ├── BaseListWidget.dart
│ ├── BaseScrollState.dart
│ ├── BaseScrollWidget.dart
│ ├── BaseState.dart
│ └── BaseWidget.dart
├── plugins
└── sharesdk-1.0.8
│ ├── .gitignore
│ ├── .vscode
│ └── launch.json
│ ├── CHANGELOG.md
│ ├── LICENSE
│ ├── README.md
│ ├── README_CN.md
│ ├── android
│ ├── .gitignore
│ ├── MobSDK.gradle
│ ├── build.gradle
│ ├── gradle.properties
│ ├── settings.gradle
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── yoozoo
│ │ └── sharesdk
│ │ ├── SharesdkPlugin.java
│ │ ├── StrUtils.java
│ │ └── Utils.java
│ ├── doc
│ └── api
│ │ ├── index.html
│ │ ├── index.json
│ │ ├── sharesdk
│ │ └── sharesdk-library.html
│ │ ├── sharesdk_defines
│ │ ├── SSDKContentType-class.html
│ │ ├── SSDKContentType
│ │ │ ├── SSDKContentType.html
│ │ │ ├── hashCode.html
│ │ │ ├── noSuchMethod.html
│ │ │ ├── operator_equals.html
│ │ │ ├── runtimeType.html
│ │ │ ├── toString.html
│ │ │ └── value.html
│ │ ├── SSDKContentTypes-class.html
│ │ ├── SSDKContentTypes
│ │ │ ├── SSDKContentTypes.html
│ │ │ ├── app.html
│ │ │ ├── audio.html
│ │ │ ├── auto.html
│ │ │ ├── file.html
│ │ │ ├── hashCode.html
│ │ │ ├── image.html
│ │ │ ├── miniProgram.html
│ │ │ ├── noSuchMethod.html
│ │ │ ├── operator_equals.html
│ │ │ ├── runtimeType.html
│ │ │ ├── text.html
│ │ │ ├── toString.html
│ │ │ ├── video.html
│ │ │ └── webpage.html
│ │ ├── SSDKError-class.html
│ │ ├── SSDKError
│ │ │ ├── SSDKError.html
│ │ │ ├── code.html
│ │ │ ├── hashCode.html
│ │ │ ├── noSuchMethod.html
│ │ │ ├── operator_equals.html
│ │ │ ├── rawData.html
│ │ │ ├── runtimeType.html
│ │ │ ├── stackTrace.html
│ │ │ ├── toString.html
│ │ │ └── userInfo.html
│ │ ├── SSDKResponseState-class.html
│ │ ├── SSDKResponseState
│ │ │ ├── hashCode.html
│ │ │ ├── noSuchMethod.html
│ │ │ ├── operator_equals.html
│ │ │ ├── runtimeType.html
│ │ │ └── toString.html
│ │ ├── ShareSDKMethod-class.html
│ │ ├── ShareSDKMethod
│ │ │ ├── ShareSDKMethod.html
│ │ │ ├── hashCode.html
│ │ │ ├── id.html
│ │ │ ├── name.html
│ │ │ ├── noSuchMethod.html
│ │ │ ├── operator_equals.html
│ │ │ ├── runtimeType.html
│ │ │ └── toString.html
│ │ ├── ShareSDKMethods-class.html
│ │ ├── ShareSDKMethods
│ │ │ ├── ShareSDKMethods.html
│ │ │ ├── activePlatforms.html
│ │ │ ├── auth.html
│ │ │ ├── cancelAuth.html
│ │ │ ├── getUserInfo.html
│ │ │ ├── getVersion.html
│ │ │ ├── hasAuthed.html
│ │ │ ├── hashCode.html
│ │ │ ├── noSuchMethod.html
│ │ │ ├── openMiniProgram.html
│ │ │ ├── operator_equals.html
│ │ │ ├── regist.html
│ │ │ ├── runtimeType.html
│ │ │ ├── share.html
│ │ │ ├── showEditor.html
│ │ │ ├── showMenu.html
│ │ │ └── toString.html
│ │ ├── ShareSDKPlatform-class.html
│ │ ├── ShareSDKPlatform
│ │ │ ├── ShareSDKPlatform.html
│ │ │ ├── hashCode.html
│ │ │ ├── id.html
│ │ │ ├── name.html
│ │ │ ├── noSuchMethod.html
│ │ │ ├── operator_equals.html
│ │ │ ├── runtimeType.html
│ │ │ └── toString.html
│ │ ├── ShareSDKPlatforms-class.html
│ │ ├── ShareSDKPlatforms
│ │ │ ├── ShareSDKPlatforms.html
│ │ │ ├── aliSocial.html
│ │ │ ├── aliSocialTimeline.html
│ │ │ ├── cmcc.html
│ │ │ ├── copy.html
│ │ │ ├── dingding.html
│ │ │ ├── douBan.html
│ │ │ ├── dropbox.html
│ │ │ ├── evernote.html
│ │ │ ├── facebook.html
│ │ │ ├── flickr.html
│ │ │ ├── googlePlus.html
│ │ │ ├── hashCode.html
│ │ │ ├── instagram.html
│ │ │ ├── instapaper.html
│ │ │ ├── kaixin.html
│ │ │ ├── kakaoSeries.html
│ │ │ ├── kakaoStory.html
│ │ │ ├── kakaoTalk.html
│ │ │ ├── line.html
│ │ │ ├── linkedIn.html
│ │ │ ├── mail.html
│ │ │ ├── meiPai.html
│ │ │ ├── messenger.html
│ │ │ ├── mingDao.html
│ │ │ ├── noSuchMethod.html
│ │ │ ├── operator_equals.html
│ │ │ ├── pinterest.html
│ │ │ ├── pocket.html
│ │ │ ├── print.html
│ │ │ ├── qZone.html
│ │ │ ├── qq.html
│ │ │ ├── qqSeries.html
│ │ │ ├── reddit.html
│ │ │ ├── renren.html
│ │ │ ├── runtimeType.html
│ │ │ ├── sina.html
│ │ │ ├── sms.html
│ │ │ ├── telegram.html
│ │ │ ├── tencentWeibo.html
│ │ │ ├── toString.html
│ │ │ ├── tumblr.html
│ │ │ ├── twitter.html
│ │ │ ├── vKontakte.html
│ │ │ ├── weChatFavorites.html
│ │ │ ├── wechatSeries.html
│ │ │ ├── wechatSession.html
│ │ │ ├── wechatTimeline.html
│ │ │ ├── whatsApp.html
│ │ │ ├── yiXinFav.html
│ │ │ ├── yinXiang.html
│ │ │ ├── yixinSeries.html
│ │ │ ├── yixinSession.html
│ │ │ ├── yixinTimeline.html
│ │ │ ├── youdaoNote.html
│ │ │ └── youtube.html
│ │ └── sharesdk_defines-library.html
│ │ ├── sharesdk_interface
│ │ ├── ShareSDK-class.html
│ │ ├── ShareSDK
│ │ │ ├── ShareSDK.html
│ │ │ ├── activePlatforms.html
│ │ │ ├── auth.html
│ │ │ ├── cancelAuth.html
│ │ │ ├── getUserInfo.html
│ │ │ ├── hasAuthed.html
│ │ │ ├── hashCode.html
│ │ │ ├── noSuchMethod.html
│ │ │ ├── openWeChatMiniProgram.html
│ │ │ ├── operator_equals.html
│ │ │ ├── regist.html
│ │ │ ├── runtimeType.html
│ │ │ ├── sdkVersion.html
│ │ │ ├── share.html
│ │ │ ├── showEditor.html
│ │ │ ├── showMenu.html
│ │ │ └── toString.html
│ │ └── sharesdk_interface-library.html
│ │ ├── sharesdk_map
│ │ ├── SSDKMap-class.html
│ │ ├── SSDKMap
│ │ │ ├── SSDKMap.html
│ │ │ ├── hashCode.html
│ │ │ ├── map.html
│ │ │ ├── noSuchMethod.html
│ │ │ ├── operator_equals.html
│ │ │ ├── runtimeType.html
│ │ │ ├── setFacebook.html
│ │ │ ├── setGeneral.html
│ │ │ ├── setQQ.html
│ │ │ ├── setSina.html
│ │ │ ├── setTwitter.html
│ │ │ ├── setWeChatMiniProgram.html
│ │ │ ├── setWechat.html
│ │ │ └── toString.html
│ │ ├── kAlbumId-constant.html
│ │ ├── kAndroidExecParam-constant.html
│ │ ├── kAttachments-constant.html
│ │ ├── kAudio-constant.html
│ │ ├── kAudioFlashURL-constant.html
│ │ ├── kAudioUrl-constant.html
│ │ ├── kAuthor-constant.html
│ │ ├── kBCCRecipients-constant.html
│ │ ├── kBlogName-constant.html
│ │ ├── kBoard-constant.html
│ │ ├── kCCRecipients-constant.html
│ │ ├── kComment-constant.html
│ │ ├── kContentType-constant.html
│ │ ├── kDeepLinkId-constant.html
│ │ ├── kDesc-constant.html
│ │ ├── kEmoticon-constant.html
│ │ ├── kEnableShare-constant.html
│ │ ├── kExtension-constant.html
│ │ ├── kFacebookHashtag-constant.html
│ │ ├── kFacebookQuote-constant.html
│ │ ├── kFile-constant.html
│ │ ├── kFolderId-constant.html
│ │ ├── kGroupId-constant.html
│ │ ├── kHidden-constant.html
│ │ ├── kIPhoneExecParam-constant.html
│ │ ├── kImages-constant.html
│ │ ├── kIsFamily-constant.html
│ │ ├── kIsFriend-constant.html
│ │ ├── kIsPublic-constant.html
│ │ ├── kLat-constant.html
│ │ ├── kLong-constant.html
│ │ ├── kMenuDisplayX-constant.html
│ │ ├── kMenuDisplayY-constant.html
│ │ ├── kNoteBook-constant.html
│ │ ├── kPermission-constant.html
│ │ ├── kPrivacyStatus-constant.html
│ │ ├── kPrivateFromSource-constant.html
│ │ ├── kRecipients-constant.html
│ │ ├── kResolveFinalUrl-constant.html
│ │ ├── kSafetyLevel-constant.html
│ │ ├── kSource-constant.html
│ │ ├── kTags-constant.html
│ │ ├── kTemplateArgs-constant.html
│ │ ├── kTemplateId-constant.html
│ │ ├── kText-constant.html
│ │ ├── kThumbImage-constant.html
│ │ ├── kTitle-constant.html
│ │ ├── kTweetId-constant.html
│ │ ├── kType-constant.html
│ │ ├── kURLName-constant.html
│ │ ├── kUid-constant.html
│ │ ├── kUrl-constant.html
│ │ ├── kVideo-constant.html
│ │ ├── kVideoAssetURL-constant.html
│ │ ├── kVideoFlashURL-constant.html
│ │ ├── kVisibility-constant.html
│ │ ├── kWXMPHdThumbImage-constant.html
│ │ ├── kWXMPPath-constant.html
│ │ ├── kWXMPType-constant.html
│ │ ├── kWXMPUserName-constant.html
│ │ ├── kWXMPWithTicket-constant.html
│ │ ├── kWeChatFile-constant.html
│ │ ├── kWeChatFileExtension-constant.html
│ │ ├── kWeChatScene-constant.html
│ │ ├── kWeiboIsStory-constant.html
│ │ ├── kWeiboObjectId-constant.html
│ │ ├── kYouTubeJsonString-constant.html
│ │ ├── kYouTubeParts-constant.html
│ │ └── sharesdk_map-library.html
│ │ ├── sharesdk_register
│ │ ├── ShareSDKRegister-class.html
│ │ ├── ShareSDKRegister
│ │ │ ├── ShareSDKRegister.html
│ │ │ ├── hashCode.html
│ │ │ ├── noSuchMethod.html
│ │ │ ├── operator_equals.html
│ │ │ ├── platformsInfo.html
│ │ │ ├── runtimeType.html
│ │ │ ├── setupAliSocial.html
│ │ │ ├── setupDingTalk.html
│ │ │ ├── setupDouBan.html
│ │ │ ├── setupDropbox.html
│ │ │ ├── setupEvernote.html
│ │ │ ├── setupFacebook.html
│ │ │ ├── setupFlick.html
│ │ │ ├── setupGooglePlus.html
│ │ │ ├── setupInstagram.html
│ │ │ ├── setupInstapaper.html
│ │ │ ├── setupKaiXin.html
│ │ │ ├── setupKakao.html
│ │ │ ├── setupLinkedIn.html
│ │ │ ├── setupMeiPai.html
│ │ │ ├── setupPinterest.html
│ │ │ ├── setupPocket.html
│ │ │ ├── setupQQ.html
│ │ │ ├── setupReddit.html
│ │ │ ├── setupSinaWeibo.html
│ │ │ ├── setupTelegram.html
│ │ │ ├── setupTencentWeibo.html
│ │ │ ├── setupTumblr.html
│ │ │ ├── setupTwitter.html
│ │ │ ├── setupVKontakte.html
│ │ │ ├── setupWechat.html
│ │ │ ├── setupYiXin.html
│ │ │ ├── setupYouDao.html
│ │ │ ├── setupYouTube.html
│ │ │ └── toString.html
│ │ └── sharesdk_register-library.html
│ │ └── static-assets
│ │ ├── URI.js
│ │ ├── css
│ │ ├── bootstrap.css
│ │ ├── bootstrap.css.map
│ │ └── bootstrap.min.css
│ │ ├── favicon.png
│ │ ├── github.css
│ │ ├── highlight.pack.js
│ │ ├── play_button.svg
│ │ ├── readme.md
│ │ ├── script.js
│ │ ├── sdk_footer_text.html
│ │ ├── styles.css
│ │ └── typeahead.bundle.min.js
│ ├── ios
│ ├── .gitignore
│ ├── Assets
│ │ └── .gitkeep
│ ├── Classes
│ │ ├── SharesdkPlugin.h
│ │ └── SharesdkPlugin.m
│ └── sharesdk.podspec
│ ├── lib
│ ├── sharesdk.dart
│ ├── sharesdk_defines.dart
│ ├── sharesdk_interface.dart
│ ├── sharesdk_map.dart
│ └── sharesdk_register.dart
│ └── pubspec.yaml
├── pubspec.lock
├── pubspec.yaml
├── static
└── images
│ ├── arrow_left_white.png
│ ├── arrow_more.png
│ ├── back.png
│ ├── book.png
│ ├── book_placeholder.png
│ ├── checkbox.png
│ ├── checkbox_empty.png
│ ├── course.png
│ ├── cross.png
│ ├── drop_down.png
│ ├── favorite_gray.png
│ ├── favorite_red.png
│ ├── found_cut.png
│ ├── found_fav.png
│ ├── found_location.png
│ ├── found_mark.png
│ ├── found_read.png
│ ├── found_want.png
│ ├── icon_heart.png
│ ├── icon_heart_green.png
│ ├── icon_locate.png
│ ├── icon_locate2.png
│ ├── lesson.png
│ ├── logo.png
│ ├── mine_top_bg.png
│ ├── more.png
│ ├── my_about.png
│ ├── my_book.png
│ ├── my_course.png
│ ├── my_follow.png
│ ├── my_frame.png
│ ├── my_lesson.png
│ ├── my_library.png
│ ├── my_note.png
│ ├── my_recommend.png
│ ├── scan.png
│ ├── search.png
│ ├── search_gray.png
│ ├── search_white.png
│ ├── selected.png
│ ├── tabbar_category.png
│ ├── tabbar_category_h.png
│ ├── tabbar_discover.png
│ ├── tabbar_discover_h.png
│ ├── tabbar_home.png
│ ├── tabbar_home_h.png
│ ├── tabbar_mine.png
│ ├── tabbar_mine_h.png
│ ├── user_placeholder.png
│ └── voice.png
└── 效果图
├── 1.jpeg
├── 2.jpeg
├── 3.jpeg
└── 4.jpeg
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.dart linguist-language=Dart
2 | *.java linguist-language=Dart
3 | *.m linguist-language=Dart
4 | *.html linguist-language=Dart
5 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .dart_tool/
3 |
4 | .packages
5 | .pub/
6 |
7 | build/
8 |
9 | .flutter-plugins
10 |
11 | *.iml
12 |
13 | .idea/
14 |
15 | .gradle/
16 |
17 | ignoreConfig.dart
18 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // 使用 IntelliSense 了解相关属性。
3 | // 悬停以查看现有属性的描述。
4 | // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "name": "Flutter",
9 | "request": "launch",
10 | "type": "dart"
11 | }
12 | ]
13 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # lychee
2 |
3 | 一款跨平台的客户端App,目前支持微信分享,二维码扫描(暂时只支持iOS),极光推送,图片上传,打开相机相册等功能,项目涉及各种常用控件,如ExpansionPanelList,GridView,ListView,StackIndex等,同样设计到网络、数据库、与原生之间的交互等内容,同时项目封装了几个基础Mixin,如BaseState,BaseScrollState,BaseListState等,将界面中设计到的公共代码放在里面,进行统一管理。
4 |
5 | ### 示例效果
6 |
7 |
8 |
9 |
10 | ### 第三方框架
11 |
12 | | 库 | 功能 |
13 | | -------------------------- | -------------- |
14 | | **dio** | **网络框架** |
15 | | **connectivity** | **网络监听** |
16 | | **event_bus** | **界面间发送通知** |
17 | | **shared_preferences** | **本地数据缓存** |
18 | | **fluttertoast** | **toast** |
19 | | **json_annotation** | **json模板** |
20 | | **json_serializable** | **json模板** |
21 | | **flutter_swiper** | **轮播图** |
22 | | **flutter_easyrefresh** | **上下拉刷新** |
23 | | **sharesdk** | **mob分享** |
24 | | **jpush_flutter** | **极光推送** |
25 | | **image_picker** | **打开相机相册** |
26 | | **xservice_kit** | **flutter与原生之间的数据传递** |
27 | | **flutter_slidable** | **侧滑** |
28 | | **qr_flutter** | **生成二维码** |
29 | | **sqflite** | **数据库** |
30 | | **webview_flutter** | **内嵌webview** |
31 | | **permission_handler** | **权限** |
32 | | **device_info** | **设备信息** |
33 | | **flutter_statusbar** | **状态栏** |
34 | | **amap_base_location** | **高德定位** |
35 |
36 | ### 相关博客
37 | * [flutter sharesdk实现跨平台分享](https://www.jianshu.com/p/6678c29a963c )
38 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | *.class
3 | .gradle
4 | /local.properties
5 | /.idea/workspace.xml
6 | /.idea/libraries
7 | .DS_Store
8 | /build
9 | /captures
10 | GeneratedPluginRegistrant.java
11 |
--------------------------------------------------------------------------------
/android/android_key.jks:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaochengxiang/flutter_lychee/0c1c617638aaea5d1d5fcf9dd367f9c433730fc5/android/android_key.jks
--------------------------------------------------------------------------------
/android/app/release/app-release.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaochengxiang/flutter_lychee/0c1c617638aaea5d1d5fcf9dd367f9c433730fc5/android/app/release/app-release.apk
--------------------------------------------------------------------------------
/android/app/release/output.json:
--------------------------------------------------------------------------------
1 | [{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
15 |
16 |
19 |
20 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/wanjuanlink/lychee/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.wanjuanlink.lychee;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 |
6 | import com.wanjuanlink.lychee.crossplatform.service.CrossPlatformService;
7 | import com.wanjuanlink.lychee.loader.ServiceLoader;
8 |
9 | import java.util.Map;
10 |
11 | import fleamarket.taobao.com.xservicekit.service.ServiceEventListner;
12 | import io.flutter.app.FlutterActivity;
13 | import io.flutter.plugins.GeneratedPluginRegistrant;
14 |
15 | public class MainActivity extends FlutterActivity {
16 |
17 | @Override
18 | protected void onCreate(Bundle savedInstanceState) {
19 | super.onCreate(savedInstanceState);
20 | GeneratedPluginRegistrant.registerWith(this);
21 | ServiceLoader.load();
22 | CrossPlatformService.getService().addEventListner("flutter_event_open_scan",new ServiceEventListner() {
23 | @Override
24 | public void onEvent(String name, Map params) {
25 | Intent intent =new Intent(MainActivity.this,TestActivity.class);
26 | startActivity(intent);
27 | }
28 | });
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/wanjuanlink/lychee/TestActivity.java:
--------------------------------------------------------------------------------
1 | package com.wanjuanlink.lychee;
2 |
3 | import androidx.appcompat.app.AppCompatActivity;
4 |
5 | import android.os.Bundle;
6 | import android.view.View;
7 | import android.widget.Button;
8 | import android.view.View.OnClickListener;
9 |
10 | public class TestActivity extends AppCompatActivity implements OnClickListener {
11 |
12 | private Button backBtn;
13 |
14 | @Override
15 | protected void onCreate(Bundle savedInstanceState) {
16 | super.onCreate(savedInstanceState);
17 | setContentView(R.layout.native_page);
18 | backBtn=(Button)findViewById(R.id.back);
19 | backBtn.setOnClickListener(this);
20 | }
21 |
22 | @Override
23 | public void onClick(View v) {
24 | switch (v.getId()) {
25 | case R.id.back:
26 | TestActivity.this.finish();
27 | break;
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/wanjuanlink/lychee/crossplatform/handlers/CrossPlatformServiceMessageToNative.java:
--------------------------------------------------------------------------------
1 | package com.wanjuanlink.lychee.crossplatform.handlers;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 | import java.util.Map;
6 | import fleamarket.taobao.com.xservicekit.handler.MessageHandler;
7 | import fleamarket.taobao.com.xservicekit.handler.MessageResult;
8 | import fleamarket.taobao.com.xservicekit.service.ServiceGateway;
9 |
10 | public class CrossPlatformServiceMessageToNative implements MessageHandler{
11 | private Object mContext = null;
12 | private boolean onCall(MessageResult result,String message){
13 | //Add your handler code here.
14 | return true;
15 | }
16 |
17 | //==================Do not edit code blow!==============
18 | @Override
19 | public boolean onMethodCall(String name, Map args, MessageResult result) {
20 | this.onCall(result,(String)args.get("message"));
21 | return true;
22 | }
23 | @Override
24 | public List handleMessageNames() {
25 | List h = new ArrayList<>();
26 | h.add("MessageToNative");
27 | return h;
28 | }
29 | @Override
30 | public Object getContext() {
31 | return mContext;
32 | }
33 |
34 | @Override
35 | public void setContext(Object obj) {
36 | mContext = obj;
37 | }
38 | @Override
39 | public String service() {
40 | return "CrossPlatformService";
41 | }
42 | public static void register(){
43 | ServiceGateway.sharedInstance().registerHandler(new CrossPlatformServiceMessageToNative());
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/wanjuanlink/lychee/crossplatform/service/CrossPlatformService.java:
--------------------------------------------------------------------------------
1 | package com.wanjuanlink.lychee.crossplatform.service;
2 |
3 | import java.util.HashMap;
4 | import java.util.Map;
5 |
6 | import fleamarket.taobao.com.xservicekit.service.ServiceTemplate;
7 | import fleamarket.taobao.com.xservicekit.service.ServiceGateway;
8 | import io.flutter.plugin.common.MethodChannel;
9 | import fleamarket.taobao.com.xservicekit.handler.MessageResult;
10 |
11 | public class CrossPlatformService {
12 | private static final ServiceTemplate mService = new ServiceTemplate("CrossPlatformService");
13 | public static ServiceTemplate getService(){
14 | return mService;
15 | }
16 | public static void register(){
17 | ServiceGateway.sharedInstance().addService(mService);
18 | }
19 | public static void MessageToFlutter(final MessageResult