├── .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 result, String message){ 20 | Map args = new HashMap<>(); 21 | args.put("message",message); 22 | mService.invoke("MessageToFlutter", args, mService.methodChannelName(), new MethodChannel.Result() { 23 | @Override 24 | public void success(Object o) { 25 | if (o instanceof Map){ 26 | result.success((Map)o); 27 | }else{ 28 | result.error("return type error code dart code","",""); 29 | } 30 | } 31 | 32 | @Override 33 | public void error(String s, String s1, Object o) { 34 | if (result != null){ 35 | result.error(s,s1,o); 36 | } 37 | } 38 | 39 | @Override 40 | public void notImplemented() { 41 | if (result != null){ 42 | result.notImplemented(); 43 | } 44 | } 45 | }); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/wanjuanlink/lychee/crossplatform/service/CrossPlatformServiceRegister.java: -------------------------------------------------------------------------------- 1 | package com.wanjuanlink.lychee.crossplatform.service; 2 | 3 | import com.wanjuanlink.lychee.crossplatform.handlers.*; 4 | 5 | public class CrossPlatformServiceRegister { 6 | public static void register(){ 7 | CrossPlatformService.register(); 8 | CrossPlatformServiceMessageToNative.register(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/wanjuanlink/lychee/loader/ServiceLoader.java: -------------------------------------------------------------------------------- 1 | package com.wanjuanlink.lychee.loader; 2 | 3 | import com.wanjuanlink.lychee.crossplatform.service.*; 4 | 5 | public class ServiceLoader { 6 | public static void load(){ 7 | CrossPlatformServiceRegister.register(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /android/app/src/main/res/layout/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /android/app/src/main/res/layout/native_page.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | 20 |