快速学习Flutter

2023-11-12

文章目录

写在前面

本文以官网为学习路线。辅助一些注意点。了解Flutter的整体环境

Flutter官网

快速学习flutter,首先需要知道flutter官网:

https://flutter.dev/

同时还有翻译版的flutter 中文网

https://flutterchina.club/

Flutter基本知识

由dart语言编写的跨平台UI框架。

Flutter 的特性

  • 跨平台
  • 高性能
  • 丰富的 UI 组件
  • 学习成本低
  • 开发效率高

Flutter Windows环境搭建

Flutter网站有安装:
https://flutter.dev/docs/get-started/install

英文不好可以看中文
Flutter中文网:
https://flutterchina.club/setup-windows/

  1. Flutter SDK
  2. Flutter IDE
    • Android Studio
    • VS Code
查看文档时有几点注意:
1.中国镜像地址

1.计算机 -> 属性 -> 高级系统设置 -> 环境变量,打开环境变量设置框。

2.在用户变量下,选择新建环境变量,添加如下的两个环境变量和值:

变量名:FLUTTER_STORAGE_BASE_URL

变量值:storage.flutter-io.cn

变量名:PUB_HOSTED_URL

变量值:pub.flutter-io.cn

2.搭建 Android 开发环境

1.打开 Android Studio
2.File > Settings > Plugins
3.点击 Browse repositories, 搜索 Flutter 并安装 重启 Android Studio。
4.Android Studio 重启后,点击 File > New ,如果看到了 New Flutter Project… ,说明 Flutter 插件已经安装完成。

3.Flutter SDK

https://flutter.dev/docs/development/tools/sdk/releases?tab=windows

最好下载稳定版本

Flutter SDK 的环境变量

1.计算机 -> 属性 -> 高级系统设置 -> 环境变量,打开环境变量设置框。
2.在用户变量下,选择 Path,点击编辑:

  • 如果已经存在 Path变量,则在原有的值后面先加 ;,然后将 Flutter SDK 的完整路径 E:\src\flutter\bin 添加上。
  • 如果没有 Path 变量,则新建一个名为 Path 的用户变量,然后将 Flutter SDK 的完整路径 E:\src\flutter\bin 添加上。

Flutter是如何运转的

Flutter重写了底层渲染逻辑和上层渲染开发。
在这里插入图片描述图片来自

Flutter 架构是采用的分层设计。从下到上依次为:Embedder(嵌入器)、Engine、Framework。
Embedder 是嵌入层,做好这一层的适配 Flutter 基本可以嵌入到任何平台上去; Engine 层主要包含 Skia、Dart 和 Text。Skia 是开源的二位图形库;Dart 部分主要包括 runtime、Garbage Collection、编译模式支持等;Text 是文本渲染。Framework 在最上层。我们的应用围绕 Framework 层来构建,因此也是本文要介绍的重点。

不是特别了解可以以后再看。
Flutter 实现原理及在马蜂窝的跨平台开发实践

Flutter知识体系

因为Flutter是跨平台开发。整体其实按照客户端路线即可构建整个知识体系。

在这里插入图片描述

Dart语言

Dart官网:
https://dart.dev/

Dart 语言优势

  • 面向对象
  • 支持 JIT(Just-in-time)(动态编译),也可以支持 AOT(Ahead Of Time)(静态编译)。热重载就是基于JIT编译。
  • 单线程模型:dart中没有线程,只有Isolate(隔离区)。Isolate之间不会共享内存。通过时间循环机制(Event looper)在时间队列(Event Queue)上传递消息。
  • 内存分配与垃圾回收: dart来及回收采用多声带算法。新生代在回收内存时采用“半空间机制”,触发垃圾你回收时,dart会将前半空间的活跃对象拷贝到备用空间,然后整体释放当前空间的所有内存。回收过程中,Dart 只需要操作少量的“活跃”对象,没有引用大量的死亡对象则被忽略。很适合Widget销毁重建场景。
如何区分一门语言究竟是AOT还是JIT?

通常来说,看代码在执行前是否需要编译即刻,如果需要编译属于AOT;如果不需要,属于JIT.

  • AOT代表:C/C++ 执行前编译机器码
  • JIT代表:JavaScript .Python 等脚本语言。

为什么Flutter会选择 Dart ?

Dart基础语法

官网中:
https://dart.dev/guides/language/language-tour

中文网:
http://dart.goodev.org/guides/language/language-tour

Dart语法:

Dart语法如果会java,javascript。上手会很快。

关键字56个
  • 声明变量并赋值的示例:
var name = 'Bob';
重点是Final and const
  • const 是编译时常量,在编译的时候就初始化了,但是 final 变量是当类创建的时候才初始化。
  • 有String 字符串 还可以写成 var(声明变量而不指定类型。)
数据类型
  • numbers
  • strings
//基本
String abc= 'abcdefg';
// 单引号嵌套双引号
String abcs= '$singleString a "bbb" ${doubleString}';
  • booleans
  • lists (也被称之为 arrays)
//创建一个int类型的list
 List list = [1, 2, 3];
// 使用List的构造函数
var vegetables = new List();
// 添加list
fruits.add('kiwis');

// 添加多个
fruits.addAll(['grapes', 'bananas']);

// 获取list的长度
assert(fruits.length == 5);

// 移出一个条目
var appleIndex = fruits.indexOf('apples');
fruits.removeAt(appleIndex);
assert(fruits.length == 4);

// 移除所有
fruits.clear();
assert(fruits.length == 0);
  • maps
定义 map 对象
// 经常使用字符串作为key。
var hawaiianBeaches = {
  'Oahu'      : ['Waikiki', 'Kailua', 'Waimanalo'],
  'Big Island': ['Wailea Bay', 'Pololu Beach'],
  'Kauai'     : ['Hanalei', 'Poipu']
};
// 构造函数也可以
var searchTerms = new Map();
//键值对
var nobleGases = new Map<int, String>();
//添加
var nobleGases = {54: 'xenon'};
//移除
nobleGases.remove(54);
Functions(方法)
  • 函数可以被定义为变量,甚至可以被定为参数传递给另一个函数。
  • 函数可以不用写返回值:
// 声明返回值
  bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

// 不声明返回值
  isNoble(atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

//对于只有一个表达式的方法,你可以选择 使用缩写语法来定义:
// => expr 语法是 { return expr; } 形式的缩写
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
  • dart不支持重载,以可选参数来代替。Optional parameters(可选参数)
    • 默认构造函数的写法:
    Exapmle(this.x, this.y);
    
    • 创建对象可以不需要new。
     if (i.isOdd) return Divider(); 
    
    这句可以写成
     if (i.isOdd) return new Divider(); 
    
流程控制语句

和其他语言基本类似。

Typedefs

在 Dart 语言中,方法也是对象。 使用 typedef, 或者 function-type alias 来为方法类型命名, 然后可以使用命名的方法。 当把方法类型赋值给一个变量的时候,typedef 保留类型信息。

typedef int Compare(Object a, Object b);
class SortedCollection {
  Compare compare;
  SortedCollection(this.compare);
}

 // Initial, broken implementation.
 int sort(Object a, Object b) => 0;

main() {
  SortedCollection coll = new SortedCollection(sort);
  assert(coll.compare is Function);
  assert(coll.compare is Compare);
}
异常

和java基本相似

try {
  breedMoreLlamas();
} catch(e) {
  print('Error: $e');  // Handle the exception first.
} finally {
  cleanLlamaStalls();  // Then clean up.
}

和java基本相似,也有构造方法,成员变量,有抽象类,可以实现

class Point {
  num x;
  num y;

  Point(num x, num y) {
    // There's a better way to do this, stay tuned.
    this.x = x;
    this.y = y;
  }
}

以上代码不免有点java语言的感觉,构造方法可以简化,简化后就有dart语言的风格了。

class Point {
  num x;
  num y;
 Point(this.x, this.y);
}

需要注意的是:
没有public private等关键字。在变量前面加入“_”,表示私有。

父子类构造函数顺序:

子类构造函数调用父类非命名,无参构造函数。先父后子。
1.初始化列表
2.父类的无参构造函数
3当前类的无参构造函数

通过named constructors可以使父类有多个构造函数,但是子类是不能继承父类的构造函数的。如果使用父类的构造函数,子类需要实现父类的构造函数。

多个构造函数

可以通过Named constructors使类有多个构造函数:
使用:

class Point {
  num x, y;
  Point(this.x, this.y);
  // Named constructor
  Point.origin() {
    x = 0;
    y = 0;
  }
}

通过named constructors可以使父类有多个构造函数,但是子类是不能继承父类的构造函数的。如果使用父类的构造函数,子类需要实现父类的构造函数。

继承和接口的差别

从下面代码中,我们也可以看到一些dart语言的语法风格。

class Point {
  num x = 0, y = 0;
  void printInfo() => print('($x,$y)');
}

//Vector 继承自 Point
class Vector extends Point{
  num z = 0;
  @override
  void printInfo() => print('($x,$y,$z)'); // 覆写了 printInfo 实现
}

//Coordinate 是对 Point 的接口实现
class Coordinate implements Point {
  num x = 0, y = 0; // 成员变量需要重新声明
  void printInfo() => print('($x,$y)'); // 成员函数需要重新声明实现
}

var xxx = Vector(); 
xxx
  ..x = 1
  ..y = 2
  ..z = 3; // 级联运算符,等同于 xxx.x=1; xxx.y=2;xxx.z=3;
xxx.printInfo(); // 输出 (1,2,3)

var yyy = Coordinate();
yyy
  ..x = 1
  ..y = 2; // 级联运算符,等同于 yyy.x=1; yyy.y=2;
yyy.printInfo(); // 输出 (1,2)
print (yyy is Point); //true
print(yyy is Coordinate); //true

子类 Coordinate 采用接口实现的方式,仅仅是获取到了父类 Point 的一个“空壳子”,只能从语义层面当成接口 Point 来用,但并不能复用 Point 的原有实现。

类继承,接口实现和混入(minxin)的理解

父类继承:和java类似,继承了父类的实例变量和各种方法。但是不能用一个普通方法重写getter。
抽象类:抽象类不能实例化,会报出AbstractClassInstantiationError错误。
接口:成员变量,成员函数需要重新声明实现。和java不一样的是,没有接口声明,可以通过抽象类来描述接口。
mixin:使一个类有多个父类。例如:在Flutter中常见的我们需要继承state。如果需要页面保持状态,我们还需要AutomaticKeepAliveClientMixin来保持页面状态。这时就需要通过with来使用mixin.

泛型

和java类似

T first<T>(List<T> ts) {
  // ...Do some initial work or error checking, then...
  T tmp ?= ts[0];
  // ...Do some additional checking or processing...
  return tmp;
}
Asynchrony support(异步支持)

和java不同的是,java使用多线程,dart提供的是异步支持,通过async和await

checkVersion() async {
  var version = await lookUpVersion();
  if (version == expectedVersion) {
    // Do something.
  } else {
    // Do something else.
  }
}

Flutter示例

让我们来看一下dart语法在Flutter中

//导包
import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

//程序的起始入口
//箭头符号  支持lambada表达式
void main() => runApp(MyApp());

//extends 可以继承
//StatelessWidget  是无状态的
//StatefulWidget是有状态的。有状态的就是数据频繁变动的,我们可以用setstate()方法来进行刷新UI

class MyApp extends StatelessWidget {
//通过build来进行构建
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Startup Name Generator',
      home: RandomWords(),
    );
  }
}

class RandomWordsState extends State<RandomWords> {
  //Dart 没有 public、 protected、 和 private 关键字
  //变量定义可以为final 
  //_suggestions :如果一个标识符以 (_) 开头,则该标识符 在库内是私有的。
  //数组 []
  final _suggestions = <WordPair>[];
  final _biggerFont = const TextStyle(fontSize: 18.0);

  Widget _buildSuggestions() {
    return ListView.builder(
        padding: const EdgeInsets.all(16.0),
        itemBuilder: (context, i) {
        
          if (i.isOdd) return Divider(); 

          final index = i ~/ 2;
          if (index >= _suggestions.length) {
            _suggestions.addAll(generateWordPairs().take(10)); 
          }
          return _buildRow(_suggestions[index]);
        });
  }
 //一个简单的函数
  Widget _buildRow(WordPair pair) {
    return ListTile(
      title: Text(
        pair.asPascalCase,
        style: _biggerFont,
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Startup Name Generator'),
      ),
      body: _buildSuggestions(),
    );
  }

}

class RandomWords extends StatefulWidget {
  @override
  RandomWordsState createState() => RandomWordsState();
}

MaterialApp 与 Scaffold

  • Flutter中有两种风格安卓对应Material Design,MaterialApp ,iOS对应Cupertino.
  • MaterialApp 经常是 Flutter Widget 树里的第一个元素,就是 Root Widget。
  • Scaffold 实现了 Material Design 的基本布局结构,例如 AppBar、Drawer、SnackBar 等,所以为了使用这些布局,也必须要使用 Scaffold,所以一个 Flutter App 的 基本结构就是:Root Widget 是 MaterialApp ,然后 MaterialApp 的 子Widget 就是 Scaffold,然后我们在 Scaffolfd 的 子Widget 里写UI。
Widgets
  • widget树深度优先遍历,将widget由父到子构建。
  • 通过build来构建UI
    官网中看完Get Started会看到
    Learn more
    https://flutter.dev/docs/get-started/learn-more
    先看看widgets
    我们使用的都是组件封装提供好的。
    Widget 组合的结构是树,所以就有父子关系。
    我们通常用MaterialApp 配合Scaffold 一起使用。
小拓展:widgets中的key:

key这块仅仅是一个小的知识点。如果不是特别理解,入门的时候可以不看。

官网:
https://api.flutter.dev/flutter/widgets/Widget/key.html

控件一个小部件如何替换树中的另一个小部件。

key分类:

  • Local Key
  • Global Key

官网中 youtube视频 ,可以点击字幕选项,这样听起来可能会更好。
https://www.youtube.com/watch?v=kn0EOS-ZiIc

Flutter中key的作用
https://www.jianshu.com/p/57debb89a24f?tdsourcetag=s_pctim_aiomsg
Flutter中Widget之key原理探索
https://www.jianshu.com/p/e9f48141218d?tdsourcetag=s_pctim_aiomsg

Widget 的分类
  • StatefulWidget
    • 可以变化的 Widget,通过setState刷新
  • StatelessWidget
    • 不可以变化的 Widget
基本布局构建

常用的widgets有

  • 文本框
    • text
    • RichText(富文本)
  • 图片
    • Image
  • 输入框(TextField)
  • 对话框(showDialog)

flutter中有几种布局:

我们需要注意的是,大多数widget都是有padding,居中等自带属性。
如果一开始不熟悉布局,我们可以在每个控件之上加上矩形边框(BoxDecoration)来查看每个布局的大小熟悉之后将其去除

盒子模型

三种:

  • 尽可能大的。例如,Center和ListView使用的框。
  • 那些试图和他们的孩子一样大的孩子。例如, Transform 和 Opacity。
  • 那些试图成为特定尺寸的。例如,图像(image)和文本框(Text)

container也是尽可能大,但是给宽度,就遵循这个值。

路由跳转

界面之间跳转通过路由
第一个页面跳转到第二个页面。例如:

Navigator.push(
  context, MaterialPageRoute(builder: (context) => SecondPage()));

返回:

Navigator.pop(context);
flutter第三方插件

pub.dartlang.org/
搜索第三方插件

例如搜索webview
image
里面会有相应的用法

image

在github中可以看到flutter中官方的插件

https://github.com/flutter/plugins/tree/master/packages
flutter_webview_plugin 插件是先于官方出的。

Flutter 的状态管理

Flutter 在设计声明式 UI 上借鉴了不少 React 的设计思想。
状态管理简单理解就是一个页面数据改变之后,其他页面也会改变相同的数据。

全局状态的例子:
用户的数据信息
App 的已读、未读状态数据

常用的框架:

  • Scoped model
  • BLoC
  • Redux
网络

我们可以使用基本http进行网络请求。
还可以使用dio第三方库进行网络请求。

dio使用

yaml 文件配置
yaml相当于Android中的gradle,用来配置项目相关脚本。

dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2
  json_annotation: ^1.2.0
  dio: ^1.0.6

dev_dependencies:
  build_runner: ^1.0.0
  json_serializable: ^1.5.0

为了便利使用 json_serializable库

https://caijinglong.github.io/json2dart/index_ch.html

选1.xx 文件名写上

注意

part 'Email.g.dart';

类名如果大写的时候 需要修改,默认是小写的


flutter packages pub run build_runner watch

监听之后 会自动生成。
Flutter dio结合json_serializable请求数据并解析Demo

本地数据

官方shared_preferences
pub网址
https://pub.dev/packages/shared_preferences#-installing-tab-

基本shared_preferences工具类将会是这样。

class LocalStorage {
	//保存
  static save(String key, value) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setString(key, value);
  }
	//获取
  static get(String key) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.get(key);
  }
//移除
  static remove(String key) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.remove(key);
  }
}
Flutter 与 Native 通信

Flutter毕竟是UI框架,有的时候避免不了使用原生的一些功能或者代码。
这个时候UI和Native之间就需要通信。例如我们的Flutter需要推送功能,我们就需要自己封装一个插件代码。

PlatformChannel

在这里插入图片描述
PlatformChannel 用于 Flutter 与 Native(Android、iOS) 之间的消息传递。

PlatformChannel 是双向的
MethodChannel
EventChannel
BasicMessageChannel

官网中介绍了一种写法:
https://flutter.dev/docs/development/platform-integration/platform-channels

github中有相应的demo。

官方的video_player 源码中用到了event channel和methodChannel。
详细请看 flutter/plugins github
BasicMessageChannel大多数情况下是不用的。

Flutter 性能监控

https://flutterchina.club/debugging/

Flutter打包
Android

build.gradle android下

android {
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
    ....
    }

在android\app同级目录下建立local.properties文件并且填入

storePassword=你的
keyPassword=你的
keyAlias=你的
storeFile=哪个盘的jks 如: D:/myproject/lalala.jks
ios打包和正常一样
持续交付

Travis CI 是在线托管的持续交付服务,网页上点几下就好,非常方便。
Travis CI官网

Flutter 深入原理

美团
https://tech.meituan.com/2018/08/09/waimai-flutter-practice.html

Flutter混合遇到的问题

如果是新建立一个项目,可以重新建立一个Flutter App。而在大多数已经有的项目中,部分引入flutter会遇到很多的问题。

闲鱼对这部分探索是最多的。闲鱼技术掘金

混合Flutter主要问题:
混合栈管理,减少包大小,flutter音视频,内存, Flutter工具,Flutter webview,业务架构

混合栈管理:flutter_boost 闲鱼的一个框架
减少包大小:带有flutter引擎,资源目录,以及代码实现。
flutter音视频:

有两种方法:

一platfomeview

如果有原生的音视频代码,迁移到flutter上面,platfomeview是一个很好的选择。
在这里插入图片描述

二 TextureWidget

platfomeview在内存上有一定的劣势。
google video_player的demo推荐的方式就是TextureWidget
解码的纹理特征给TextureWidget,通过textureWidget调用Opengl来进行底层渲染,通过textureid来传递。
在这里插入图片描述

内存
flutter工具
flutter webview
业务架构

fish_redux

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速学习Flutter 的相关文章

  • flutter web http.get 返回“不支持的操作:Platform._version”

    我正在开发 flutter web 应用程序并尝试从互联网获取一些数据 我正在使用包 http http dart 并尝试这样做 await http get url 但我得到了这个错误 不支持的操作 Platform version da
  • Flutter:一张带有圆形头像的卡片,非常引人注目

    我想做一张卡片CircleAvatar 突出显示 您可以在这张图片中看到详细信息 我不知道它是如何工作的 我尝试了一些Stack和定位小部件 但它不起作用 Stack确实是解决方案 Stack children
  • 打开键盘会导致有状态小部件重新初始化

    我在 Stable 分支中使用 Flutter 1 2 1 为了说明我的问题 假设我有页面 A 和 B A 使用以下命令导航到 BNavigator pushB 使用以下命令导航回 ANavigator pop 两者都是有状态的小部件 当我
  • Flutter 中的 Android 许可证

    4 天前一切正常 我进行了更新 许可证停止通过 我到目前为止所做的事情 检查了工具过时的东西 gt 不起作用 flutter doctor android licenses gt 不起作用 sdkmanager licenses gt 不起
  • 颤振预览图标在代码完成时显示损坏的资源图像

    当我第一次安装 flutter 和 dart 扩展时 图标预览工作正常 但是当我在没有 wi fi 的环境中开发时 图标预览损坏了 不确定这是问题所在 我尝试重新安装所有与 flutter 和 dart 相关的扩展 但问题仍然存在 如果有任
  • Android Gradle 问题 - Flutter / Dart

    我的 Gradle 同步有问题 我使用 IntelliJ 和 Android Studio 构建 Flutter Dart 应用程序 我添加了 2 个新的依赖项 现在 Gradle 出现了问题 在 Android Studio 中一切正常
  • NestedScrollView 与 ListView 中的粘性选项卡

    布局按预期工作 但以下情况除外 当我滚动一页时 第二页也会滚动 没有那么多 但足以掩盖第一个项目 我可以想象它与 NestedScrollView 有关 但我不知道如何继续 import package flutter material d
  • dart javascript 编译器 (dart2js) 如何工作?

    Dart 在其自己的 Dart VM 中运行 但您可以将其编译为现代优化的 JavaScript 但这是如何运作的呢 网上有任何文章或论文解释该过程吗 我想知道这是否是一个简单直接的元素与元素匹配 仅耗时开发 处理 或者 Dart 的某些元
  • 如何更改 ElevatedButton 颜色或阴影 Flutter

    我当时用的是RaisedButton直到 Flutter 弃用了它 我们不能再使用它了 有一个建议说 使用ElevatedButton相反 所以我尝试使用它 但我看不到类似的属性color elevation focusColor etc
  • Flutter如何在BottomNavigationBar中添加边距或填充

    我正在尝试制作底部导航栏 但在屏幕上左右填充 现在 我用容器包裹 BottomNavigationBar 并在其中添加填充 问题是 BottomNavigationBar 默认背景仍然包裹所有图层 所以我们可以删除那里的背景颜色吗 Goal
  • Flutter Spotify Api 身份验证

    我需要在使用 Spotify api 的 Flutter 应用程序中对用户进行身份验证 我使用 flutter web auth 打开 WebView 并让用户在那里登录 我无法返回应用程序 在 Spotify 仪表板中 我将回调 Uri
  • 如何在 Flutter Provider 中删除 StreamController 中的数据?

    我正在使用provider来构建我的应用程序 因此数据被添加到StreamController中 每次刷新我的应用程序时 它都会调用API 然后将数据推送到StreamController 问题是如何在替换之前删除数据新的那一个 contr
  • 如何将额外的文本添加到颤振谷歌地图自定义标记中?

    问题是如何将自定义谷歌地图标记上的文本重叠与代表车辆登记号的文本融合在一起 我尝试使用此方法将文本叠加在图标上 生成器 上下文 gt 但根本不被认可 class MapsDemo extends StatefulWidget overrid
  • 如何在Flutter中使用多个ChangeNotifierProvider?

    我最近开始使用provider对于我的状态管理 我知道如何一次使用一个 class Home extends StatelessWidget override Widget build BuildContext context return
  • flutter:动画过渡到命名路线

    当我使用Navigator pushNamed context someRoute 有一个最小的动画 从屏幕底部沿着新路线滑动 在 Android 上 在 iOS 上可能看起来不同 如何向此过渡添加自定义动画 I found 本文 http
  • 配置根项目“firebase_auth”时出现问题

    my error 我无法构建 apk 发布文件 我完成了应用程序一段时间 没有出现错误 几天后 我在构建应用程序时收到此错误 请告诉我如何摆脱它 我尝试了 4 个小时 什么也没得到 FAILURE Build failed with an
  • Flutter:将字符串转换为 Map

    我正在使用 SQFlite 在本地存储数据 我有一个表 其中有一个名为 json 的字段 该字段的类型为 TEXT 并存储转换为字符串的 json 例如 name Eduardo Age 23 性别男 到目前为止 一切正常 但随后我需要从数
  • 在 dart 中使用括号表示法访问对象的属性

    我尝试执行以下操作 var properties height width for var prop in properties div style prop otherdiv style prop 但是 dart 似乎不接受这种括号表示法
  • 如何实现类似预编译指令的功能

    我正在开发一个 Angular 应用程序 建议对生产中运行的许多东西使用生成的代码 即模板缓存 表达式缓存和静态 DI 注入器 目前没有在不同构建配置之间切换的好方法 因此我使用推荐的模式here https github com angu
  • 在 Flutter 中显示 iOS 的 PDF 内联文件

    我正在 flutter 中专门为 iOS 开发一个应用程序 现阶段 我需要向其中添加 PDF 文件 问题是 flutter 没有原生的方式来显示 PDF 文件 据我研究 由此tread https github com flutter fl

随机推荐

  • Linux基础笔记18

    fdisk 分区工具 fdisk 这个古老的软件并不认识 GPT 所以 fdisk 只支持 MBR 的分区模式 且磁盘小于2T 大于了就不能使用 fdisk 进行分区了 新磁盘的分区 一块新加的磁盘的分区方式 检查系统中需要分区的磁盘 fd
  • Vue:Vue动画效果全解析

    Vue中的CSS动画原理 当使用transition 标签包裹标签时 Vue会自动分析其css样式 从而构建动画流程 下图中的点的开头到结尾即为一个动画流程 当一个动画流程执行时 内部被transition 标签包裹的标签瞬间增加两个fad
  • 深度之眼Paper带读笔记NLP.12:层次化attention网络.Baseline.09

    文章目录 前言 第一课 论文导读 文本分类 文本挖掘 数据类型 文本分类 相关技术 基于深度学习的文本分类 baseline涉及的三篇TC的论文 分层注意网络 前期知识储备 第二课论文精读 论文背景 论文整体框架 论文标题 层次注意力网络
  • Postman的高级用法一:重新认识postman核心模块

    本请求示例来自于免费天气API 实况天气接口API开发指南 未来一天天气预报api 天气API 关于Postman的核心模块 全局变量 请求接口 请求体 预处理脚本 测试用例模块 测试者可以针对请求响应做测试 编写测试用例 请求响应 测试用
  • webpack基础配置

    直接上代码 const path require path 为html文件中引入的外部资源如script link动态添加每次compile后的hash 防止引用缓存的外部文件问题 可以生成创建html入口文件 比如单页面可以生成一个htm
  • MYSQL数据库(七)MySQL架构和性能优化

    成功不易 加倍努力 MySQL架构和性能优化 4 1 存储引擎 4 1 1 MyISAM存储引擎 4 1 2 InnoDB引擎 4 1 3 其它存储引擎 4 1 4 管理存储引擎 4 2 MySQL中的系统数据库 4 3 服务器配置和状态
  • 数据结构与算法(二):线性表

    一 基本概念 二 顺序表 三 链表 1 单向链表 2 单向循环链表 3 双向链表 4 静态链表 上一篇 数据结构与算法 一 概述 中介绍了数据结构的一些基本概念 并分别举例说明了算法的时间复杂度和空间复杂度的求解方法 这一篇主要介绍线性表
  • linux中用conda安装大于3.6版本的R

    最开始我想安装一个r 用下面这个指令看了看发现最新版本竟然只有3 6 所以就想安装新版本的r conda search r base 如果想安装新版本的R的话 就不能同conda的默认安装渠道 所以我们首先添加一个渠道 conda conf
  • 测试类型分类

    测试类型 按方向 功能测试 性能测试 安全测试 兼容性测试 安装测试等 按阶段 单元测试 集成测试 系统测试 验收测试 按测试技术 黑盒测试 白盒测试 灰盒测试 按是否运行 静态测试 动态测试 其他 手工测试 自动化测试 冒烟测试 回归测试
  • 如何优雅的快速下载谷歌云盘的大文件 (一)

    一 注册MultCloud 官网地址 不让放网址 注册好了之后要在邮箱收一个激活链接 然后就可以登陆网页版了 二 加入云盘 点击云管理器 点击添加云盘 我们以从谷歌 百度作为示例 由于BaiDu云盘的限制 只能操作 我的应用数据 gt li
  • uni-app从入门到实战

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 uni app是啥 uni app是一个使用vue js来开发所有前端应用的框架 开发者开发一套代码可以发布到os 安卓 h5等各种小程序 u
  • notepad++ 文本文件内容丢失恢复

    今天用着notepad 不知道怎的 突然就崩溃了 然后我下次打开的时候弹了个框 我按了OK之后 里面所有的内容都不见了 网上百度了半天 总结如下 在如下目录下有notepad 会自动保存的文件 C Users Administrator A
  • mysql编码设置

    mysql 创建 数据库时指定编码很重要 很多开发者都使用了默认编码 乱码问题可是防不胜防 制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题 网页数据一般采用UTF8编码 而数据库默认为latin 我们可以通过修改数据库默认编码方式
  • spring-mvc Restful风格

    Restful风格 概念 Restful就是一个资源定位及资源操作的风格 不是标准也不是协议 只是一种风格 基于这个风格设计的软件可以更简洁 更有层次 更易于实现缓存等机制 对比 之前controller类的写法 resource文件里存在
  • 创建conda环境配置出现conda env create -f environment.yml报错解决办法

    解决gitub项目conda创建环境environment yml出现的Solving environment failed 和 ResolvePackageNotFound错误的解决办法记录 问题 创建conda环境配置输入 conda
  • unity水特效与标准资源包的下载导入

    由于本个实例需要使用unity的标准资源包 一 方法一 1 进入unity官网 https unity cn 2 点击页面的Beta版本 3 找到对应自己版本下载即可 方法二 在unity中的商店中搜索 Standard Asset下载导入
  • 西门子PLC常用通信协议以及常用协议的区别(一)

    RS232 是硬件接口 描述 是目前最常用的串行通信接口 RS232 C只是表示RS232的版本 简称都是一样的 特性 标准接口采用9针或者25针D型接口 常用的一般是9针接口 因为大部分连接不需要使用对方的传送控制信号 只需要三条线 即发
  • 2020Unity中文项目用Vs2019打开脚本后一直Importing assets

    unity2018就不会有这个问题 而且我的External Script Editor 都设置的没有问题 新建一个项目中文名 在不用vs2019打开脚本之间都不会有这个进度条 一打开后就会有 高级编码设置的Unicode8 也不起作用了
  • 嘉立创PCB CAM软件

    概述 在PCB CAM软件中 Genesis2000 UCAM CAM350等国外软件占了大壁江山 其中的Genesis2000更是占了绝对份额 而中国却没有一款成熟可用的PCB CAM工业软件 根据公开资料显示 中国是PCB的制造大国 2
  • 快速学习Flutter

    文章目录 写在前面 Flutter官网 Flutter基本知识 Flutter 的特性 Flutter Windows环境搭建 查看文档时有几点注意 1 中国镜像地址 2 搭建 Android 开发环境 3 Flutter SDK Flut