flutterinit,flutterinitstate重复执行
flutter_bloc使用解析
初始化问题:这边初始化是在bloc里,直接在构造方法里面赋初值的,state中一旦变量多了,还是这么写,会感觉极其难受,不好管理。需要优化
公司主营业务:做网站、网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出徐州免费做网站回馈大家。
如果进行一个页面,需要进行复杂的运算或者请求接口后,才能知晓数据,进行赋值,这里肯定需要一个初始化入口,初始化入口需要怎样去定义呢?
首先对state进行优化,新增俩个方法:init()和clone()
init():这里初始化统一用init()方法去管理。
clone():这边克隆方法,是非常重要的,一旦变量达到俩位数以上,就能深刻体会该方法是多么的重要。
定义一个与初始化state相对应的init()初始化方法
这增加了初始化方法,请注意,如果需要进行异步请求,同时需要将相关逻辑提炼一个方法,咱们在这里配套Future和await就能解决在异步场景下同步数据问题.
这里使用了克隆方法,可以发现,我们只要关注自己需要改变的变量就行了,其它的变量都在内部赋值好了,我们不需要去关注;这就大大的便捷了页面中有很多变量,只需要变动一俩个变量的场景。
view层增加了个初始化事件。初始化操作直接在创建的时候,在XxxBloc上使用add()方法就行了,就能起到进入页面,初始化一次的效果。
bloc的思想
观察者模式的思想;观察者(回调刷新控件)和被观察者(产生相应事件,添加事件,去通知观察者),bloc层是处于观察者和被观察者中间的一层,我们可以在bloc里面搞业务,搞逻辑,搞网络请求;拿到Event事件传递过来的数据,把处理好的、符合要求的数据返回给view层的观察者就行了。
Flutter初始化
新建一个Flutter工程,android模块。
1,只有一个Activity组件,它是Dart层绘制Widget的容器。
2,Application配置FlutterApplication。
应用Application配置io.flutter.app.FlutterApplication类,App首次启动时,初始化。
调用FlutterMain.startInitialization()方法。
initConfig方法,从AndroidManfest.xml配置的applicaion节点获取meta-data数据,初始化以下默认值。
这些值都是使用中用到的name,例如,抽取apk中asset资源时,flutter_assets打包目录,打包产物data名称。
initResources方法, 初始化资源。
在Flutter打包apk的asset目录下,包括fluttter_asset目录/资源项,将资源从apk中抽取,保存在 Context.getDir("flutter", 0) 目录下。
/data/user/0/包名/app_flutter目录。
在目录中创建一个时间戳文件,根据apk版本和包信息记录的lastUpdateTime更新时间,第二次启动时,若apk未更新,不需要再次抽取。
加载so库,libflutter.so,System.loadLibrary()。
主页面继承FlutterActivity,配置启动模式singleTop。
FlutterActivity类在io.flutter.app包, (区别io.flutter.embedding.android包), 组件生命周期委托给FlutterActivityDelegate类。
组件启动,onCreate方法。
FlutterMain.ensureInitializationComplete方法,确保资源成功抽取完成,创建FlutterView视图(io.flutter.view),继承SurfaceView类,setContentView方法,设置组件主布局即FlutterView视图。
最后,根据Bundle路径,runBundle()加载运行,
调用FlutterView的runFromBundle方法,入口点在dart的main方法,
通过FlutterNativeView,调用FlutterJNI的native方法。
nativeRunBundleAndSnapshotFromLibrary方法。
任重而道远
Flutter 本地缓存
Flutter本地存储可以用 shared_preferences ,其会根据不同操作系统进行相对应的存储。
在pubspec.yaml添加
`shared_preferences: ^2.0.13`
```d
import 'package:shared_preferences/shared_preferences.dart';
class SpUtils {
SharedPreferences?prefs;
SpUtils._() {
init();
}
static SpUtils?_instance;
static preInit() {
_instance ??=SpUtils._();
}
static SpUtilsgetInstance() {
_instance ??=SpUtils._();
return _instance!;
}
void init()async {
prefs ??=await SharedPreferences.getInstance();
}
setString(String key, String value) {
prefs!.setString(key, value);
}
setDouble(String key, double value) {
prefs!.setDouble(key, value);
}
setInt(String key, int value) {
prefs!.setInt(key, value);
}
setBool(String key, bool value) {
prefs!.setBool(key, value);
}
setStringList(String key, List value) {
prefs!.setStringList(key, value);
}
clear(String key){
prefs!.remove(key);
}
clearAll(){
prefs!.clear();
}
Tget(String key) {
return prefs!.get(key)as T;
}
}
```
在项目初始页调用
`SpUtils.preInit();`
存
`SpUtils.getInstance().setString('userId', '12345678');`
`SpUtils.getInstance().setDouble('price', 12.88);`
`SpUtils.getInstance().setInt('count', 200);`
`SpUtils.getInstance().setBool('flag', true);`
取
`SpUtils.getInstance().get('userId');`
删
`SpUtils.getInstance().clearAll();`
`SpUtils.getInstance().clear('userId');`
名称栏目:flutterinit,flutterinitstate重复执行
标题路径:http://ybzwz.com/article/dsipgps.html