flutter 相关知识点(持续更新)

本文介绍Flutter中的文字过渡动画制作方法、自适应布局技巧、利用Map构建动态Widget列表、获取Widget尺寸及环境变量设置等实用开发技巧。

开发环境基础入门参考我的另一篇文章:flutter 开发(一)

文字过渡动画

AnimatedDefaultTextStyle buildAnimatedDefaultTextStyle(
      text, active, fontColor) {
    // TextStyle(
    //                 color: fontColor, fontSize: isActive ? 32.w : 28.w),
    //           )
    return AnimatedDefaultTextStyle(
      ///设置Text中的文本样式
      ///每当样式有改变时会以动画的方式过渡切换
      style: active
          ? TextStyle(fontSize: 32.w, color: fontColor)
          : TextStyle(fontSize: 28.w, color: fontColor),

      ///动画切换的时间
      duration: const Duration(milliseconds: 200),

      ///动画执行插值器
      curve: Curves.bounceInOut,

      ///文本对齐方式
      textAlign: TextAlign.start,

      ///文本是否应该在软换行符处换行
      softWrap: true,

      ///超过文本行数区域的裁剪方式
      ///设置设置为省略号
      overflow: TextOverflow.ellipsis,

      ///最大显示行数
      maxLines: 1,

      ///每当样式有修改触发动画时
      ///动画执行结束的回调
      onEnd: () {
        print("动画执行结束");
      },

      ///文本组件
      child: Text(text),
    );
  }

flutter 自适应高度

// 使用column 或row 的以下属性 可以实现
 mainAxisSize: MainAxisSize.min,

运用map 构建widget

     // 如果需要索引(index)
// 一:
       [].asMap().map(
                  (index, e) {
                    return MapEntry(
                      index,
                      Text(e['name'],
                           style: TextStyle(
                           color: rgba(51, 51, 51, 1),
                           fontSize: 28.w,
                          ),
                      ),
                    );
                  },
                ).values.toList()
// 几个关键的地方(必须)
// 1: asMap()   2: MapEntry()  3: .values.toList() 

// 二:
ListView(
      shrinkWrap: true,
      physics: widget.physics,
      children: <Widget>[
        for (int i = 0; i < widget.steps.length; i += 1)
          Column(
            key: _keys[i],
            children: <Widget>[
              InkWell(
                onTap: widget.steps[i].state != StepState.disabled ? () {
                  // In the vertical case we need to scroll to the newly tapped
                  // step.
                  Scrollable.ensureVisible(
                    _keys[i].currentContext!,
                    curve: Curves.fastOutSlowIn,
                    duration: kThemeAnimationDuration,
                  );

                  widget.onStepTapped?.call(i);
                } : null,
                canRequestFocus: widget.steps[i].state != StepState.disabled,
                child: _buildVerticalHeader(i),
              ),
              _buildVerticalBody(i),
            ],
          ),
      ],
    );

// 不需要索引
       [].map((e)=>Text(e['name'],
                       style: TextStyle(
                                  color: rgba(51, 51, 51, 1),
                                  fontSize: 28.w,
                                      ),
                      );
                      ).toList()

获取widget宽高并为另一widget设置宽高

// 放到initState()中,公共GlobalKey 去获取目标widget的宽高,并设置另一个widget的top值girdleTop

   // 这个方法是在widget单次构建完成后的回调
   WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
      var pickerHeight = pickerKey.currentContext!.size!.height;
      setState(() { // 虽然在initState里面但作用域的问题 还是需要setState才能初始生效
        girdleTop = pickerHeight / 2 - (90.h / 2);
      });
    });

2022.11.2更新

flutter 命令行添加自定义变量,实现环境变量的设置

在命令行上添加: --dart-define=[ENV]=[dev]
ENV:变量名;
dev:变量值;
如:

// 开发环境
flutter run -d chrome --dart-define=ENV=dev
// 生产环境
flutter build web --dart-define=ENV=prod

在页面中使用:

  const String _env = String.fromEnvironment('ENV');

flutter 配置环境变量(基于命令行添加自定义变量)

使用:flutter_dotenv;
安装:

flutter pub add flutter_dotenv

使用:

import 'package:flutter_dotenv/flutter_dotenv.dart';
void main() async {
  const String _env = String.fromEnvironment('ENV');
  await dotenv.load(fileName: _env + '.env');
  runApp(const MyApp());
}

页面中获取使用:

String http = dotenv.get('API_URL'); // API_URL 为.env文件中的变量名

注意:
每一个.env 文件都应在pubspec.yaml 中声明路径:

      assets:
          - dev.env
          - test.env
          - prod.env

2022.11.3更新

flutter web hash路由使用

flutter sdk版本:“>=2.15.1 < 3.0.0”
第一步,正常通过onGenerateRoute创建路由
在这里插入图片描述
参考官方定义onGenerateRoute方法,让页面能够保持正确路由,请参考红圈处
在这里插入图片描述
第二步,页面中使用:
下面变量route 的值为settings ,可取name(path),和页面args(query参数)
在这里插入图片描述

部分错误解决方案

(1)Dependency ‘androidx.webkit:webkit:1.5.0’ requires ‘compileSdkVersion’ to be set to 32 or higher.Compilation target for module ‘:app’ is ‘android-31’

报错如下
在这里插入图片描述
解决方案:
1 在.android\app\build.gradle文件中修改如下:
(注意 minSdkVersion 的版本也不能低于19)
在这里插入图片描述
2 在文件 .android\Flutter\build.gradle 中
compileSdkVersion 也要修改为 32
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caperxi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值