返回

Redux 离线数据存储秘籍:搞定购物清单不在话下!

Android

亲爱的小伙伴们,大家好,欢迎来到Flutter入门与实战(六十一)之Redux 之利用中间件完成离线存储购物清单!

Redux作为一款流行的状态管理工具,让我们得以以一种清晰、可预测的方式管理应用程序的状态,从而简化了开发。中间件的概念是Redux的一个强大补充,允许我们在中间拦截并处理行为的派遣过程。而StoreBuilder是Redux提供的一个组件,可以帮助我们访问Redux的状态,以及在状态更新时执行一些操作。

好了,话不多说,让我们马上动手,来利用Redux的中间件和StoreBuilder的生命周期函数,构建离线存储购物清单的强大功能吧!

首先,我们在redux/actions.dart中创建一个名为SAVE_OFFLINE_CART_DATA的动作:

export const saveOfflineCartData = createAction(
  SAVE_OFFLINE_CART_DATA,
  (List<Item> items) => items,
);

接着,在redux/middleware/save_offline_cart_data.dart中创建一个名为saveOfflineCartData的中间件:

class SaveOfflineCartDataMiddleware
    extends StoreEnhancerMiddlewareWithOptions<AppState> {
  @override
  void call(Store<AppState> store, dynamic action, NextDispatcher next) {
    if (action is SaveOfflineCartDataAction) {
      final items = action.items;
      final json = jsonEncode(items);
      StorageManager.writeData(json, kOfflineCartDataKey);
    }
    next(action);
  }
}

紧接着,在redux/store.dart中创建名为configureOfflineCartDataMiddleware的函数:

List<Middleware<AppState>> configureOfflineCartDataMiddleware() {
  return [
    SaveOfflineCartDataMiddleware(),
  ];
}

然后,在main.dart中导入并使用该中间件:

final store = Store<AppState>(
  reducer,
  initialState,
  compose(
    applyMiddleware(
      configureOfflineCartDataMiddleware(),
    ),
  ),
);

最后,在我们的购物清单页面中使用StoreBuilder来读取离线数据:

@override
  Widget build(BuildContext context) {
    return StoreBuilder<AppState>(
      onInit: (store) {
        final String? json = StorageManager.readData(kOfflineCartDataKey);
        if (json != null) {
          final items = jsonDecode(json).map((e) => Item.fromJson(e)).toList();
          store.dispatch(saveOfflineCartData(items));
        }
      },
      builder: (context, store, child) {
        final cartItems = store.state.cart.items;
        return Container();
      },
    );
  }

至此,我们已经成功地使用Redux的中间件和StoreBuilder的生命周期函数,完成了离线存储购物清单的功能。希望本文对大家有所帮助,欢迎持续关注Flutter入门与实战系列,让我们携手探索Flutter开发的更多奥秘!