微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我在使用 flutter ChangeNotifierProvider 时遇到内存问题?

如何解决为什么我在使用 flutter ChangeNotifierProvider 时遇到内存问题?

我正在使用 Change Notifier Provider 制作一个购物车应用程序。起初它运行得很快而且很好。但是它占用的内存越多,我使用的就越多。我正在从列表中添加删除清除项目。没什么复杂的。不知道为什么它会这样工作。它正在逐渐放缓。这是 main.dart:

class Main extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => Cart(),child: MaterialApp(
        title: 'Flutter Demo',debugShowCheckedModeBanner: false,theme: ThemeData(
          primarySwatch: swatchColor,primaryColor: primaryColor,accentColor: tertiaryColor,textSelectionTheme: TextSelectionThemeData(
            cursorColor: Colors.black,selectionColor: primaryColor,selectionHandleColor: primaryColor,),initialRoute: '/login',routes: {
          '/home': (context) => Home(),'/login': (context) => Login(),'/tableReview': (context) => TableReview(),'/createOrder': (context) => CreateOrder(),'/orderReview': (context) => OrderReview(),},);
  }
}

这是主要的cart_model.dart

import 'package:counter/data/models/cart_item.dart';
import 'package:Flutter/cupertino.dart';
import 'package:Flutter/foundation.dart';

class Cart extends ChangeNotifier {
  List<Item> cart = [];

  addItemToCart({@required item}) {
    Item newItem = Item(
      id: item.id,price: item.price is int ? item.price : int.parse(item.price),title: item.title,);
    int i = cart.indexWhere((prevIoUsItem) => prevIoUsItem.id == newItem.id);

    if (i > -1) {
      cart[i].count++;
    } else {
      cart.add(newItem);
    }

    notifyListeners();
  }

  removeItemFromCart({@required item}) {
    int index = cart.indexWhere((element) => element.id == item.id);

    if (index > -1) {
      if (cart[index].count > 1) {
        cart[index].count--;
      } else {
        cart.removeWhere((element) => element.id == item.id);
      }
    }

    notifyListeners();
  }

  clearCart() {
    cart.clear();

    notifyListeners();
  }

  int get totalPrice =>
      cart.fold(0,(total,current) => total + (current.price * current.count));
}

这是 menuitem.dart

class MenuItem extends StatelessWidget {
  final dynamic foodItem;

  MenuItem({@required this.foodItem});

  void _showSecondPage(BuildContext context) {
    Navigator.of(context).push(
      MaterialPageRoute(
        builder: (ctx) => Scaffold(
          backgroundColor: Colors.black45,body: Center(
            child: Hero(
              tag: foodItem.imgPath,child: Image(image: NetworkImage(base_url + foodItem.imgPath)),);
  }

  @override
  Widget build(BuildContext context) {
    int itemIndex = Provider.of<Cart>(context,listen: false)
        .cart
        .indexWhere((item) => item.id == foodItem.id);

    return Container(
      height: 80,padding: EdgeInsets.symmetric(horizontal: 10,vertical: 10),child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,crossAxisAlignment: CrossAxisAlignment.center,children: [
          Row(
            crossAxisAlignment: CrossAxisAlignment.center,children: [
              GestureDetector(
                onTap: () => _showSecondPage(context),child: Hero(
                  tag: foodItem.imgPath,child: CircleAvatar(
                    backgroundImage: NetworkImage(base_url + foodItem.imgPath),SizedBox(
                width: 15,Column(
                crossAxisAlignment: CrossAxisAlignment.start,mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [
                  Text(
                    foodItem.title,style: TextStyle(
                      fontWeight: FontWeight.w700,fontSize: 17,Text('${foodItem.price.toString()} сум'),],)
            ],Container(
            width: 160,child: Row(
              crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.spaceBetween,children: <Widget>[
                IconButton(
                  icon:
                      Icon(Icons.remove,color: Theme.of(context).primaryColor),onpressed: () {
                    Provider.of<Cart>(context,listen: false)
                        .addItemToCart(item: foodItem);
                  },Text(
                  itemIndex > -1
                      ? '${Provider.of<Cart>(context).cart[itemIndex].count}'
                      : '0',style: TextStyle(fontSize: 18),IconButton(
                  icon: Icon(Icons.add,);
  }
}

这是消费者部分:


import 'package:counter/common/socketio.dart';
import 'package:counter/data/models/cart_model.dart';
import 'package:counter/presentation/widgets/empty_cart.dart';
import 'package:Flutter/cupertino.dart';
import 'package:Flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';

class OrderReview extends StatefulWidget {
  @override
  _OrderReviewState createState() => _OrderReviewState();
}

class _OrderReviewState extends State<OrderReview> {
  bool isCommentEnabled = false;
  String guestCount;
  String comment = '';

  final _formKey = GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    final myCart = context.watch<Cart>();

    return Scaffold(
      resizetoAvoidBottomInset: true,appBar: AppBar(
        title: Text('Проверка заказа'),body: Builder(
        builder: (context) {
          if (myCart.cart.length > 0) {
            handleOrderCreate() async {
              SharedPreferences prefs = await SharedPreferences.getInstance();
              String userId = prefs.getString('userId');
              String tableNum = prefs.getString('tableNum');
              String status = 'accepted';

              print('$userId,$tableNum,$status');
              Map orderToCreate = {
                'tableNum': tableNum,'status': 'accepted','userId': userId,'guestCount': guestCount,'comment': comment,'foodList': myCart.cart
              };
              socketIO.emit('createOrder',json.encode(orderToCreate));
              Navigator.of(context).pushNamed('/home');
              Provider.of<Cart>(context,listen: false).clearCart();
            }

            return GestureDetector(
              onTap: () => FocusScope.of(context).requestFocus(new FocusNode()),child: LayoutBuilder(
                builder:
                    (BuildContext context,BoxConstraints viewportConstraints) {
                  return SingleChildScrollView(
                    child: ConstrainedBox(
                      constraints: BoxConstraints(
                        minHeight: viewportConstraints.maxHeight,child: IntrinsicHeight(
                        child: Container(
                          padding: const EdgeInsets.symmetric(
                              horizontal: 8.0,vertical: 8.0),child: Column(
                            crossAxisAlignment: CrossAxisAlignment.stretch,children: [
                              Form(
                                key: _formKey,child: Column(
                                  children: [
                                    Container(
                                      height: 350,decoration: Boxdecoration(
                                          color: Colors.white,borderRadius: BorderRadius.only(
                                              topLeft: Radius.circular(10),topRight: Radius.circular(10),bottomLeft: Radius.circular(10),bottomright: Radius.circular(10)),BoxShadow: [
                                            BoxShadow(
                                              color:
                                                  Colors.grey.withOpacity(0.5),spreadRadius: 5,blurRadius: 7,offset: Offset(0,3),// changes position of shadow
                                            ),]),child: ListView.separated(
                                        itemBuilder:
                                            (BuildContext context,int i) {
                                          return ListTile(
                                            title: Text(myCart.cart[i].title),trailing: Container(
                                              width: 160,child: Row(
                                                crossAxisAlignment:
                                                    CrossAxisAlignment.center,mainAxisAlignment:
                                                    MainAxisAlignment
                                                        .spaceBetween,children: <Widget>[
                                                  IconButton(
                                                    icon: Icon(
                                                      Icons.remove,color: Theme.of(context)
                                                          .primaryColor,onpressed: () {
                                                      Provider.of<Cart>(context,listen: false)
                                                          .removeItemFromCart(
                                                              item: myCart
                                                                  .cart[i]);
                                                    },Text(
                                                    '${myCart.cart[i].count}',style:
                                                        TextStyle(fontSize: 18),IconButton(
                                                    icon: Icon(
                                                      Icons.add,listen: false)
                                                          .addItemToCart(
                                                              item: myCart
                                                                  .cart[i]);
                                                    },);
                                        },separatorBuilder:
                                            (BuildContext context,int) {
                                          return Divider(
                                            height: 2,color: Colors.grey,itemCount: myCart.cart.length,SizedBox(height: 20),Container(
                                      child: TextFormField(
                                        keyboardType: TextInputType.number,decoration: Inputdecoration(
                                          border: OutlineInputBorder(),hintText: 'Количество гостей',onChanged: (newValue) {
                                          setState(() => guestCount = newValue);
                                        },validator: (value) {
                                          if (value == null || value.isEmpty) {
                                            return 'Пожалуйста,введите количество гостей!';
                                          }
                                          return null;
                                        },Container(
                                      child: TextFormField(
                                        onChanged: (newValue) {
                                          setState(() => comment = newValue);
                                        },enabled: isCommentEnabled,hintText:
                                              'Лаваш острый,хот дог без майонеза и т.д.',// labelText: 'Комментарий',maxLines: 2,Row(
                                      children: [
                                        Text('Комментарий'),Switch(
                                          value: isCommentEnabled,onChanged: (bool value) {
                                            setState(() =>
                                                this.isCommentEnabled = value);
                                          },)
                                  ],Row(
                                children: [
                                  Text(
                                    'Общая цена: ',style: TextStyle(
                                      fontSize: 20,fontWeight: FontWeight.w500,SizedBox(width: 20),Text(
                                    '${myCart.totalPrice} сум',Container(
                                height: 50,width: 170,child: ElevatedButton(
                                  style: ButtonStyle(
                                    backgroundColor:
                                        MaterialStateProperty.resolveWith(
                                            (states) =>
                                                Theme.of(context).primaryColor),onpressed: () {
                                    if (_formKey.currentState.validate()) {
                                      handleOrderCreate();
                                    }
                                  },child: Text(
                                    'Отправить',style: TextStyle(
                                        color: Colors.white,fontSize: 18),);
                },);
          } else {
            print('111');
            return EmptyCart();
          }
        },);
  }
}

我的代码有问题吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。