赞
踩
);
}
);
}
}
要实现一个 stateful 的 widget
,可以继承 StatefulWidget
并在 createState
方法中返回一个 State
。除了这一部分,代码跟我们之前写的并没有太大的区别。
剩下的,就是替换 MyApp
里面使用的按钮,修改后的代码如下:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: ‘Our first Flutter app’,
home: Scaffold(
appBar: AppBar(
title: Text(‘Flutter rolling demo’),
),
body: Center(
child: RollingButton(),
),
),
);
}
}
再次运行,点击按钮后,我们将看到梦寐以求的 dialog。
如果你遇到了麻烦,可以查看 tag first_app_step2 的代码。
最后,我们来实现“roll”:
import ‘dart:math’;
class _RollingState extends State {
final _random = Random();
// …
List _roll() {
final roll1 = _random.nextInt(6) + 1;
final roll2 = _random.nextInt(6) + 1;
return [roll1, roll1];
}
void _onPressed() {
debugPrint(‘_RollingState._onPressed’);
final rollResults = roll();
showDialog(
// 第一个 context 是参数名,第二个 context 是 State 的成员变量
context: context,
builder: () {
return AlertDialog(
content: Text(‘Roll result: (
r
o
l
l
R
e
s
u
l
t
s
[
0
]
,
{rollResults[0]},
rollResults[0], {rollResults[1]})’),
);
}
);
}
}
还是一样,重新运行后,我们就能够看到每次点击按钮的结果随机地出现 [1, 6] 中的数……慢着,怎么弹出的消息里的两个号码总是一样的!好吧,肯定是哪里出错了。
这次,我们不采用打 log 的方法,改用 debugger 来调试。
1. 在 final rollResults = _roll()
这一行打个断点
2. 然后点击 Debug main.dart 开始调试
3. 点击 APP 里的 Roll 按钮
现在,应用停在了我们所打的断点处:
接下来:
1. Step Into 进入 _roll
方法
2. 进入 _roll
后,Step Over 一行一行执行。
这里我们看到,两次 random 确实产生了不同的结果。我们继续:
_roll
就返回了rollResults
的值可以发现,两个结果居然变成一样的了。再往回查看一下代码,我们写的是 return [roll1, roll1]
。修改后一个为 roll2
,程序就能够按预期的正常执行了。
最终的代码,可以看 tag first_app_done。
本篇文章其实介绍了两种调试方法:打 log 和 debugger。虽然现在 Flutter 提供的 log 工具比较简陋,可以预期未来还会进一步完善。
使用打 log 的方式,好处在于不会对执行流程产生较大的影响,在多线程环境尤为有用。它的速度也比较快,不需要我们去单步执行。不足之处在于,如果原先没有对应的 log,我们只能修改代码重新运行,才能查看相应的状态。对于线上的应用,我们也只能够通过分析 log 来定位问题。
debugger 跟打 log 方式是互补的。使用 debugger 时,我们可以随意查看我们需要知道的变量的值,一步一步近距离观察代码的运行状态。坏处当然就是太慢了。在什么时候使用什么方法,需要一些经验;但有时候就全凭个人喜好了,没有优劣之分。
更多的调试方法,读者可以根据需要查看flutter.io/debugging/进一步学习。
编写完应用后,就得打包 apk 分发给用户使用了。在这一小节,我们来看看怎么给 Flutter 项目打包。
在项目的根目录,有一个 android 文件夹,下面我们将主要对这个目录的文件进行修改。
keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key复制代码
storePassword=123456
keyPassword=123456
keyAlias=keystore
File=…/key.jks
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 {
signingConfig signingConfigs.release
minifyEnabled true
useProguard true
// proguard 文件我们在下一步添加
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}
}
签名信息配置完毕后,下面进行第5步。
#Flutter Wrapper
-keep class io.flutter.app.** { ; }
-keep class io.flutter.plugin.* { ; }
-keep class io.flutter.util.* { ; }
-keep class io.flutter.view.* { ; }
-keep class io.flutter.* { ; }
-keep class io.flutter.plugins.* { *; }
编译 apk。在项目的根目录,执行 flutter build apk
, 编译后的应用在 build/app/outputs/apk/release/app-release.apk。
还是在根目录下,执行 flutter install
就可以安装这个 apk 了。
对于 iOS,读者可以看flutter.io/ios-release…,这里就不再演示了。 查看最终的项目,可以 checkout 到 tag first_app_signing。恭喜你,第一个 Flutter 应用完成啦。
加群 Android IOC架构设计领取获取往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
**要想成为高级安卓工程师,必须掌握许多基础的知识。**在工作中,这些原理可以极大的帮助我们理解技术,在面试中,更是可以帮助我们应对大厂面试官的刁难。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
dJzUztwB-1712719960439)]
[外链图片转存中…(img-Bax5rrll-1712719960439)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Kor99d9z-1712719960439)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。