美文网首页
flutter 学习 中遇到的问题

flutter 学习 中遇到的问题

作者: 小木虫666 | 来源:发表于2021-10-23 11:48 被阅读0次

    目前使用的是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)(){}
    

    仅仅是作为学习笔记,没有商业意图!

    未完待续。。。

    相关文章

      网友评论

          本文标题:flutter 学习 中遇到的问题

          本文链接:https://www.haomeiwen.com/subject/paukaltx.html