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.手势处理:点击、长按、拖动、双击、
技术基础
- 语法 主要是用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依赖包。
- 声明式语法
就是层层嵌套,里面有各种属性,传各种值,也可以自定义widget。
- future :表示异步操作结果的一种抽象
sync:异步函数的标志
await :等待
async
: 声明该函数是一个异步函数,允许在函数体内使用 await
关键字来等待异步操作的完成。
- 状态管理:
- 自己管理自己 StatefulWidget
- 父管理子 继承
StatelessWidget
类,因为所有状态都由其父组件处理。当检测到事件时,它会通知父组件 - 混合管理 现在使用riverpod
- 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小组件、