技术基础
- 语法 主要是用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
- 路由管理 :这跟 Web 开发中单页应用的 Route 概念意义是相同的。使用命名路由,首先注册路由表,再通过路由名打开新路由。路由可以传参,通过arguments。
如何提供权限控制(登录权限):
提供一个onGenerateRoute
回调,然后在该回调中进行统一的权限控制