fair_provider

Last updated:

0 purchases

fair_provider Image
fair_provider Images
Add to Cart

Description:

fair provider

fair-provider 是为了丰富 fair 的状态管理能力,以 provider 原理进行封装的sdk。使用其可以以类似 provider 的用法在 fair 页面中进行状态管理。
目前对 provider 中部分组件进行了适配支持,可以满足基本场景的使用,核心组件对应关系如下:

ChangeNotifierProvider => FairChangeNotifierProvider
Consumer => FairConsumer
Selector => FairSelector
ChangeNotifier => FairChangeNotifier

快速接入 #
pub添加依赖
dependencies:
fair_provider: ^0.0.1
copied to clipboard
初始化FairApp时传入FairProviderAdapter
///入口函数
void main() {
WidgetsFlutterBinding.ensureInitialized();

FairApp.runApplication(
FairApp(
child: const MyApp(),
),
adapters: [FairProviderAdapter()],
);
}
copied to clipboard
简单使用 #
以计数器举例
首先声明状态管理类,继承 FairChangeNotifier
class CounterModel extends FairChangeNotifier {
int count = 0;
}
copied to clipboard
创建Provider,将初始化数据以json的形式传入
var initialJson = '''
{
"count":22
}
''';

@override
Widget build(BuildContext context) {
return FairChangeNotifierProvider<CounterModel>(
initialJson: initialJson,
child: ...
);
}
copied to clipboard
使用 FairConsumer/FairSelector 配合语法糖来观察状态变更,注意由于 fair DSL布局的特性,匿名函数是不支持的(后续计划支持优化),所以其中的builder函数还需要语法糖来包装下。最后从自定义的 FairChangeNotifier 状态管理对象中取值同样也需要借助语法糖来完成,目前已经提供了大量的取值语法糖,可以满足大多数场景的使用,详细说明可参考进阶使用部分。
FairConsumer<CounterModel>(
builder: SugarProvider.consumerBuilder(
(context, value, child) =>
Text(SugarProvider.readAsString(value, 'count'))),
)
copied to clipboard
FairSelector<CounterModel, int>(
builder: SugarProvider.selectorBuilder(
(context, value, child) =>
Text(SugarProvider.anyToString(value))),
selector: SugarProvider.selector((context, value) =>
SugarProvider.readInt(value, 'count'))),
copied to clipboard
编写事件处理函数,更新状态
注意read函数的泛型即是状态管理类的类型,参数需要手动输入该类的字符串
void _incrementCounter(FairContext context) {
var counterModel = context.read<CounterModel>("CounterModel");
counterModel.count++;
counterModel.notify();
}
copied to clipboard
这里需要使用经过特殊处理的 FairContext,FairContext 的构造需要 FairContextBuilder 配合语法糖 SugarProvider.widgetBuilder 来获取
FairContextBuilder(
builder: SugarProvider.widgetBuilder((context) => FloatingActionButton(
onPressed: () {
_incrementCounter(context);
},
tooltip: 'Increment',
child: const Icon(Icons.add),
)),
),
copied to clipboard
使用说明 #
1. FairChangeNotifier的使用限制 #
注意 FairChangeNotifier 的定义有一些限制,这里以 example 中的ExampleModel举例
class ExampleModel extends FairChangeNotifier {
String? stringField;
int intField = 1;
double? doubleField;
bool boolField = false;
List? listField;
ExampleInnerModel? innerModel;
}

class ExampleInnerModel {
bool? innerBoolField;
}
copied to clipboard

支持的类型为基本类型和数组

int
double
String
bool
List


目前只支持基本类型或者简单的嵌套对象(内部也是基本类型),不支持自定义函数(Function)
当需要通知状态更新时需要手动调用notify/notifyListeners
暂时不支持定义在bean结尾的包中

2. 在布局中取值需使用语法糖 #
由于 fair 的布局动态化特性,在构建布局时不支持随意编写取值代码,这里需要借助 SugarProvider 中的一系列语法糖来完成
语法糖提供了基本类型和数组的取值api,具体使用细节可以参考example中的 基本使用示例
///一个读取字符串的例子
FairConsumer<ExampleModel>(
builder: SugarProvider.consumerBuilder(
(context, value, child) => Text(SugarProvider.readString(value, 'stringField'))),
),
copied to clipboard

readString 使用key从model中读取String类型的值
readAsString 使用key从model中读取并强转为String类型的值
readInt 使用key从model中读取Int类型的值
readDouble 使用key从model中读取Double类型的值
readBool 使用key从model中读取布尔型的值
readList 使用key从model中读取数组类型的值
readDynamic 使用key从model中读取任意类型的值

还支持表达式取值,使用规则如 a.b.c,以上面的ExampleModel为例,如果想读取成员 innerModel 中的 innerBoolField 字段,使用表达式取值可以这么写
FairSelector<ExampleModel, String>(
builder: SugarProvider.selectorBuilder((context, value, child) => Text(value)),
selector: SugarProvider.selector((context, value) =>SugarProvider.evaluationAsString(value, 'innerModel.innerBoolField'))
)
copied to clipboard

evaluationToString 使用表达式从model中读取String类型的值
evaluationAsString 使用表达式从model中读取并强转为String类型的值
evaluationToInt 使用表达式从model中读取Int类型的值
evaluationToDouble 使用表达式从model中读取Double类型的值
evaluationToBool 使用表达式从model中读取布尔型的值
evaluationToList 使用表达式从model中读取数组类型的值
evaluationToDynamic 使用表达式从model中读取任意类型的值

更多示例请见 example #

License:

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Files In This Product:

Customer Reviews

There are no reviews.