当前位置: 首页 > news >正文

Flutter 填坑录 (不定时更新)

一,内存爆表 > 图片缓存

/// State基类
class BaseState<T extends StatefulWidget> extends State<T>
    with
        AutomaticKeepAliveClientMixin,
        WidgetHelper,
        DialogHelper,
        EventListener {
  @mustCallSuper
  void initState() {
    if (isListenEvent()) {
      EventManager.instance.listen(this);
    }

    //指定图片缓存大小,默认是1000
    PaintingBinding.instance.imageCache.maximumSize = 10;

    super.initState();
    LogEvent.onPageStart('${this}');
  }


  @mustCallSuper
  void dispose() {
    super.dispose();
    deactivate();
    
    // 清理缓存
    PaintingBinding.instance.imageCache.clear();

    LogEvent.onPageEnd('${this}');
    if (isListenEvent()) {
      EventManager.instance.cancel(this);
    }
  }

二,iOS 字体缩小/消失/挤出屏幕等问题

import 'dart:math' as math;

import 'package:flutter/material.dart';

class NoScaleTextWidget extends StatelessWidget {
  final Widget child;

  const NoScaleTextWidget({
    Key key,
    @required this.child,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaxScaleTextWidget(
      max: 1.0,
      child: child,
    );
  }
}

class MaxScaleTextWidget extends StatelessWidget {
  final double max;
  final Widget child;

  const MaxScaleTextWidget({
    Key key,
    this.max = 1.2,
    @required this.child,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    var data = MediaQuery.of(context);
    var scale = math.min(max, data.textScaleFactor);
    return MediaQuery(
      data: data.copyWith(textScaleFactor: scale),
      child: child,
    );
  }
}

class ScaleTextWidget extends StatelessWidget {
  final double scale;

  final Widget child;

  const ScaleTextWidget({
    Key key,
    @required this.scale,
    @required this.child,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    var data = MediaQuery.of(context);
    var scale = this.scale ?? data.textScaleFactor;
    return MediaQuery(
      data: data.copyWith(textScaleFactor: scale),
      child: child,
    );
  }
}


  @override
  Widget build(BuildContext context) {
    loadData();
    return MaterialApp(
      builder: (ctx, w) {
        return MaxScaleTextWidget(
          max: 1.0,
          child: w,
        );
      },
      theme: ThemeData(
        primarySwatch: Colors.blue,
        textTheme: TextTheme(
            title: TextStyles.titleStyle, button: TextStyles.titleStyle),
      ),
      home: homePage,

三,未授权导致图片保存失败

//每次都提示图片已保存成功,相册里并没有图片
  void _onSaveImage() async {
    print("_onImageSaveButtonPressed");
    final QrPainter painter = QrPainter(
      data: _appDownloadLink,
      color: const Color(0xff222222),
      emptyColor: const Color(0xffffffff),
      version: 4,
      gapless: true,
    );

    final ByteData imageData = await painter.toImageData(300.0);
    final result = await ImageGallerySaver.save(imageData.buffer.asUint8List());
    if (result) {
      toast("二维码已成功保存到手机相册");
    } else {
      toast("二维码保存到手机相册失败, 请查看App权限");
    }
  }

  @override
  void initState() {
    super.initState();
// 先要授权访问相册
    PermissionHandler().requestPermissions(<PermissionGroup>[
      PermissionGroup.storage, // 在这里添加需要的权限
    ]);

  }

相关文章:

  • C语言中的3种注释方法
  • 华为云文件上传(单个上传和分段上传)
  • Stm32_标准库_期末设计_温度测量光照测量手机与芯片通信实现信息的更新
  • 在ts中val is Map是什么意思呢?
  • python实现TCPserver
  • 算法进修Day-33
  • Kotlin协程简介
  • pandas nlargest()的详细用法
  • ubuntu 20.04 passwd 指令不能使用
  • 小程序搭建OA项目首页布局界面
  • Redis 主从复制,哨兵,集群——(3)集群篇
  • 【大数据开发技术】实验06-SequenceFile、元数据操作与MapReduce单词计数
  • logback.xml配置详解
  • 免费的国产数据集成平台推荐
  • 汽车智能制造中的RFID技术在供应链生产管理中的应用
  • C++项目实战——基于多设计模式下的同步异步日志系统-⑩-异步缓冲区类与异步工作器类设计
  • DTI综述(更新中)
  • Eclipse Xtext 实现PLC ST 语言到C的转换
  • 【LeetCode字符串】--14.最长公共前缀
  • 小红书达人怎么对接,博主沟通流程汇总!
  • 长三角议事厅| AI作曲时代:长三角如何奏响数字音乐乐章
  • 北部艳阳高照、南部下冰雹,五一长假首日上海天气很“热闹”
  • 五一期间全国高速日均流量6200万辆,同比增长8.1%
  • 新华时评:需要“重新平衡”的是美国心态
  • 车展之战:国产狂飙、外资反扑、智驾变辅助
  • 中国强镇密码丨洪泽湖畔的蒋坝,如何打破古镇刻板印象