【问题标题】:Flutter How to display Chips text on the screen when Chip's pressed?Flutter 按下芯片时如何在屏幕上显示芯片文本?
【发布时间】:2021-11-30 23:14:44
【问题描述】:

想知道当用户点击芯片时,我如何在屏幕上显示芯片内的文本,希望文本位于芯片下方,当用户按下芯片时,文字显示在那里没有水平空格,单词应该在下面换行。

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:sizer/sizer.dart';
import 'package:femija_musliman/rendit_fjalet_quiz.dart';

import 'dataset.dart';

class RenditFjaletButton extends StatefulWidget {
  RenditFjaletButton({required this.QuizList, Key? key}) : super(key: key);
  late List QuizList;

  @override
  State<RenditFjaletButton> createState() => _RenditFjaletButtonState();
}

class _RenditFjaletButtonState extends State<RenditFjaletButton> {
  late Future<List<QuizInfo>?> futureData;

  int counter = 1;
  int counterForChips = 0;
  bool showWord = true;
  int _selectedChipsIndex = 0;
  List selectReportList = [];

  void initState() {
    super.initState();
    futureData = fetchData1() as Future<List<QuizInfo>?>;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
            toolbarHeight: 23.h,
            backgroundColor: Color(0xFFEF6E98),
            title: Column(children: <Widget>[
              Align(
                alignment: Alignment.topCenter,
                child: Padding(
                  padding: const EdgeInsets.only(right: 50),
                  child: Text(
                    'Rendit Fjalet',
                    style: TextStyle(fontSize: 25.sp),
                  ),
                ),
              ),
              Align(
                  alignment: Alignment.topCenter,
                  child: Padding(
                    padding: const EdgeInsets.only(right: 60, bottom: 60),
                    child: Text(
                      '- Fjala numer:  -',
                      style: TextStyle(fontSize: 18.sp),
                    ),
                  ))
            ])),
        body: FutureBuilder<List<QuizInfo>?>(
            future: futureData,
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                List<QuizInfo>? data = snapshot.data;
                return Stack(children: [
                  Container(
                    decoration: BoxDecoration(
                        image: DecorationImage(
                            image: AssetImage(
                              'assets/background.PNG',
                            ),
                            fit: BoxFit.cover)),
                  ),
                  Container(
                      margin: EdgeInsets.all(20),
                      child: Wrap(
                        direction: Axis.horizontal,
                        spacing: 20,
                        children: List<Widget>.generate(widget.QuizList.length,
                            (int index) {
                          var chipsText = widget.QuizList[index].toString();

                          void _handleTap(int index) {
                            setState(() {
                              _selectedChipsIndex = index;
                            });
                          }

                          return GestureDetector(
                              onTap: () {
                                _handleTap(index);
                              },
                              child: Chip(
                                label: Text(
                                  chipsText,
                                  style: TextStyle(
                                      fontSize: 20.sp,
                                      color: Colors.white,
                                      fontWeight: FontWeight.bold),
                                ),
                                backgroundColor: Color(0xFF50CFFD),
                              ));
                        }),
                      )),
                  Padding(
                    padding: const EdgeInsets.only(bottom: 170, left: 40),
                    child: Align(
                      alignment: Alignment.bottomLeft,
                      child: Text(
                        " ${(widget.QuizList[_selectedChipsIndex])}",
                        style: TextStyle(
                            fontSize: 20.sp,
                            color: Color(0xFF50CFFD),
                            fontWeight: FontWeight.bold),
                      ),
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(bottom: 155),
                    child: Align(
                      alignment: Alignment.bottomCenter,
                      child: Padding(
                        padding: const EdgeInsets.only(left: 30),
                        child: Divider(
                          endIndent: 30,
                          thickness: 5,
                          color: Colors.pinkAccent,
                        ),
                      ),
                    ),
                  )
                ]);
              }
              return Center(child: CircularProgressIndicator());
            }));
  }
}

所以图像是我现在想要实现的,我只有带有文字的芯片,我希望当用户按下芯片时,我希望芯片内的单词在没有水平空间时显示文本显示在新行]click for image

【问题讨论】:

  • 你能告诉我你想要实现的图像吗?
  • 是的,添加了一张图片及其描述
  • 如果我没记错的话,当你按下芯片时,文字会显示在芯片下方和芯片上的文字内?我说得对吗
  • 是的,假设我们有五个筹码,其中五个有文字,如果用户按下其中任何一个,筹码文本将显示在下方,如果用户按下其他筹码,则其他筹码文本将显示而不覆盖第一个
  • 好的,现在我已经了解您的要求,请查看我更新的答案。我想这次你不会失望的。

标签: flutter dart flutter-layout


【解决方案1】:

如果我没记错的话,你就达到了this

我只是创建具有相同模型类型的新列表并添加项目,如果该项目被选中。

class QuizInfo {
  String? title;
  bool visible;
  QuizInfo({required this.title, this.visible = false});
}



class RenditFjaletButton extends StatefulWidget {
  const RenditFjaletButton({Key? key}) : super(key: key);

  @override
  State<RenditFjaletButton> createState() => _RenditFjaletButtonState();
}

class _RenditFjaletButtonState extends State<RenditFjaletButton> {
  late Future<List<QuizInfo>?> futureData;

  List<QuizInfo> selectReportList = [];

  List<QuizInfo> quizList = [
    QuizInfo(
      title: "Twitter",
    ),
    QuizInfo(
      title: "Instagram",
    ),
    QuizInfo(title: "Facebook"),
    QuizInfo(title: "Stackoverflow"),
    QuizInfo(title: "Github"),
  ];

  void initState() {
    super.initState();
    futureData = fetchData1() as Future<List<QuizInfo>?>;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
            toolbarHeight: 23,
            backgroundColor: const Color(0xFFEF6E98),
            title: Column(children: const [
              Align(
                alignment: Alignment.topCenter,
                child: Padding(
                  padding: EdgeInsets.only(right: 50),
                  child: Text(
                    'Rendit Fjalet',
                    style: TextStyle(fontSize: 25),
                  ),
                ),
              ),
              Align(
                  alignment: Alignment.topCenter,
                  child: Padding(
                    padding: EdgeInsets.only(right: 60, bottom: 60),
                    child: Text(
                      '- Fjala numer:  -',
                      style: TextStyle(fontSize: 18),
                    ),
                  ))
            ])),
        body: Stack(children: [
          Container(
            decoration: const  BoxDecoration(
                image: DecorationImage(
                    image: AssetImage(
                      'assets/background.PNG',
                    ),
                    fit: BoxFit.cover)),
          ),
          Container(
              margin: const EdgeInsets.all(20),
              child: Wrap(
                direction: Axis.horizontal,
                spacing: 20,
                children: List<Widget>.generate(quizList.length, (int index) {
                  var chipsText = quizList[index].title.toString();

                  return GestureDetector(
                      onTap: () {
                        setState(() {
                          quizList[index].visible = !(quizList[index].visible);
                          if (quizList[index].visible) {
                            selectReportList.add(quizList[index]);
                          } else {
                            selectReportList.remove(quizList[index]);
                            selectReportList.join(', ');
                          }
                        });
                      },
                      child: Chip(
                        label: Text(
                          chipsText,
                          style: const TextStyle(
                              fontSize: 20,
                              color: Colors.white,
                              fontWeight: FontWeight.bold),
                        ),
                        backgroundColor: quizList[index].visible
                            ? Colors.pinkAccent
                            : const Color(0xFF50CFFD),
                      ));
                }),
              )),

          Padding(
            padding: const EdgeInsets.only(bottom: 170, left: 40),
            child: Align(
                alignment: Alignment.bottomLeft,
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.end,
                  crossAxisAlignment: CrossAxisAlignment.end,
                  children: [
                    Expanded(
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.end,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          Wrap(
                              direction: Axis.horizontal,
                              spacing: 20,
                              children: List<Widget>.generate(
                                  selectReportList.length, (int index) {
                                return Text(
                                  " ${(selectReportList[index].title)}",
                                  style: const TextStyle(
                                      fontSize: 20,
                                      color: Color(0xFF50CFFD),
                                      fontWeight: FontWeight.bold),
                                );
                              })),
                          Divider(
                            endIndent: 30,
                            thickness: 5,
                            color: Colors.pinkAccent,
                          ),
                        ],
                      ),
                    ),
                    IconButton(
                        onPressed: () {
                          setState(() {
                            selectReportList.clear();
                            
                          });
                        },
                        icon: Icon(
                          Icons.cancel,
                          color: Colors.pinkAccent,
                        ))
                  ],
                )),
          ),
        ]));
  }
}


【讨论】:

  • 如果你不介意,只需要在我的代码上实现这个
  • 生病编辑问题并把屏幕的整个代码,这样你就更容易了
  • 这里更新了代码
  • 很高兴,您可以使用相同的用户名在linkedIn 或instagram 上关注我。
【解决方案2】:

添加一个类似于chipText的变量,然后在这部分

    return GestureDetector(
        onTap: () {
            chipText = widget.QuizList[index].toString()
            },

在您的 Stack 子列表中创建一个新的 Text 小部件(或您希望显示点击的文本的任何其他小部件)。

在此之后,设置状态,或您使用应用的任何状态管理方式。

【讨论】:

  • 试过了,但它不起作用我认为它需要像 bool 变量一样才能显示
  • 可以添加一个空的Container,当点击芯片声明cipText时,setState会更新Container并显示文本。否则,请详细解释您的问题。
猜你喜欢
  • 2021-04-25
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 2020-08-25
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
相关资源
最近更新 更多