Flutter与提供者共享首选项

c9qzyr3d  于 2023-03-13  发布在  Flutter
关注(0)|答案(1)|浏览(131)

我正在使用provider将产品信息拉到名为cart page的statefulwidget表中。

Row(
  mainAxisAlignment: MainAxisAlignment.start,
  children: [
    IconButton(
      onPressed: () {
        Provider.of<Count>(context,listen: false)
        .addItem(
          items[index].name,
          1,
          items[index].price,
          items[index].imagePath);
      },
      icon: Icon(Icons.add),
    ),
    Text(items[index].count.toString()),
    IconButton(
      onPressed: () {
        Provider.of<Count>(context, listen: false)
        .removeItem(items[index]);
      },
      icon: Icon(Icons.remove),
    ),
  ],
),

我安装shared_preferences包是为了防止这些产品在程序关闭和打开后丢失,当提升按钮被按下时,我用_saveorder方法保存出现在页面上的产品。

onPressed: () {
                _saveOrder(items);
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => HomePage()),
                );
                // onPressed event
              },

保存订单代码=

final prefs = await SharedPreferences.getInstance();
    final orders = prefs.getStringList('orders') ?? [];

    final orderDetails = cartItems.map((item) {
      return '${item.name},${item.count},${item.price},${item.imagePath}';
    }).join(';');

    orders.add(orderDetails);
    await prefs.setStringList('orders', orders);
  }

当应用程序再次打开时,我希望使用loadorders方法将注册到savedorder的产品信息初始化,但这不起作用

Count countObject = Count();
  @override
  void initState() {
    super.initState();
    _loadOrders();
  }

  Future<void> _loadOrders() async {
    final prefs = await SharedPreferences.getInstance();
    final orders = prefs.getStringList('orders') ?? [];

    List<CartItem> cartItems = [];
    for (String order in orders) {
      List<String> orderDetails = order.split(',');
      cartItems.add(CartItem(
        name: orderDetails[0],
        count: int.parse(orderDetails[1]),
        price: double.parse(orderDetails[2]),
        imagePath: orderDetails[3],
      ));
    }
0lvr5msh

0lvr5msh1#

SharedPreferences获取数据是一个异步操作,可以使用FuturesFutureBuilder来处理。
可以按如下方式使用此模式:

Future<List<CartItem>> _loadOrders() async {
    final prefs = await SharedPreferences.getInstance();
    final orders = prefs.getStringList('orders') ?? [];
    List<CartItem> cartItems = [];
    for (String order in orders) {
      List<String> orderDetails = order.split(',');
      cartItems.add(CartItem(
        name: orderDetails[0],
        count: int.parse(orderDetails[1]),
        price: double.parse(orderDetails[2]),
        imagePath: orderDetails[3],
    ));
    return cartItems; // Make sure to return a value here  
}

将future从这个函数传递给FutureBuilder的一个示例,当future完成时,它会重新构建小部件。

Widget build(BuildContext context) {
    return FutureBuilder(
        future: _loadOrders(),
        builder: (ctx, snapshot) {
          // Checking if future is resolved
          if (snapshot.hasData) {
              var items = snapshot.data as List<CartItem>;
              // ... build your widget as usual here...
          }
    );
}

相关问题