Я создаю приложение во Флаттере, которое должно быть приложением социальной сети, похожим на faceboook. Я реализовал аналогичную кнопку - при нажатии отправляет серверу запрос, а затем в зависимости от кода состояния устанавливает состояние. Моя проблема начинается, когда setState () снова рендерит аватар или создать его заново с нуля (аватар хранится в 64-битной строке). likePress - это будущее, которое отправляет запрос, а затем устанавливает логическое значение isLiked
соответственно. это создание кнопки «Мне нравится»:
buildLikeButton(int ownerId, int postId) {
return RepaintBoundary(
child: FutureBuilder<bool>(
future: getLike(ownerId, postId),
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
IconButton likeButton;
if (snapshot.hasData) {
isLiked = snapshot.data;
likeButton = createLikeButton(ownerId, postId);
} else if (snapshot.hasError) {
isLiked = false;
likeButton = createLikeButton(ownerId, postId);
print('the snapshot has an error ${snapshot.error}');
} else {
isLiked = false;
likeButton = createLikeButton(ownerId, postId);
}
return likeButton;
}));
}
createLikeButton(int ownerId, int postId) {
return IconButton(
icon: returnLikeIcon(isLiked),
color: Theme.of(context).accentColor,
onPressed: () async {
if (this.mounted) {
setState(() {
Future lol = likePress(ownerId, postId).then((onValue) {});
});
}
},
);
}
и создание аватара:
createAvatar(BuildContext context, avatar_base64, int ownerId) {
Uint8List bytes = base64Decode(avatar_base64.split(',').last);
return RepaintBoundary(
child: CircleAvatar(
radius: 25.0,
backgroundImage: MemoryImage(bytes),
backgroundColor: Colors.transparent,
));
}
Виджет, который отображает их вместе, - это виджет Post
, который я создали для этого проекта, и это его функция сборки:
Widget build(BuildContext context) {
return InkWell(
borderRadius: BorderRadius.circular(0.2),
child: Container(
decoration: BoxDecoration(boxShadow: [
BoxShadow(
color: Theme.of(context).primaryColor,
blurRadius: 1.0,
spreadRadius: 1.0, // has the effect of extending the shadow
offset: Offset(
5.0, // horizontal, move right 10
5.0, // vertical, move down 10
),
),
]),
child: Card(
elevation: 10.0,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Flexible(
fit: FlexFit.loose,
child: postInfo(context, time, ownerId)),
Divider(
thickness: 1.0,
height: 10.0,
indent: 10.0,
endIndent: 10.0,
),
postContent(content),
Divider(
thickness: 1.0,
height: 10.0,
indent: 10.0,
endIndent: 10.0,
),
createButtonBar(ownerId, postId),
],
)),
));
}
postInfo
- это просто FutureBuilder, который создает ListTile, который добавляет аватар и имя, а createButtonBar
создает кнопку «Мне нравится». и еще 2 кнопки.
Я хотел бы изменить значок, когда пользователь нажимает кнопку «Мне нравится», но только если сервер ответил правильным кодом состояния и без рендеринга и создания всего виджета Post
поверх еще раз. Спасибо за беспокойство!