Я все еще новичок в трепетании.Я работаю над приложением, в котором есть автономная база данных.Я показываю данные из базы данных в виде списка.в ListTile есть кнопка избранного, которая должна изменить значок и обновить избранный столбец базы данных с 1 или 0 на указанном идентификаторе элемента в зависимости от того, что было раньше.
В моей реализации это меняет значок для всехэлементы списка, но он обновляет столбец базы данных, но изменение значка не работает.
class NamesScreen extends StatefulWidget {
final String gender, alphabet;
NamesScreen(this.gender, this.alphabet);
@override
_NamesScreenState createState() => _NamesScreenState(gender, alphabet);
}
class _NamesScreenState extends State<NamesScreen> {
final String gender, alphabet;
bool fav = false;
IconData iconData = Icons.favorite_border;
_NamesScreenState(this.gender, this.alphabet);
DatabaseHelper databaseHelper = DatabaseHelper();
List<Name> namesList;
int count = 0;
@override
void initState() {
namesList = List<Name>();
getNames(gender, alphabet);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Baby Names")),
body: ListView.builder(
itemCount: namesList.length,
itemBuilder: (BuildContext ctx, int index) {
return getNameTile(namesList[index]);
},
),
);
}
Widget getNameTile(Name name) {
checkFav(context, name);
return Column(
children: <Widget>[
ListTile(
leading: Image.asset('assets/boy.png'),
subtitle: Text(name.meaning),
title: Text(name.name),
trailing: Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
InkWell(
child: Icon(
iconData,
color: Colors.red,
),
onTap: () {
setState(() {
_onClickFav(context, name);
if (fav) {
iconData = Icons.favorite;
} else {
iconData = Icons.favorite_border;
}
});
},
),
Icon(Icons.share)
],
),
),
Container(
height: 1.0,
color: Colors.grey,
)
],
);
}
Future _onClickFav(BuildContext context, Name name) async {
final exists = await databaseHelper.exists(name);
if (exists) {
databaseHelper.update(name.id, 0);
fav = false;
} else {
databaseHelper.update(name.id, 1);
fav = true;
}
}
Future checkFav(BuildContext context, Name name) async {
final exists = await databaseHelper.exists(name);
if (exists) {
fav = false;
iconData = Icons.favorite_border;
} else {
fav = true;
iconData = Icons.favorite;
}
}
void getNames(String gen, String ch) {
final Future<Database> dbFuture = databaseHelper.initDatabase();
dbFuture.then((database) {
Future<List<Name>> nameListFuture = databaseHelper.getNames(gen, ch);
nameListFuture.then((namesL) {
setState(() {
this.namesList = namesL;
this.count = namesL.length;
});
});
});
}
}
Код DatabaseHelper
update(int id, int value) async {
Database db = await this.database;
return await db
.rawQuery('UPDATE $factsTable SET fav = $value WHERE id = $id');
}
bool fav = false;
Future<Name> getName(int id) async {
var dbClient = await database;
final result = await dbClient.rawQuery(
'SELECT * FROM $factsTable WHERE ${Constants.colId} = $id AND ${Constants.colFav} = 1');
if (result.length > 0) {
return new Name.fromMapObject(result.first);
}
return null;
}
Future<bool> exists(Name name) async {
Name n = await getName(name.id);
var exists = n != null;
return exists;
}
Я тестировал этот код с локальным списком избранных элементов, он работает таким образом, но не с базой данных.