Избавляемся от делителя при использовании onDismissed - PullRequest
0 голосов
/ 30 апреля 2020

Я немного новичок, чтобы трепетать, и мне трудно с этой конкретной c проблемой. У меня есть listview.seperated виджеты, которые я пытаюсь удалить.

return ListView.separated
      (
        separatorBuilder: (context, index) => Divider(),

        padding: const EdgeInsets.all(5.0),

        itemCount: siteName.length + 1,

        itemBuilder: (context, i) {
          if (i != siteName.length) {
            return _buildRow(siteName[i], i);
          }

          else
            return _lastRow();
        }

, поэтому внутри _buildrow я использую onDismissed, который работает, однако, когда я отклоняю его, оператор остается. Любая помощь о том, как именно я могу избавиться от этого?

Widget _buildRow(String pair, int num) {
    final bool isClicked = (clicked == num);

    return Dismissible
      (
        key: Key(pair),
        onDismissed: (direction) {
          setState(() {
            siteName.removeAt(num);
            lines.removeAt(num);
          });
        },

        background: Container
        (
            padding: EdgeInsets.only(right: 10.0),
            alignment: AlignmentDirectional.centerEnd,
            color: Colors.red,
            child: Icon
            (
              Icons.delete,
              color: Colors.white,
            )
        ),

        child: ListTile
        (
            title: Text
            (
              pair,
              style: _biggerFont,
            ),
            trailing: Icon
            (
              isClicked ? Icons.check_circle : Icons.check_circle_outline,
              color: isClicked ? Colors.green : Colors.black,
            ),

            onTap: () {
              setState(() {
                if (isClicked) {
                  clicked = null;
                } else {
                  clicked = num;
                }
              });
            }
        )
    );
  }

1 Ответ

0 голосов
/ 30 апреля 2020

Вы можете скопировать код вставки и выполнить полный код ниже
Вы можете использовать List<bool> clickedList для управления выбранным элементом

фрагмент кода

trailing: Icon(
  clickedList[num]
      ? Icons.check_circle
      : Icons.check_circle_outline,
  color: clickedList[num] ? Colors.green : Colors.black,
),
onTap: () {
  setState(() {
    clickedList[num] = !clickedList[num];
  });
}));

рабочая демонстрация

enter image description here

полный код

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  MyApp({Key key}) : super(key: key);

  @override
  MyAppState createState() {
    return MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  final siteName = List<String>.generate(20, (i) => "Item ${i + 1}");
  List<bool> clickedList = List<bool>.generate(20, (i) => false);

  Widget _buildRow(String pair, int num) {
    //final bool isClicked = (clicked == num);

    return Dismissible(
        key: Key(pair),
        onDismissed: (direction) {
          setState(() {
            siteName.removeAt(num);
            clickedList.removeAt(num);
            //lines.removeAt(num);
          });
        },
        background: Container(
            padding: EdgeInsets.only(right: 10.0),
            alignment: AlignmentDirectional.centerEnd,
            color: Colors.red,
            child: Icon(
              Icons.delete,
              color: Colors.white,
            )),
        child: ListTile(
            title: Text(
              pair,
              //style: _biggerFont,
            ),
            trailing: Icon(
              clickedList[num]
                  ? Icons.check_circle
                  : Icons.check_circle_outline,
              color: clickedList[num] ? Colors.green : Colors.black,
            ),
            onTap: () {
              setState(() {
                clickedList[num] = !clickedList[num];
              });
            }));
  }

  @override
  Widget build(BuildContext context) {
    final title = 'Dismissing Items';

    return MaterialApp(
      title: title,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text(title),
        ),
        body: ListView.separated(
          separatorBuilder: (context, index) => Divider(),
          padding: const EdgeInsets.all(5.0),
          itemCount: siteName.length,
          itemBuilder: (context, i) {
            return _buildRow(siteName[i], i);
          },
        ),
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...