目前使用的是vscode开发,mac电脑,之前是iOS开发
学习书籍《flutter实战》电子书
flutter 环境搭建网上有很多教程,自己搭建的时候碰到一些问题
-
flutter的SDK不要放在中文目录下
-
如果使用vscode的开发,如果安卓跑模拟器运行,最好下载安装一下 Android Studio,模拟器下载,jdk,安卓sdk,在Android Studio里配置很方便,配置好之后,vscode里就可以运行安卓模拟器和真机了(环境变量配置的时候比如安卓sdk的路径,直接使用Android Studio里安卓sdk路径即可)
-
目前开发使用的是咸鱼的框架 fish_redux,对于初学者来说,这个框架还是比较容易上手的,推荐一篇博主写的文章还是很不错的 掘金
-
从A页面push到B页面,B页面操作完成之后回到A页面,刷新A页面,在开发过程中遇到一个报错:Exception has occurred.
_CastError (type 'CupertinoPageRoute<dynamic>' is not a subtype of type 'Route<Map<dynamic, dynamic>>?' in type cast)*
虽然是个小问题,但是还是让自己困惑了一阵,记录一下!
B页面代码如下:( {'reload': true}就是传递给A页面的参数是个Map)
Navigator.pop(ctx.context, {'reload': true});
A页面pushB页面代码(报错的代码):
void _reloadData(Action action, Context<ProcurementState> ctx) async {
Map info = action.payload;
int id = info['id'];
bool isEdit = info['isEdit'];
int purchaseOrderId = info['purchaseOrderId'];
// 问题就出现在返回的result 使用了Map接收
Map result = await Navigator.of(ctx.context)
.pushNamed(RouteConfig.addGoodsPage, arguments: {
"id": id,
'isEdit': isEdit,
'purchaseOrderId': purchaseOrderId
});
if (result is Map) {
if (result['reload']) {
fetchGoodsList(action, ctx, ctx.state.id);
}
}
}
其实报错信息里也提示了说类型不匹配,但是之前自己是做iOS开发的,我传递过去的是个Map,为啥不能用Map接收呢,这个与Dart语法有关,正确的代码是把Map换成var:
void _reloadData(Action action, Context<ProcurementState> ctx) async {
Map info = action.payload;
int id = info['id'];
bool isEdit = info['isEdit'];
int purchaseOrderId = info['purchaseOrderId'];
// 问题就出现在返回的result 使用了Map接收
var result = await Navigator.of(ctx.context)
.pushNamed(RouteConfig.addGoodsPage, arguments: {
"id": id,
'isEdit': isEdit,
'purchaseOrderId': purchaseOrderId
});
if (result is Map) {
if (result['reload']) {
fetchGoodsList(action, ctx, ctx.state.id);
}
}
}
同样如果给B页面传参的时候直接把info塞到arguments里也是会报错:Exception has occurred.
_TypeError (type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>' of 'param')
也是个类型不匹配的问题,所以代码里才把info拆开
- 应该是异步渲染的吧 FutureBuilder 在使用fishi_redux的时候当用户已经登录的情况下再次打开app的时候 要根据本地登录状态进入首页,而获取登录状态又是异步的,这里就用到了FutureBuilder,(可能方法比较笨,暂时没想到好方法,如果有同学知道,还望指点一下)
@override
Widget build(BuildContext context) {
return FutureBuilder<UserModel>(
future: _checkLogin(context),
builder: (_, snapshot) {
if (snapshot.hasData && snapshot.data != null) {
UserModel model = snapshot.data;
if (model.nickName != null) {
return createApp(RouteConfig.homePage, model.nickName);
} else {
return createApp(RouteConfig.loginPage, '');
}
} else {
return Container(
color: Colors.white,
child: Image.asset('images/launch.png'),
);
}
},
);
}
Future<UserModel> _checkLogin(BuildContext context) async {
UserModel model = await UserCenter().fetchUserModel();
return model;
}
- 另外dart 是一个类型推断语言,在flutter里函数参数竟然可以不写参数类型(他会根据你传递的参数类型推断)
例如:
void _updateGoodsListAction(params)(){}
仅仅是作为学习笔记,没有商业意图!
未完待续。。。
网友评论