Flutterflutter完整项目android菜鸟低调修行纪念册

Flutter笔记-实战, 仿追书

2019-06-25  本文已影响173人  叶落清秋

目的

使用flutter对追书神器的一个仿写,主要交流和学习
因为并不是美工,很多颜色方面只是近似,尺寸方面也不严格,所以部分界面可能看起来有些丑
基本是系统提供控件的基础使用,并未去魔改系统的控件,刚接触flutter的人学习起来比较快

效果图

主页 阅读 搜索 讨论

实现了书架、书单、排行榜、分类,阅读、换源、搜索、历史、夜间模式等功能

  1. 路由使用了咸鱼的ARoute框架
  2. 图标新建了一个自己的图标库(图标都来源自iconfont)
  3. 对网络状况、系统电量、系统亮度做了处理

不足:

  1. 未有状态管理(个人偏向于 bloc+rxdart,毕竟是小项目, 界面和逻辑分离总是好的)
  2. 并未实现全部功能,后续功能应该也不会再添加了
  3. 有些做的不够严谨,并未单独抽出来放在一个常量文件中(比如颜色、文字等)
  4. 优化卡顿

关于打包

flutter的打包体验并不好,官网流程:https://flutter.dev/docs/deployment/android

步骤:

  1. 生成key(jks文件,androidstudio有自带的工具)
  2. 创建key.properties文件


    key.properties

注:keyAlias注意保持一致,androidstudio工具生成的key默认是key0

  1. 修改app下的biuld.gradle
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
...
//添加
def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    ...

    //添加
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }

    buildTypes {
        release {
            //修改为release
            signingConfig signingConfigs.release
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    ...
}
  1. 去掉AndroidMainifest.xml中的android:debuggable="true"(允许debug)
  2. 命令行运行 flutter build apk (需要配置环境变量)
F:\flutter\flutter_app>flutter build apk
Initializing gradle...                                              1.7s
Resolving dependencies...                                           6.3s
Running Gradle task 'assembleRelease'...                            7.6s
Built build\app\outputs\apk\release\app-release.apk (5.6MB).

运行成功,显示生成apk的目录

总结

1. 函数的返回值和参数类型别省略(即便dart可以省略)

举个例子:

main(){
  //调用,传递一个int,这里不会进行转换
  print("执行后:"+change(1).toString());
}
//自己写的方法,缺省了函数返回值和参数类型
change(i)=> changeNum(i);

//假设是系统写好的方法
double changeNum(double i) => i/2.0;

这里会报: type 'int' is not a subtype of type 'double'的错误,缺省了最麻烦的还是在解析网络json数据时,这里报的错一般和列表相关,但是并不会定位代码位置,找起来有些麻烦

2. 能局部刷新的最好别全局刷新

举个例子:
我们在ListView中,比如某条消息显示未阅读状态,然后点击这个item,然后进到具体消息详情界面。但是当前这个列表的item需要更新状态,显示已阅读。
这个时候没必要在整个ListView中去调用setState,只需要在item中调用setState(即:item单独抽出来作为一个StatefulWidget)

3. 多层级复杂的列表最好用CustomScrollView或NestedScrollView

使用ListView嵌套ListView会有部分卡顿的情况


最后说明

github地址: https://github.com/leaf-fade/zhuishu

ps: 毕竟是个人兴趣做的小项目,未进行深入bug测试,多少还存在些。不得用于任何商业以及利益活动。由此引起的责任,跟我无关。谢谢!

上一篇下一篇

猜你喜欢

热点阅读