Flutter帮我做了什么:

1.一套material design 风格的ui框架,包括基础组件,如文本及样式,按钮,输入框及表单等等

2.布局组件:参考web开发中布局,约束与限制:取父子中相应数值最大的。

线性布局Row和Column,

弹性布局Flex,流式布局Wrap、Flow 对比线性布局,当超过屏幕显示范围时,自动折行就是流式布局,

层叠布局Stack Positioned 使用层叠布局时,搭配手势,那种虚拟组件的处理方式,不要将手势同时放在一个Stack里边,可以套在不同的层级。Positioned使用时,最好四个参数都给。给出上下左右的距离,自然而然宽高就确定。

Align 可以调整子组件的位置,也就是child的位置

3.容器组件:Padding 对比web开发 Container

4.可滚动组件:ListView GridView

5.手势处理:点击、长按、拖动、双击、

技术基础

  1. 语法 主要是用dart,dart就是js和java的组合体,变量的声明,类,继承,构造函数,set get方法,以 _ 开头的变量通常表示为私有变量。这意味着这个变量或者方法只能在当前 Dart 文件中访问,而不能被其他文件访问。一些集合包 如map、list、set等等会用到的数据结构

2.包管理:配置文件pubspec.yaml 对比Java中的maven, Vue中的package.json 。主要作用就是重用代码。

  • dependencies:应用或包依赖的其他包或插件。
  • dev_dependencies:开发环境依赖的工具包(而不是flutter应用本身依赖的包)。
  • flutter:flutter相关的配置选项。

在pub仓库找包,自己开发包,可以直接通过path引入本地包,可以通过git写url依赖包。

  1. 声明式语法

就是层层嵌套,里面有各种属性,传各种值,也可以自定义widget。

  1. future :表示异步操作结果的一种抽象

sync:异步函数的标志

await :等待

async: 声明该函数是一个异步函数,允许在函数体内使用 await 关键字来等待异步操作的完成。

  1. 状态管理:
  • 自己管理自己 StatefulWidget
  • 父管理子 继承StatelessWidget类,因为所有状态都由其父组件处理。当检测到事件时,它会通知父组件
  • 混合管理 现在使用riverpod
  1. riverpod基础:

在Widget树中,获取ref的最常用方法是将StatelessWidget 替换为 ConsumerWidget

ConsumerStatefulWidget + ConsumerState

“ref”有三种主要用法:

  • 获取provider的值并监听更改,这样当该值发生更改时, 将重新构建订阅该值的widget或provider。 这是使用 ref.watch 完成的
  • 在provider上添加监听器,以执行诸如导航到新页面或每当provider更改时显示模态框等操作。 这是使用 ref.listen 完成的。
  • 在忽略更改的情况下获取provider的值。 当我们在诸如“on click”之类的事件中需要provider的值时很有用。 这是使用 ref.read 完成的。

通俗的总结:watch 监听他,变化时重新渲染 listen 也是监听,变化时执行自己自定义的函数

使用read读取值 并改变值

最好的做法

@riverpod
 class Counter extends _$Counter {
   @override
   int build() => 0;
   void increment() => state = state + 1;
 }
 
 Widget build(BuildContext context, WidgetRef ref) {
   Counter counter = ref.watch(counterProvider.notifier);
   return ElevatedButton(
     onPressed: () => counter.increment(),
     child: const Text('button'),
   );
 }

封装一个方法,watch得到这个类,通过这个类调用他的方法

watch 的时候可以使用过滤:

abstract class User {
   String get name;
   int get age;
 }
Widget build(BuildContext context, WidgetRef ref) {
   String name = ref.watch(userProvider.select((user) => user.name));
   return Text(name);
 }

官方参考文档:https://riverpod.dev/zh-Hans/docs/concepts/combining_providers

目前官方支持使用@riverpod注解让他成为一个Provider。需要加一个 riverpod-annotation

技术-解决问题

1.要对需求做功课,有一个大局观。

2.有了设计图,布局自然而然会有个大概,

当界面比较复杂时,或者需要复用多个组件时,考虑单独抽出来一个widget小组件、