交待下背景,“小霸戈”五年Android开发经验,常年自愿加班、不要工资,本来是一个快乐、自在的猿~,自从一时糊涂当了房奴后,就想尽办法搞钱,这不朋友介绍了个App开发的活,客户是台湾的(需要繁体),开始周期一个半月。
要是阁以前我还是会会考虑做不做的,毕竟钱少事多,做外包什么的是最累的了,但是今时不同往日,搞钱的事不能马虎!!!
这里得感谢我的好哥们(无情的中间商)给我介绍的活儿~~
先来个App的无码高清设计图:
功能倒不是很多的,就是有几个比较难搞的地方:
- 要支持 iOS 和 Android
- 接入Firebase
- 在线播放音频
- ...
好在后台不用我出马,不然又是一款杀手级应用!!
说干就干
啥要还要跨平台?可我只是个Android小开发,虽然之前用RN做过跨平台的应用,但按目前RN的发展用来做跨平台App还是有点招架不住,好在我常年利用上班时间,摸鱼、划水混迹于Android开发技术圈,记住了不少关键字。
现在最火的跨平台技术就就是Flutter吗? 闲鱼、哈啰出行等互联网公司搞的热火朝天的,虽然我不会,crtl+c搞不定吗?
搭建工程
老实说,我忘记了~~ 但是办法总比困难多,这难不到我的!
工程搭完了,最少节省两天的工作量,充分发挥没那条件就创建条件的精神~~
正式开干
先把Flutter环境安排上,这个我是完全参考flutter中文网来的,感谢社区大神的无私奉献。
安装完flutter doctor下, 如下就配置好了:
接下来就是快乐的打代码时光了,利用周末、下班后2小时,效果非常明显,我居然会一点dart语法了,感觉上是java的表兄弟,除了加了一些高级语法外,感觉上没什么大的区别,那些高级语法我不用它不就是java了吗, 就这样利用业余时间每天弄几个页面,不会的就百度看flutter文档,不会的效果就直接pub.dev搜索,造轮子是不可能的,很快第一个版本就弄出来。
这里要安利下Flutter做App是真的快(前提是你有在下这么强,嘿嘿),没有Android那繁琐的xml配置Widget搞定所有布局!
写UI的时候就碰到一个比较难点的侧滑的效果,其他的都不值一提,有兴趣的可以看看,给上链接感谢大佬提供的框架:
心得体会: flutter组件挺全的,大部分不用自己造轮子。
Flutter 播放音乐
开始没做之前,我以为这个会花一些时间,甚至做了最坏的打算了,大不下写两个原生的插件支持下,万万没想到是google已经为flutter实现了音乐播放的插件,google大法好啊。
使用也非常简单,简单几步就行,先添加依赖:
dependencies:
...
audioplayers: 0.19.1
...
然后再初始化下:
void initAudioPlayer() {
audioPlayer = new AudioPlayer();
...
}
需要注意的是iOS后台播放的问题,需要特殊配置下:
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
...
</array>
Firebase 集成
firebase的集成也非常的简单,但是就是测试的时候很麻烦,因为是google的服务需要tizi,现在搞这玩意有点难啊。。。 。,办法总比困难多,努力下没什么是解决不了的,虽然我是请人吃了顿饭才解决。。。
总的来说集成还是很快的,先引用下依赖:
dependencies:
...
firebase_core: 1.3.0
firebase_auth: 1.4.1
cloud_firestore: ^2.2.2
firebase_messaging: ^10.0.2
然后初始化下,就搞定了,详细的就不解释了,毕竟时间就是金钱,你少看几个字,我少打几个字大家都有好处:
void main() async{
await initFirebase();
runApp(FlowApp());
}
Future initFirebase() async {
FirebaseApp firebaseApp = await Firebase.initializeApp();
await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
alert: true,
badge: true,
sound: true,
);
FirebaseMessaging messaging = FirebaseMessaging.instance;
NotificationSettings settings = await messaging.requestPermission(
alert: true,
announcement: false,
badge: true,
carPlay: false,
criticalAlert: false,
provisional: false,
sound: true,
);
print('用户授予权限结果: ${settings.authorizationStatus}');
return Future.value("");
}
class FlowApp extends StatefulWidget {
@override
State<StatefulWidget> createState() => FlowAppState();
}
class FlowAppState extends State<FlowApp>{
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
static const AndroidNotificationChannel channel =const AndroidNotificationChannel(
'high_importance_channel', // id
'High Importance Notifications', // title
'This channel is used for important notifications.', // description
importance: Importance.max,
);
@override
void initState() {
// TODO: implement initState
super.initState();
initialize();
}
void initialize() async {
...
}
...
}
初始化代码有点多,有兴趣可以回复我获取demo代码。
总结
测试联调这一步是最花时间,也是最麻烦的了,有一个非常重要的问题,就是沟通问题,大家的工作时间都不统一,我是业余时间来做的,周末客户不上班,晚上他们已经下班,所以每次只能我晚上回来修改完代码,然后第二天发包给他们测试,然后测试问题我也不能改,只能晚上回去改,测试进度非常的慢,时间就是金钱啊。。。。
做外包的时间只有两个时间点是最快乐
- 缺钱的时候,有活可做
- 做完,收钱的时候
其他的时间都在后悔,再也不接外包了。。。。