Обновить анимированный контейнер в listView.builder - PullRequest
0 голосов
/ 21 марта 2020

Как обновить анимированный контейнер с помощью longPress, который находится под построителем списка

widget.meetingdetails.forEach((tasks) {
  if (tasks['task'] == 'Meeting') {
    _meetinglist.add(GestureDetector(
      onLongPress: () {
        setState(() {
          heightChange = heightChange == 130 ? 150 : 130;

        });
      },
      child: AnimatedContainer(
        duration: new Duration(milliseconds: 500),
        height: heightChange,
        padding: EdgeInsets.symmetric(horizontal: 30, vertical: 10),)).......

Код выше - это способ создания списка, а код ниже - способ его реализации в listView.builder

return ListView.builder(
  itemCount: _meetinglist.length,
  itemBuilder: (BuildContext context, int index) => _meetinglist[index],
  padding: EdgeInsets.only(bottom: 60), physics: BouncingScrollPhysics(),

);

Здесь, когда я долго нажимаю на контейнер, все элементы в списке обновляются. Для обновления мне нужен только нажатый контейнер

The container before longpress Container after longpress

1 Ответ

1 голос
/ 21 марта 2020

Я думаю, что ваша переменная высоты является частью этого состояния, которое используется всеми виджетами в переменной _meetingList. Вот почему все они обновляются. Попробуйте извлечь GestureDetector виджет в свой собственный виджет с сохранением состояния и обработать высоту индивидуально в соответствующем виджете.

Доступен живой дартпад здесь .

пример

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  final List<MeetingCard> _meetingCards = [
          MeetingCard(title: 'standup meeitng'),
          MeetingCard(title: 'weekely meeting'),          
          MeetingCard(title: 'Status Meeting'),
          MeetingCard(title: 'Another meeting'),

  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Adjustable height card.',
      home: ListView.builder(
        itemCount: _meetingCards.length,
        itemBuilder: (context, index){
          return _meetingCards[index];
        }
      ),
    );
  }
}

// Define a custom Form widget.
class MeetingCard extends StatefulWidget {
  final String title;

  MeetingCard({this.title});
  @override
  _MeetingCardState createState() => _MeetingCardState();
}

// Define a corresponding State class.
class _MeetingCardState extends State<MeetingCard> {

  // this height is specific to this widget.
  double height = 130;

  @override
  Widget build(context) {
    return GestureDetector(
      onLongPress: (){
        setState((){
          height = height == 130 ? 150 : 130;
        });
      },
      child: AnimatedContainer(
        duration: new Duration(milliseconds: 500),
        height: height,
        child: Card(child: Center(child: Text(widget.title),),),
      ),
    );
  }
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...