Flutter项目实战

news2024/12/25 9:00:20

1.Androidstudio 获取dart支持才会出现 下图,才可以单独运行

在这里插入图片描述

2.需要 flutter pub get

在这里插入图片描述

3.Android Studio 中使用 FlutterJsonBeanFactory 插件

注意点:需要保证该 Android Studio 窗口下是一个完整的Flutter项目(窗口下有且仅有一个Flutter项目,不能在文件夹内),否则会提示

在这里插入图片描述
在这里插入图片描述
最终代码中识别的代码
在这里插入图片描述

4.仿微信图库选择

名称likes是否维护url缺点
image-picker4635https://pub.flutter-io.cn/packages/image_picker太过简单,多选需要长按,不能限制数量
wechat_camera_picker420https://pub.dev/packages/wechat_camera_picker和crm项目包冲突,解决半天,无法搞定,影响性很大
images_picker140https://pub.flutter-io.cn/packages/images_picker和crm项目包冲突,解决半天,无法搞定,影响性很大
  • image-picker
    https://pub.flutter-io.cn/packages/image_picker
    太过简单,多选需要长按,不能限制数量

  • wechat_camera_picker
    https://pub.dev/packages/wechat_camera_picker
    minSdkVersion 21

    满足项目需求,和crm项目包冲突,解决半天,无法搞定,影响性很大

  • images_picker
    https://pub.flutter-io.cn/packages/images_picker
    满足项目需求,和crm项目包冲突,解决半天,无法搞定,影响性很大

5.系统权限

permission_handler
https://pub.flutter-io.cn/packages/permission_handler

//获取拍照(camera、写)和相册权限()
import 'package:permission_handler/permission_handler.dart';
Future<void> _initData() async {
    Map<Permission, PermissionStatus> statuses = await [
      Permission.photos,
      Permission.camera,
    ].request();
    if (statuses.values.first.isGranted) { }
  }

6.安全距离

bottom: MediaQuery.of(context).padding.bottom

7.ListView嵌套GridView

由于 GridView 和 ListView 都是可以滚动的组件,所以嵌套的时候要注意把里面的组件改为不可滚动组件。
重要属性:

shrinkWrap: true, //解决无限高度问题
physics:NeverScrollableScrollPhysics(), //禁用滑动事件

8.get

https://pub.dev/packages/get

它集高性能状态管理、智能依赖注入和路由管理于一体,既快速又实用。

class FeedbackController extends GetxController {
 openGallery(int index, int num) async {
		update();
	}
}



GetBuilder<FeedbackController>(builder: (_){
//更新页面
}

final controller = Get.put(FeedbackController());

///输入框监听
TextField(
         onChanged: (text) {
                     controller
                     ..content = text
                     ..update();
         },
 )

eg:

import 'package:bruno/bruno.dart';
import 'package:flutter/widgets.dart';
import 'package:get/get_state_manager/src/simple/get_controllers.dart';
import 'package:permission_handler/permission_handler.dart';

import '../../../../common/global_app_config.dart';
import '../../../../common/utils/keyboard_util.dart';


class FeedbackController extends GetxController {
  int value = 0;
  List<String> photoEntity = [];
  int maxNum = 3; //图片最大选择数
  ///反馈内容
  String content = '';
  int contentMaxNum = 300; //反馈内容最大字数

  /// 获取当前展示个数,用来判断是否显示加号图片
  int getShowNum() {
    int showNum = 0;
    if (photoEntity.length >= 3) {
      showNum = maxNum;
    } else {
      showNum = photoEntity.length + 1;
    }
    return showNum;
  }

  /// 打开相册
  /// [index] 索引
  openGallery(int index, int num) async {
    if (photoEntity.length >= 3) {
      print("超出了3张");
      return;
    }
    if (index == photoEntity.length) {
      Map<Permission, PermissionStatus> statuses = await [
        Permission.photos,
        Permission.camera,
      ].request();
      if (statuses.values.first.isGranted) {
        await GlobalConfig.getInstance()
            .syncImagesData(maxNum - photoEntity.length)
            .then((map) {
          var list = map?["path"] as List<Object?>;
          for (var element in list) {
            photoEntity.add(element.toString());
          }
          update();
        });
      }
    }
  }

  //调用反馈接口
  requestFeedback(BuildContext context) {
    if (value == 0) {
      BrnToast.show("请选择问题类型", context);
      return;
    }
    if (content.isEmpty) {
      BrnToast.show("请填写反馈内容", context);
      return;
    }
    KeyboardUtils.hideKeyboard(context);
  }
}

9.flutter 传值给Android

//Flutter

 Future<Map<Object?, Object?>?> syncImagesData(int num) async {
    // 原生响应 getGlobalData 方法
   return await _methodChannel.invokeMethod<Map<Object?,Object?>?>("getImagesData",{"num": num});
  }
  

//Android

 var num: Int = call.argument<Int>("num") ?:0

10.flutter 键盘出现时候导致固定底部的按钮被顶上来

Scaffold(
      resizeToAvoidBottomInset: false,
      )

12.需要重启的场景

  • 加入图片
  • JsonConvert 中加入新的类

13.json 中data为数组格式的解析方式

class JsonConvert {
	static final Map<String, JsonConvertFunction> _convertFuncMap = {
    (FeedBackTypeModelEntity).toString(): FeedBackTypeModelEntity.fromJson,
    (FeedBackModelEntity).toString(): FeedBackModelEntity.fromJson,
		(MessageControl).toString(): MessageControl.fromJson,
		(UsedCarOrderModelEntity).toString(): UsedCarOrderModelEntity.fromJson,
		(UsedCarOrderStatusCountEntity).toString(): UsedCarOrderStatusCountEntity.fromJson,
  };
}
  /// 反馈类型数据
  var getFeedbackTypeResult = ValueNotifier<LoadState?>(null);

  void getFeedbackType() {
    getFeedbackTypeResult.value = Loading();
    Network.getInstance().getList<FeedBackTypeModelEntity>(
        "api/app/feedback/type", (result) {
          print("111111111${result.data}");
      getFeedbackTypeResult.value = Loaded(result.data);
    }, (error) {
      LoadError(error.code, error.message);
    });
  }

###14.返回到主页
跳转入口加入

   Navigator.pushAndRemoveUntil(context,
             MaterialPageRoute(builder: (context) => FeedBackResultPage()),
             (Route<dynamic> route) => false);

14.flutter抓包

    client.findProxy = (uri) {
         //proxy all request to localhost:8888
         return 'PROXY 172.20.28.248:8888';
       };

15.返回

返回上一层

Navigator.pop(context);

返回到原生

SystemNavigator.pop();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

录音软件哪个好用?推荐3款亲测好用的录音软件

很多小伙伴不知道电脑如何录制声音&#xff1f;其实电脑录制声音很简单&#xff0c;借助一款好用录音软件&#xff0c;就可以轻松录制。那你知道录音软件哪个好用吗&#xff1f;小编平常的工作经常需要使用到录音软件。今天就给大家推荐3款亲测好用的录音软件&#xff0c;感兴趣…

k8s核心资源Service

1、介绍为一组pod&#xff08;一次部署&#xff09;统一暴露一个ip和端口&#xff0c;供外界访问。2、集群内对外统一暴露kubectl expose deploy <部署名> --port<对外暴露端口> --target-port<容器内部端口>kubectl expose deploy mynginx --port8000 --tar…

torch_geometric--Convolutional Layers

torch_geometric–Convolutional Layers 卷积层 MessagePassing 式中口口口表示可微的排列不变函数&#xff0c;例如: sum, mean, min, max 或者 mul 和 γΘ\gamma_{\Theta}γΘ​和ϕΘ\phi_{\Theta}ϕΘ​表示可微函数&#xff0c;例如 MLPs. 请参见这里的附带教程。 参数…

JDBC-BasicDAO

引入 之前的sql语句是固定的只能通过参数传入&#xff0c;要写那么多方法肯定不好弄 这就引出了DAO 这里是整个流程示意图 最下面开始说 就是mysql库的每一张表对应一个JavaBean 右边是我们获取和关闭连接的工具类 上面XXXDAO的意思是 每一个表&#xff0c;都有一个与之对应的D…

高压放大器在镓基液态金属微型马达驱动实验研究中的应用

实验名称&#xff1a;高压放大器在镓基液态金属微型马达驱动实验研究中的应用 研究方向&#xff1a;新型材料 测试目的&#xff1a; 微/纳马达虽然是一种以实际应用为基础的动力装置&#xff0c;但其在科学研究方面的价值也尤为重要。在微/纳米尺度下&#xff0c;它可以接受能量…

【测试如何学代码?】学习代码的最佳实践经验分享

为什么要写这篇&#xff1f; 经常在群里看到大家问&#xff1a;该选择哪门语言&#xff1f;哪门语言有钱途&#xff1f; 其实&#xff0c;不管哪门语言&#xff0c;只要深入学好了都不会差&#xff0c;当然&#xff0c;我们选择语言最好还是要和自己的技术方向及职业发展相匹配…

基于php的高校社团信息管理系统

摘 要社团是由高校用户依据兴趣爱好自愿组成&#xff0c;按照章程自主开展活动的用户组织。高校社团是实施素质教育的重要途径和有效方式&#xff0c;在加强校园文化建设、提高用户综合素质、引导用户适应社会、促进用户交流等方面发挥着重要作用&#xff0c;是新形势下有效凝聚…

Android studio:Could not find method compile() for arguments 问题解决及两种解决方法探讨延伸

Could not find method compile() for arguments 问题全称 Could not find method compile() for arguments [org.tensorflow:tensorflow-lite:] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler. 如图 解决方法1(简单) …

[数据结构基础]排序算法第四弹 -- 归并排序和计数排序

目录 一. 归并排序 1.1 归并排序的实现思想 1.2 归并排序的递归实现 1.2.1 归并排序递归实现的思想 1.2.2 归并排序递归实现的代码 1.3 归并排序的非递归实现 1.3.1 归并排序非递归实现的思想 1.3.2 归并排序非递归实现的代码 1.4 归并排序的时间复杂度分析 二. 计数排…

c++之模板【进阶版】

前言 对于泛型编程&#xff0c;学好模板这节内容是非常有必要的。在前面学习的STL中&#xff0c;由于模板的可重性和扩展性&#xff0c;几乎所有的代码都采用了模板类和模板函数的方式&#xff0c;这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。 模板初阶 …

Hugging face教程-使用速查表-快速入门

Hugging face笔记 course url&#xff1a;https://huggingface.co/course/chapter5/8?fwpt 函数详细情况&#xff1a;https://huggingface.co/docs/transformers/main_classes/pipelines#transformers.TokenClassificationPipeline 基础掌握transformers和datasets&#xf…

软件测试 利器 | AppCrawler 自动遍历测试工具实践(一)

本文为霍格沃兹测试学院学院学员课程学习笔记&#xff0c;系统学习交流文末加群。 AppCrawler 是由霍格沃兹测试学院校长思寒开源的一个项目,通过名字我们大概也能猜出个方向&#xff0c;Crawler 是爬虫的意思&#xff0c;App 的爬虫&#xff0c;遍历 App &#xff1a; 官方 G…

linux性能优化-中断

一、概念 中断其实是一种异步的事件处理机制&#xff0c;可以提高系统的并发处理能力。Linux将中断处理过程分成了两个阶段&#xff1a;上半部和下半部 &#xff08;1&#xff09;上半部用来快速处理中断&#xff0c;它在中断禁止模式下运行&#xff0c;主要处理跟硬件紧密相关…

云计算是什么

&#x1f4d2;博客主页&#xff1a; 微笑的段嘉许博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &#x1f4c6;51CTO首发时间&#xff1a;&#x1f334;2023年2月1日&#x1f334; ✉…

gcc 简介

一、gcc简介gcc与g&#xff0c;当程序中出现using namespace std等带有c特性的语句时&#xff0c;如果用gcc编译时&#xff0c;必须显式地指明这个程序要用c编译库编译&#xff0c;而g可以直接编译。二、gcc支持的文件.c&#xff0c;c语言的源程序.C, c的源程序.cc&#xff0c;…

数据结构——堆的介绍以及应用

前言&#xff1a;对于数据结构而言&#xff0c;大多存在着对应的物理结构和逻辑结构&#xff0c;而我们一开始介绍的顺序表&#xff0c;链表&#xff0c;栈&#xff0c;队列等的物理结构和逻辑结构还是比较类似的。今天要介绍的堆则有所不同&#xff0c;其物理结构是数组&#…

JS前端基于canvas给图片添加水印,并下载带有水印的图片

基于canvas给图片添加水印实现效果图图片添加水印的步骤1.获取图片路径&#xff0c;将图片转换为canvas2.canvas画布上绘制文字水印3.水印绘制完成后&#xff0c;将canvas转换为图片格式4.水印绘制完成后&#xff0c;将canvas下载为图片完整代码总结1、在utils.js 封装添加水印…

POE交换机全方位解读(中)

POE供电距离到底怎么算 只针对符合IEEE802.3af/at 标准PoE设备 ① 网线对供电距离的影响 首先我们先来看下表IEEE802.af和IEEE802.3at标准中对Cat5e网线要求&#xff1a; 说明&#xff1a;Type 1 value和Type 2 value 分别指IEEE802.3af和IEEE802.3at的要求。 从表中可以看出&a…

PCB电路板单面板和双面板的区别和共同点

PCB电路板可以分为单面板、双面板和多面板&#xff0c;我们常用的主要是单面板和双面板&#xff0c;那么单面板和双面板有哪些区别呢&#xff1f;在了解二者区别前&#xff0c;沐渥小编先给大家介绍一下什么是单面板和双面板。 单面板是指单面的线路板&#xff0c;元器件在一面…

如何实现报表集成?(四)——权限集成

在上一篇&#xff0c;我们介绍了报表工具的资源集成&#xff0c;基本知道了报表工具链接、模块、页面和移动端如何实现集成。 这一篇&#xff0c;我们看下如何做权限集成。使用第三方系统的资源权限验证 实际上往往存在多个系统需要统一权限认证&#xff0c;用户要求将某个系统…