Provider状态管理
定义实体类
class GoodsEntity {
late int _id;
late String _name;
late double _price;
late String _url;
late String _mealType;
int get id => _id;
String get name => _name;
double get price => _price;
String get url => _url;
String get mealType => _mealType;
static GoodsEntity fromJson(Map<String, dynamic> json) {
GoodsEntity goods = GoodsEntity();
goods._id = json['id'];
goods._name = json['name'];
goods._price = json['price'];
goods._url = json['url'];
goods._mealType = json['mealType'];
return goods;
}
}
定义模板类继承ChangeNotifier
import 'package:flutter/material.dart';
import 'goods_entity.dart';
class LikeModel with ChangeNotifier {
List<GoodsEntity> _items = [];
List<GoodsEntity> get items => _items;
void add(GoodsEntity goods) {
if (!isInLike(goods)) {
_items.add(goods);
notifyListeners();
}
}
void remove(GoodsEntity goods) {
if (isInLike(goods)) {
_items.remove(goods);
notifyListeners();
}
}
bool isInLike(GoodsEntity goods) {
return _items.any((element) => element.id == goods.id);
}
}
开始使用状态管理
STEP 01 配置和定义
void main() {
runApp(MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => LikeModel()),
],
child: const MyApp(),
));
}
List<GoodsEntity> goods =
Data.map((item) => GoodsEntity.fromJson(item)).toList();
child: Consumer(
builder: (context, value, child) {
GoodsEntity goodsEntity = goods[index];
return Row(
...
Consumer(
builder: (context, value, child) {
bool isInLike = context
.watch<LikeModel>()
.isInLike(goodsEntity);
STEP 02 调用方法和获取属性值
Text(
'¥${goodsEntity.price}',
style: const TextStyle(
fontSize: 14,
color: Colors.red),
),
child: isInLike
? Text('已收藏')
: Text('收藏至礼品库')));
STEP 03 SecondPage跨页状态管理
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
DetailPage(
goodsEntity)));
},
Consumer<LikeModel>(builder: (context, value, child) {
bool isInLike = context.read<LikeModel>().isInLike(goodsEntity);
...
onPressed: isInLike
? () {
var cart = context.read<LikeModel>();
cart.remove(goodsEntity);
}
: () {
var cart = context.read<LikeModel>();
cart.add(goodsEntity);
},
height: 25,
child: Text(
'单价:¥${goodsEntity.price}',
style: TextStyle(fontSize: 16, color: Colors.red),
),
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】