B站视频

https://www.bilibili.com/video/BV18e411s7A1
https://www.bilibili.com/video/BV1RZ4y1W7CN

本节目标

  • 详情页技术方案比较
  • 载入 web 内容
  • 自动计算高度
  • 清除广告、推荐
  • 拦截请求
  • loading 状态显示
  • 分享插件
  • 远程 android 设备调试

详情展示

技术方案选择

分析工具 UI automator view

  • 文件位置

/Users/ducafecat/Library/Android/sdk/tools/bin/uiautomatorviewer

淘宝方案

混合方式

头条

混合方式

什么值得买

单一 webView

技术点分析

    1. webView 原生 混合方式
    1. 计算 web 页面高度
    1. 拦截请求,自定义指令
    1. 内存占用(尽量少的 dom 元素)

安装插件

  • webview_flutter

https://pub.flutter-io.cn/packages/webview_flutter

  • pubspec.yaml
dependencies:webview_flutter: ^0.3.20+2
  • ios/Runner/Info.plist
    <key>io.flutter.embedded_views_preview</key><true/>

构建界面代码

  // 顶部导航Widget _buildAppBar() {return Container();}// 页标题Widget _buildPageTitle() {return Container();}// 页头部Widget _buildPageHeader() {return Container();}// web内容Widget _buildWebView() {return Container();}@overrideWidget build(BuildContext context) {return Scaffold(appBar: _buildAppBar(),body: SingleChildScrollView(child: Column(children: <Widget>[_buildPageTitle(),Divider(height: 1),_buildPageHeader(),_buildWebView(),],),),);}

url 载入

  Widget _buildWebView() {return Container(height: _webViewHeight,child: WebView(initialUrl:'$SERVER_API_URL/news/content/${widget.item.id}', //widget.url,javascriptMode: JavascriptMode.unrestricted,onWebViewCreated: (WebViewController webViewController) async {_controller.complete(webViewController);},gestureNavigationEnabled: true,),);}

计算高度

  • PX DP

    • https://blog.akanelee.me/2018/07/31/dpi-px-pt-dp-sp/
  • 设备像素密度

    一个逻辑像素占用多少个实际像素

    • https://developer.mozilla.org/zh-CN/docs/Web/API/Window/devicePixelRatio
    • https://api.flutter.dev/flutter/dart-ui/Window/devicePixelRatio.html
  • 注册 js

  double _webViewHeight = 200;javascriptChannels: <JavascriptChannel>[_invokeJavascriptChannel(context),].toSet(),
// 注册js回调JavascriptChannel _invokeJavascriptChannel(BuildContext context) {return JavascriptChannel(name: 'Invoke',onMessageReceived: (JavascriptMessage message) {print(message.message);var webHeight = double.parse(message.message);if (webHeight != null) {setState(() {_webViewHeight = webHeight;});}});}
  • 回调
        onPageFinished: (String url) {_getWebViewHeight();setState(() {_isPageFinished = true;});},
  // 获取页面高度_getWebViewHeight() async {await (await _controller.future)?.evaluateJavascript('''try {// Invoke.postMessage([document.body.clientHeight,document.documentElement.clientHeight,document.documentElement.scrollHeight]);let scrollHeight = document.documentElement.scrollHeight;if (scrollHeight) {Invoke.postMessage(scrollHeight);}} catch {}''');}

清除广告、推荐

  • https://cn.engadget.com/cn-2020-01-21-google-pixelbook-go-not-pink-available.html

  • 删除广告

        onPageStarted: (String url) {Timer(Duration(seconds: 1), () {setState(() {_isPageFinished = true;});_removeAd();_getViewHeight();});},
  _removeWebViewAd() async {await (await _controller.future)?.evaluateJavascript('''try {function removeElement(elementName){let _element = document.getElementById(elementName);if(!_element) {_element = document.querySelector(elementName);}if(!_element) {return;}let _parentElement = _element.parentNode;if(_parentElement){_parentElement.removeChild(_element);}}removeElement('module-engadget-deeplink-top-ad');removeElement('module-engadget-deeplink-streams');removeElement('footer');} catch{}''');}

拦截请求

  • 页面中 href
<div class="tags"><a href="/tag/chrome-os" class="tag">chrome os</a><a href="/tag/chromebook" class="tag">chromebook</a><a href="/tag/computer" class="tag">computer</a><a href="/tag/gear" class="tag">gear</a><a href="/tag/google" class="tag">google</a><a href="/tag/laptop" class="tag">laptop</a><a href="/tag/personal computing" class="tag">personal computing</a><a href="/tag/personalcomputing" class="tag">personalcomputing</a><a href="/tag/pixelbook-go" class="tag">pixelbook go</a>
</div>
  • navigation 拦截
        navigationDelegate: (NavigationRequest request) {if (request.url != '$SERVER_API_URL/news/content/${widget.item.id}') {toastInfo(msg: request.url);return NavigationDecision.prevent;}return NavigationDecision.navigate;},

loading 状态显示

bool _isPageFinished = false;@overrideWidget build(BuildContext context) {return Scaffold(appBar: _buildAppBar(),body: Stack(children: <Widget>[SingleChildScrollView(child: Column(children: <Widget>[_buildPageTitle(),Divider(height: 1),_buildPageHeader(),_buildWebView(),],),),_isPageFinished == true? Container(): Align(alignment: Alignment.center,child: LoadingBouncingGrid.square(),),],));}

分享

安装插件

dependencies:share: ^0.6.4

代码

            onPressed: () {Share.share('${widget.item.title} ${widget.item.url}');},

真机调试

  • scrcpy

https://github.com/Genymobile/scrcpy

资源

视频

  • b 站
  • 油管镜像

蓝湖设计稿(加微信给授权 ducafecat)

https://lanhuapp.com/url/lYuz1
密码: gSKl

蓝湖现在收费了,所以查看标记还请自己上传 xd 设计稿
商业设计稿文件不好直接分享, 可以加微信联系 ducafecat

YAPI 接口管理

http://yapi.demo.qunar.com/

代码

https://github.com/ducafecat/flutter_learn_news/releases/tag/v1.0.9

参考

https://pub.flutter-io.cn/packages/webview_flutter
https://pub.flutter-io.cn/packages/loading_animations
https://pub.flutter-io.cn/packages/share
https://github.com/Genymobile/scrcpy

VSCode 插件

  • Flutter、Dart
  • Flutter Widget Snippets
  • Awesome Flutter Snippets
  • Paste JSON as Code
  • bloc
  • Code Spell Checker

Flutter 新闻客户端 - 09 详情页展示、分享、远程真机调试相关推荐

  1. 今日头条与网易新闻客户端内容详情页对比

    左图为网易新闻客户端,右图为今日头条 1.相同功能点和不同功能点: 2.关键功能差异: 对于资讯类平台,核心是文章以及会产生关联行为的功能,文章,分享,评论,相关阅读等. 2.1 分享:今日头条截图后 ...

  2. django2.0实现数据详情页展示的流程

    django2.0实现数据详情页展示的流程 思路整理 1 先在urls.py中,定义路由获取的格式 url(r'^detail/(\d+)/$', views.blog_detail), 2 然后在v ...

  3. 微信小程序 新闻列表及详情页

    微信小程序 新闻列表及详情页 页面效果 新闻列表 <view class="conatiner"><view class="news-item" ...

  4. fastadmin详情页展示图片

    记录:fastadmin详情页展示图片 <div class="form-group col-xs-12 col-sm-12"><label class=&quo ...

  5. (二)01- DCloud平台 HTML5+ App开发——真机调试运行 夜神模拟器运行HBuilderX中的html文件 夜神模拟器运行App的基础功能示例-手机设备-分享功能-拍照功能

    DCloud 平台 HTML5 + App 开发 下载安装 HBuilderX 下载地址:https://www.dcloud.io/hbuilderx.html HBuilderX-使用步骤: 第一 ...

  6. Flutter开发之iOS真机调试(六)

    一.首先你要有个开发者账号. 二.真机数据线直连Mac 电脑,并保持解锁状态. 三.选择真机设备运行工程. VS Code 终端执行 lxx-Mac-mini:uuuu suning$ flutter ...

  7. 微信分享自定义标题和图片,开发者工具没问题,真机调试失败

    昨天亲身经历,微信分享开发者工具调试没问题,但是真机调试失败,说明配置是没问题的,历经一天发现是缓存的问题 解决方案: 删除掉微信进程后,缓存没有被彻底清除 安卓手机打开 debugtbs.qq.co ...

  8. flutter 真机调试卡在 Installing build\app\outputs\flutter-apk\app.apk...

    记录一下 : flutter 真机调试卡在 Installing build\app\outputs\flutter-apk\app.apk-

  9. 用Weex实现新闻类app详情页是怎样一种体验?

    本文同步发表在:http://www.jianshu.com/p/f6bf7636f81b 先上效果图: 详情页: 写在前面的话(weex在实际项目中给我的感受): 公司项目中我已尝试部分页面使用We ...

最新文章

  1. 用 Python 制作数据大屏,超简单
  2. 总结 | 一些关于 CPU 的基本知识
  3. SAP BMBC报表不能显示批次分类视图里的特性值
  4. pytorch筛选修改问题
  5. MyPython--进阶篇--异常
  6. 模拟计算机 电磁,校园机房电磁模拟环境及计算机模拟.ppt
  7. 大数相乘(大数阶乘模板)
  8. java.net.SocketException: Permission denied解决
  9. python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解
  10. 灰度实战(三):Apollo配置中心(3)
  11. PyCharm: Simplify chained comparison
  12. php http/1.1 403 forbidden in,http常用方法有哪些
  13. hightopo学习之旅一 -- 节点动画
  14. 新能源汽车行业资讯-2022-9-16
  15. 2022年ASO与分发优化方法汇总
  16. matlab 曲线数据输出,Mathlab 如何输出曲线各数据点值?
  17. “≡”3个横杠的等号的意思
  18. RAAT: Relation-Augmented Attention Transformer for Relation Modeling in Document-Level 论文解读
  19. 什么是EDID,EDID能做什么,EDID基本介绍
  20. (九)数字后端之静态时序分析STA

热门文章

  1. 计算机网络时有时无,电脑WiFi时有时无不稳定的解决方法 | 我爱分享网
  2. 我们来哈尔滨了,东北的老少爷们可以回家了
  3. 单例模式-多线程单例模式
  4. 2022数据结构习题(知产)
  5. 开山斧0.3.8(跨平台版本)《源码已开放》
  6. 优步和滴滴激战中国市场
  7. Feflow建模步骤及注意事项
  8. 小米5x的Build属性
  9. python3.6-XML解析方法
  10. 与第三方iot平台IFTTTSmartthingsGoogle对接开发iot物联网云服务