思路
- 创建顶层状态类:定义一个包含所有子状态的顶层状态类,例如
AppState
,它包含用户信息、购物车、商品推荐等子状态。
- 使用
MultiProvider
:在应用的顶层使用 MultiProvider
,将每个子状态管理模块的 ChangeNotifierProvider
组合在一起。这样可以统一管理状态,并且避免重复的状态监听。
- 优化更新策略:对于每个子状态的更新,确保只通知依赖该子状态的组件,避免不必要的重建。这可以通过在
ChangeNotifier
中精细控制 notifyListeners
的调用时机来实现。
关键代码实现
- 定义顶层状态类
class UserInfo {
// 用户信息相关属性和方法
}
class Cart {
// 购物车相关属性和方法
}
class ProductRecommendation {
// 商品推荐相关属性和方法
}
class AppState with ChangeNotifier {
UserInfo _userInfo;
Cart _cart;
ProductRecommendation _productRecommendation;
UserInfo get userInfo => _userInfo;
Cart get cart => _cart;
ProductRecommendation get productRecommendation => _productRecommendation;
void updateUserInfo(UserInfo newUserInfo) {
_userInfo = newUserInfo;
notifyListeners();
}
void updateCart(Cart newCart) {
_cart = newCart;
notifyListeners();
}
void updateProductRecommendation(ProductRecommendation newRecommendation) {
_productRecommendation = newRecommendation;
notifyListeners();
}
}
- 在应用顶层使用
MultiProvider
void main() {
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider<AppState>(
create: (context) => AppState(),
),
// 如果每个子模块之前有自己独立的状态管理,也可以保留,不过需要调整为基于顶层状态的操作
// ChangeNotifierProvider<UserInfo>(
// create: (context) => UserInfo(),
// ),
// ChangeNotifierProvider<Cart>(
// create: (context) => Cart(),
// ),
// ChangeNotifierProvider<ProductRecommendation>(
// create: (context) => ProductRecommendation(),
// ),
],
child: MyApp(),
),
);
}
- 在组件中使用合并后的状态
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final appState = Provider.of<AppState>(context);
return Scaffold(
body: Column(
children: [
// 使用用户信息
Text('User: ${appState.userInfo?.toString()}'),
// 使用购物车信息
Text('Cart items: ${appState.cart?.items.length.toString()}'),
// 使用商品推荐信息
Text('Recommended product: ${appState.productRecommendation?.productName}'),
],
),
);
}
}