【发布时间】:2020-12-12 10:00:56
【问题描述】:
我正在 Flutter 中制作列表视图。我想在长按项目时更新项目的属性。
以下是完整的代码:
// main.dart
import 'package:LearnFlutter/MyList.dart';
import 'package:flutter/material.dart';
import 'MyList.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'List Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'My list demo'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: MyList(),
);
}
}
// MyList.dart
import 'package:flutter/material.dart';
class Item {
Item(String name, bool selected, Color color) {
_name = name;
_selected = selected;
_color = color;
}
String _name;
bool _selected;
Color _color;
String getName() {
return _name;
}
bool isSelected() {
return _selected;
}
void toggleSelected() {
_selected = !_selected;
}
void setColor(Color color) {
_color = color;
}
Color getColor() {
return _color;
}
}
class MyList extends StatefulWidget {
@override
_CardyState createState() => new _CardyState();
}
class _CardyState extends State<MyList> {
@override
Widget build(BuildContext context) {
var itemsList = [
Item('My item1', false, Colors.grey[200]),
Item('My item2', false, Colors.grey[200]),
Item('My item3', false, Colors.grey[200]),
];
return ListView.builder(
itemCount: itemsList.length,
itemBuilder: (context, index) {
return Card(
child: ListTile(
leading: Icon(Icons.train),
title: Text(itemsList[index].getName()),
trailing: Icon(Icons.keyboard_arrow_right),
tileColor: itemsList[index].getColor(),
selected: itemsList[index].isSelected(),
onLongPress: () {
toggleSelection(itemsList[index]);
},
),
);
},
);
}
void toggleSelection(Item item) {
print(item.getName() + ' long pressed');
setState(() {
item.toggleSelected();
if (item.isSelected()) {
item.setColor(Colors.blue[200]);
} else {
item.setColor(Colors.grey[200]);
}
});
}
}
问题:
在上面的代码中,toggleSelection 在长按事件中被调用。但是该项目的颜色不会更新。我做错了什么?
【问题讨论】:
-
将
MyList变成stateless widget保留它应该在HomePage中显示的所有数据,HomePage是一个有状态的小部件,包括有关所选项目的数据。然后将数据传入MyList -
感谢您的浏览。你能用代码回答这个问题吗?无论如何,我正在尝试您的解决方案,但使用一些代码或一些伪代码的答案会更清楚。