将列表数据反射回UI[颤动] [英] Reflect List Data Back Into UI [Flutter]

查看:29
本文介绍了将列表数据反射回UI[颤动]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

简而言之,用户可以在入职过程中选择自己的兴趣,更改UI并将兴趣添加到列表中。

当用户导航到另一个页面(即设置)时,如何选择所选兴趣(bool isChosen=true)?.然后用户可以从那里再次更新他们的兴趣?

感谢任何指导,谢谢!

附件是我对感兴趣的特定主题的截断代码,所有主题都有相同的代码,只是列表不同。

假设我的数据包含[&Quot;🏡Home-Body&Quot;,&Quot;🏃‍♀️Running&Quot;,&Quot;🧘🏻‍♀️Yoga&Quot;,&Quot;🎭Theaters&Quot;,&Quot;😸动画&;Manga&Quot;,]的列表。

如何才能使此选定列表的泡沫UI显示为bool isChosen(与其他深色列表相比,它是黄色的)?下面哪些用户可以再次选择和取消选择?

final List<String> artsInterests = [
  blah blah blah
];


class ArtsInterests extends StatelessWidget {
  const ArtsInterests({
    Key key,
    @required this.artsInterests,
  }) : super(key: key);

  final List<String> artsInterests;

  @override
  Widget build(BuildContext context) {
final height = MediaQuery.size.height;
final width = MediaQuery.size.width;

    return Column(children: [
      Container(
        margin: EdgeInsets.only(
            left: width * 0.045,
            top: height * 0.033),
        child: Align(
            alignment: Alignment.centerLeft,
            child: Text(
              '🎨 Arts',
              style: TextStyle(fontWeight: FontWeight.bold, fontSize: 21),
            )),
      ),
      Column(
        children: [
          Padding(
            padding: EdgeInsets.only(
                left: width * 0.03,
                top: height * 0.012),
            child: Container(
              width: width,
              height: height * 0.045,
              child: ListView.builder(
                  shrinkWrap: true,
                  scrollDirection: Axis.horizontal,
                  padding: const EdgeInsets.all(1),
                  itemCount: 7,
                  itemBuilder: (context, int index) {
                    return Interests2(AvailableInterestChosen(
                      artsInterests[index],
                      isChosen: false,
                    ));
                  }),
            ),
          ),
          Padding(
            padding: EdgeInsets.only(
                left: width * 0.03,
                top: height * 0.003),
            child: Container(
              width: width,
              height: height * 0.045,
              child: ListView.builder(
                  shrinkWrap: true,
                  scrollDirection: Axis.horizontal,
                  padding: const EdgeInsets.all(1),
                  itemCount: artsInterests.length - 7,
                  itemBuilder: (context, int index) {
                    return Interests2(AvailableInterestChosen(
                      artsInterests[7 + index],
                      isChosen: false,
                    ));
                  }),
            ),
          ),
        ],
      ),
    ]);
  }
}

List<String> chosenInterests = [ "🏡 Home-body",  "🏃‍♀️ Running", "🧘🏻‍♀️ Yoga",  "🎭 Theaters",  "😸 Anime & Manga",];

List<String> chosenArtsInterests = [];

class Interests2 extends StatefulWidget {
  final AvailableInterestChosen viewInterest;

  Interests2(this.viewInterest);

  String id = 'Interests2';

  @override
  Interests2State createState() => Interests2State();
}

class Interests2State extends State<Interests2> {
  @override
  Widget build(BuildContext context) {
final height = MediaQuery.size.height;
final width = MediaQuery.size.width;
    Container container = Container(
        height: height * 0.03,
        padding: EdgeInsets.symmetric(
            horizontal: width * 0.027,
            vertical:height * 0.003),
        // padding: EdgeInsets.fromLTRB(12, 6, 12, 6),
        margin: EdgeInsets.fromLTRB(
          width * 0.012,
          height * 0.003,
          width * 0.012,
          height * 0.003),
        decoration: BoxDecoration(
          color: widget.viewInterest.isChosen && chosenInterests.length < 9
              ? Color(0xff0B84FE)
              : Colors.white.withOpacity(0.87),
          boxShadow: [
            BoxShadow(
              color: Colors.grey.withOpacity(0.69),
              spreadRadius: 1,
              blurRadius: 3,
              offset: Offset(0, 1), // changes position of shadow
            ),
          ],
          borderRadius: BorderRadius.circular(9),
        ),
        child: Text(
          '${widget.viewInterest.title}',
          style: TextStyle(
              fontSize: 15,
              fontWeight: FontWeight.w600,
              color: widget.viewInterest.isChosen && chosenInterests.length < 9
                  ? Colors.white
                  : Colors.black),
        ));

    if (widget.viewInterest.isChosen && chosenInterests.length < 9) {
      chosenArtsInterests.add('${widget.viewInterest.title}');
      var chosenInterests = chosenSportsInterests +
          chosenEntertainmentInterests +
          chosenCharacterInterests +
          chosenArtsInterests +
          chosenWellnessInterests +
          chosenLanguageInterests;

      print(chosenInterests);
    } else {
      chosenArtsInterests.remove('${widget.viewInterest.title}');
      var chosenInterests = chosenSportsInterests +
          chosenEntertainmentInterests +
          chosenCharacterInterests +
          chosenArtsInterests +
          chosenWellnessInterests +
          chosenLanguageInterests;

      print(chosenInterests);
    }
    return GestureDetector(
      onTap: () {
        setState(() {
          widget.viewInterest.isChosen = !widget.viewInterest.isChosen;
        });
      },
      child: container,
    );
  }
}

class AvailableInterestChosen {
  bool isChosen;
  String title;

  AvailableInterestChosen(this.title, {this.isChosen = false});
}

推荐答案

您可以将值作为参数传递给另一个小部件,但在本例中这是不可能的,因为值太多了。您必须使用状态管理解决方案。对于Starter,您可以使用provider

这篇关于将列表数据反射回UI[颤动]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆