资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

flutter离线开发,flutter原生混合开发

Flutter自制工具之fluct助力Flutter快速开发神器

一个帮助开发Flutter应用程序的工具

网站设计制作过程拒绝使用模板建站;使用PHP+MYSQL原生开发可交付网站源代码;符合网站优化排名的后台管理系统;成都网站设计、网站建设收费合理;免费进行网站备案等企业网站建设一条龙服务.我们是一家持续稳定运营了10多年的创新互联网站建设公司。

.----------------------------------------------

| github地址:

|

| pub地址:

|

`----------------------------------------------

该工具无需添加到依赖项中,我们只需要 激活 即可,使用如下命令:

fluct 目前只有两个命令 create 和 gen-assets

在 Flutter 开发过程中,我们创建文件是必须的,而AS自带的创建文件,并没有自动的生成相关的内容,这会让开发者非常的苦恼,类名还需要自己手动敲的话,而该命令,直接可以一步到位。

当运行此命令后,命令行会输出以下内容

可以看到,该命令输出的内容是简单易懂的,我们来简单使用一下吧。

创建 IndexPage 页面,继承自 StatefulWidget ,可以使用如下命令:

运行成功之后,我们会在项目下找到 index_page.dart 文件,内容为:

当然,你也可以指定哪个文件夹,例如,我要在./lib/src/page 文件夹下创建 IndexPage ,使用如下命令

在开始之前,我们需要在项目根目录下新建一个 fluct.yaml 文件,因为 fluct create -t custom 命令会找到它,内容如下:

这里,我声明了 inh 命令,然后运行这个命令之后会在生成文件的时候添加 inh 对应的内容,内容中我们值得注意的是 $NAME$ 占位符,该字符串会被替换成根据文件名生成的内容,例如: index_page 会插入 IndexPage 到 $NAME$ 占位符中,最后,我们运行以下命令:

运行成功之后,我们能够在根目录下找到 index_inherited.dart 文件,内容也是对应的自定义内容

我们在使用资源文件时,需要在 pubspec.yaml 文件声明资源文件的路径

例如:我在 ./assets/images 文件夹下添加 a.png 图片,需要在 pubspec.yaml 文件下声明

或者使用文件夹路径

这一步如果文件多起来,很容易出现混乱,导致声明麻烦,引用麻烦,并随着项目的迭代,资源文件有些不用了,也不知道哪个是哪个,这个时候, fluct gen-assets 命令帮到你

当运行 fluct gen-assets -h 会输出以下内容

到此,你已经拥有了自动资源绑定的功能了,输入 fluct gen-assets 即可

所有的内容都声明好了, very good ~

有小伙伴可能会疑惑, fluct create 运行之后会发现未找到命令,可能你使用了 flutter pub global activate fluct 命令激活,这个时候,我们可以使用 flutter pub run fluct create 运行

Flutter插件开发

Flutter插件是Flutter调用原生能力的一种解构方式。

Flutter 会通过 MethodChannel 将数据传递给 iOS/ Android ,反之 iOS/ Android 也可以通过 MethodChannel 将数据传回给 Flutter。

在Flutter工程根目录创建plugins目录,在plugins目录下执行下面命令:

Flutter-Native

Native-Flutter

Flutter 开发笔记

下面这种情况下,为 InkWell 设置的 splashColor 不会生效:

需要用 Material 去除背景色,然后将颜色设置在 InkWell 外部:

在 Dialog builder 中使用 WillPopScope 禁用返回键返回:

注意:使用此方法同时也会禁用 iOS 上的手势滑动返回功能,推荐判断平台后再使用。

修改对话框中的复选框状态,最简便的方法是通过 Element 中的 markNeedsBuild 方法:

当然,更推荐的做法是通过 StatefulBuilder ,然后就可以在 Dialog 中调用 setState 方法了,不过在调用 setState 时需要判断 Dialog 是否已经关闭,否则会造成 setState() called after dispose() 的错误,可以通过添加一个标志位来解决,如下:

在 Web 中加载网络图片有时会失败,遇到这样的报错: Exception caught by image resource service... ,造成该错误的原因通常是,图片跨域了(见 跨域资源共享 )。最简单的解决办法是, 使用 HTML 渲染加载 ,而不是默认的 CanvasKit。

Flutter 中所有的 list 默认都是没有 ScrollBar 的,必须使用 ScrollBar 组件。ScrollBar 组件通过监听 ScrollView 的 ScrollNotification 来刷新位置,所以 List 的长度必须是固定的。

当使用 WebView 等高度不定的组件时会出现内容被截断的情况,通常可以使用 NestedScrollView 来解决该问题,需要在 WebView 外部嵌套 SingleChildScrollView。

虽然使用了缓存,而且也是用 builder 加载图片的,但是发现一个现象:滑动屏幕后图片短暂消失并重新加载了。图片高度很高时这种现象更加明显,其原因是超出屏幕范围一定距离的组件被重新渲染了。解决方法是在 ListView 上设置 cacheExtent 参数:

该参数的作用是改变超出屏幕高度后继续渲染的范围(以像素为单位),比如设置成 9999 后意味着超出屏幕 10000 像素以内的内容都会被保留下来。

借助 IntrinsicHeight 组件:

另外,IntrinsicHeight 还可以用于 Dialog 或者 BottomSheet 中,使得其中的元素 显示内在元素的高度 ,从而避免元素因为约束的存在而不显示或者高度太高(比如在使用了 Column 或者 Row 的时候)。

在通过 Uri 的 queryParameters 获取 query 参数时,发现有些链接会抛出下面异常:

造成该异常的原因是 Uri 默认使用 utf-8 解码超链接字符串,如果链接中包含非 utf-8 字符,就会造成上面的错误,相关 issue 见: issue #31621 。目前该 issue 处于 open 的状态,暂时的解决办法是,在所有使用到 queryParameter 的地方用 try..catch 捕捉可能抛出的异常。

Flutter 开发非常依赖各种官方或第三方的插件,而在使用这些插件时多少都会遇到一些问题,大部分问题都可以通过搜索和查找 issue 来解决。这里记录下一些我在使用部分插件时遇到的问题及其解决方法。

目前该库没有图片加载完成的回调(见 issue #545 ),不过我们可以通过在 imageBuilder 中来添加回调:

这是一个应用内更新插件,安卓 10 以上安装时需要在 manifest 中添加以下内容:

目前功能最强大的 WebView 插件,基本能满足绝大部分移动端网页加载的需求,而且可定制化程度高。

一般通过 CookieManager 修改 Cookie,拦截请求并修改请求对象的 Header 不会生效。

InAppWebViewOptions 的 userAgent 只在 iOS 上生效,而 applicationNameForUserAgent 只在 Android 上生效,所以最好的做法是分平台设置 InAppWebViewOptions ,而且需要注意,由于设置 userAgent 后会覆盖默认的 UserAgent,所以如果需要在默认的 UserAgent 上添加其它参数,iOS 上需要通过 InAppWebViewController.getDefaultUserAgent() 获取默认 UserAgent 参数,而 Android 不需要添加。

如果图片源或者请求是 http 的,为了在 Android 上正常加载请求,必须在 AndroidInAppWebViewOptions 中将 mixedContentMode 设置为 AndroidMixedContentMode.MIXED_CONTENT_ALWAYS_ALLOW 。

当我们想要设置全屏图片的时候,由于默认的 Constraint 会将图片居中显示,所以图片四周会留有空隙。为了去除这个限制,我们需要 Xcode 中打开 LaunchScreen.storyboard,然后在 View Controller 的 View 和 LaunchImage 上的 Safe Area 去掉。

具体设置方法:右侧 Inspector 面板 Show the Size inspector 解选 Layout Margins 中的 Safe Area Relative Margins,拖动图片占满全屏,然后根据 View Controller Scene 的 Warning,更新 Constraint 就可以了。

在集成某些三方库之后,在使用命令行运行 iOS 模拟器的时候可能会遇到下面这个报错:

这是因为 iOS 模拟器未来将会兼容 arm64 架构,但是目前还不支持,所以我们需要修改 Build Setting 使得能够在 x86_64 的模拟器上运行,操作步骤见 这里 。

flutter 插件开发

new flutter project,选择Flutter Plugin,next,输入插件名,包名,运行平台及编写语言,finish!

如上图,笔者的插件名为log_plugin,选用Android,java语言开发

在自动打开和插件名同名的dart文件,声明要使用其他语言的方法,本例使用java 语言实现Android原生的log输出

编辑 android/src/main/java/com/whh/log_plugin/LogPlugin.java

在onMethodCall方法中,区别声明方法名,以实现该方法逻辑

至此,简单的插件开发完成,接下来测试

example是插件测试工程,打开其中的main.dart

打开已有的或者新建一个flutter app project,在其pubspec.yaml引入插件

使用pub get 关联到插件

详见官网文档

此文为 flutter 初学者记录学习过程,附上 github ,小小分享~

每天进步一点点。。。(2021-08-10)


文章名称:flutter离线开发,flutter原生混合开发
浏览地址:http://cdkjz.cn/article/dseioho.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220