如何解决为什么我在使用 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 举报,一经查实,本站将立刻删除。