1.Flutter 可以通过 热重载(hot reload) 实现快速的开发周期,热重载就是无需重启应用程序就能实时加载修改后的代码,并且不会丢失状态(译者语:如果是一个web开发者,那么可以认为这和webpack的热重载是一样的)。简单的对代码进行更改,然后告诉IDE或命令行工具你需要重新加载(点击reload按钮),你就会在你的设备或模拟器上看到更改。
学习资源:
github.com/crazycodebo… 各种开源库
AnimationController 的vsync需要传入一个TickerProvider,TickerProvider作为一个抽象类有一个方法createTicker。
通过mixin SingleTickerProviderStateMixin里面实现的createTicker可以通过传入一个回调方法获得一个Ticker,Ticker就是一个帧定时器,在执行start之后会一直在指定时间内执行回调
Flutter 模型转换采用两种方式
在线转换
javiercbk.github.io/json_to_dar…
flutter 字符串处理
包含判断::URL.contains('http')
字符串拼接: “”+“”或者‘’ + ‘’
导航头的处理
直线进度条如何设置圆角?
ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(10)),
child: LinearProgressIndicator(
value: 0.7,
valueColor: new AlwaysStoppedAnimation(Color(0xff00ff00)),
backgroundColor: Color(0xffD6D6D6),
),
),
或者使用
List of different types indicator pub.dev/packages/pe…
child: Padding(
padding: EdgeInsets.all(15.0),
child: LinearPercentIndicator(
width: MediaQuery.of(context).size.width - 50,
animation: true,
lineHeight: 20.0,
animationDuration: 2000,
percent: 0.9,
linearStrokeCap: LinearStrokeCap.roundAll,
progressColor: Colors.greenAccent,
),
)
关于AppLifecycleState检测应用程序存在的状态(前后台监听)
enum AppLifecycleState {
//应用程序是可见的,并且响应用户输入
resumed,
/// 应用程序处于非活动状态,没有接收用户输入
/// On iOS
/// 在Android上,这对应于一个应用程序或Flutter主机视图运行在前台非活动状态
/// 当其他活动被关注时,应用程序会过渡到这种状态,比如分屏应用程序、电话呼叫、画中画应用程序、 /// 系统对话框或另一个窗口
///处于这种状态的应用程序应该假设它们可能在任何时候pause.
inactive,
/// 应用程序当前对用户不可见,不响应用户输入,并在后台运行。当应用程序处于这种状态时,引擎将不 ///会调用Window.onBeginFrame和Window.onDrawFrame回调。
paused,
///应用程序仍然驻留在Flutter引擎上,但是与任何主机视图分离。
///当应用程序处于这种状态时,引擎在没有视图的情况下运行。当引擎第一次初始化时,它可以处于 ///attaching a view 的过程中或在由于 Navigator pop,view被销毁之后。
detached,
}
代码实现如下
void main() {
// Enable integration testing with the Flutter Driver extension.
// See flutter.io/testing/ for more info.
runApp(new MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State
with WidgetsBindingObserver{
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
print("--" + state.toString());
switch (state) {
//切换前台时,可回调,初始化时,收不到回调
case AppLifecycleState.resumed:
break;
//切换后台时,inactive,pause先后回调
case AppLifecycleState.inactive:
break;
case AppLifecycleState.paused:
break;
case AppLifecycleState.detached:
break;
}
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
flutterToast弹窗
pub.flutter-io.cn/packages/fl…
shared_preferences数据存储,属于轻量级的耗时操作,所以我们也是需要在异步中进行的。
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString(key, value)
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.remove(key); //删除指定键
prefs.clear();//清空键值对
Flutter Decoration背景设定(边框,圆角,阴影,形状,渐变,背景图像)
文件和目录操作
动态权限申请