Flutter 新闻客户端 - 09 详情页展示、分享、远程真机调试
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
技术点分析
- webView 原生 混合方式
- 计算 web 页面高度
- 拦截请求,自定义指令
- 内存占用(尽量少的 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.相同功能点和不同功能点: 2.关键功能差异: 对于资讯类平台,核心是文章以及会产生关联行为的功能,文章,分享,评论,相关阅读等. 2.1 分享:今日头条截图后 ...
- django2.0实现数据详情页展示的流程
django2.0实现数据详情页展示的流程 思路整理 1 先在urls.py中,定义路由获取的格式 url(r'^detail/(\d+)/$', views.blog_detail), 2 然后在v ...
- 微信小程序 新闻列表及详情页
微信小程序 新闻列表及详情页 页面效果 新闻列表 <view class="conatiner"><view class="news-item" ...
- fastadmin详情页展示图片
记录:fastadmin详情页展示图片 <div class="form-group col-xs-12 col-sm-12"><label class=&quo ...
- (二)01- DCloud平台 HTML5+ App开发——真机调试运行 夜神模拟器运行HBuilderX中的html文件 夜神模拟器运行App的基础功能示例-手机设备-分享功能-拍照功能
DCloud 平台 HTML5 + App 开发 下载安装 HBuilderX 下载地址:https://www.dcloud.io/hbuilderx.html HBuilderX-使用步骤: 第一 ...
- Flutter开发之iOS真机调试(六)
一.首先你要有个开发者账号. 二.真机数据线直连Mac 电脑,并保持解锁状态. 三.选择真机设备运行工程. VS Code 终端执行 lxx-Mac-mini:uuuu suning$ flutter ...
- 微信分享自定义标题和图片,开发者工具没问题,真机调试失败
昨天亲身经历,微信分享开发者工具调试没问题,但是真机调试失败,说明配置是没问题的,历经一天发现是缓存的问题 解决方案: 删除掉微信进程后,缓存没有被彻底清除 安卓手机打开 debugtbs.qq.co ...
- flutter 真机调试卡在 Installing build\app\outputs\flutter-apk\app.apk...
记录一下 : flutter 真机调试卡在 Installing build\app\outputs\flutter-apk\app.apk-
- 用Weex实现新闻类app详情页是怎样一种体验?
本文同步发表在:http://www.jianshu.com/p/f6bf7636f81b 先上效果图: 详情页: 写在前面的话(weex在实际项目中给我的感受): 公司项目中我已尝试部分页面使用We ...
最新文章
- 用 Python 制作数据大屏,超简单
- 总结 | 一些关于 CPU 的基本知识
- SAP BMBC报表不能显示批次分类视图里的特性值
- pytorch筛选修改问题
- MyPython--进阶篇--异常
- 模拟计算机 电磁,校园机房电磁模拟环境及计算机模拟.ppt
- 大数相乘(大数阶乘模板)
- java.net.SocketException: Permission denied解决
- python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解
- 灰度实战(三):Apollo配置中心(3)
- PyCharm: Simplify chained comparison
- php http/1.1 403 forbidden in,http常用方法有哪些
- hightopo学习之旅一 -- 节点动画
- 新能源汽车行业资讯-2022-9-16
- 2022年ASO与分发优化方法汇总
- matlab 曲线数据输出,Mathlab 如何输出曲线各数据点值?
- “≡”3个横杠的等号的意思
- RAAT: Relation-Augmented Attention Transformer for Relation Modeling in Document-Level 论文解读
- 什么是EDID,EDID能做什么,EDID基本介绍
- (九)数字后端之静态时序分析STA