【问题标题】:flutter listview overwriting the last item颤动列表视图覆盖最后一项
【发布时间】:2022-01-17 22:22:29
【问题描述】:

我想在FirstClass 的文本字段中插入一个人的名字,然后在ListView.builder 内的SecondClass 中显示它。当我回去插入一个新人的名字时,PersonAdd 类工作得很好,但它用最后插入的名字填充了整个列表。我错过了什么?

这是我的代码;

人物类

class Person{
  late String name;

  void setName(String name){
    this.name=name;
  }
}

PersonAdd 类

class PersonAdd{

  List<Person> list=[];

  void addList(Person person){
    list.add(person);

  }
  List<Person> getList(){
    return list;
  }
}

主要和头等舱


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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return  MaterialApp(
      home: FirstClass(),
    );
  }
}

PersonAdd personAdd = PersonAdd();
class FirstClass extends StatefulWidget {
  @override
  State<FirstClass> createState() => _FirstClassState();
}

class _FirstClassState extends State<FirstClass> {
  Person person= Person();
  void setData(String? input){
    setState(() {
      person.name=input!;
    });
  }


  @override
  Widget build(BuildContext context) {
    return  Scaffold(
      body: Center(
        child:  Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
             TextField(
              onChanged: (input)  {
                  setData(input);
              },
              style: const TextStyle(fontSize: 40,),

            ),
            const SizedBox(height: 15,),
            TextButton(

                style: TextButton.styleFrom(
                    backgroundColor: Colors.blue
                ),
                onPressed: (){
                  setState(() {
                    personAdd.addList(person);
                  });

                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) =>  SecondClass(persons:personAdd)),
                  );
                }, child: const Text('SEND', style: TextStyle(fontSize: 40,color: Colors.black38),))
          ],
        ),
      ),
    );

  }
}

二等

class SecondClass extends StatelessWidget {

  PersonAdd persons;
  SecondClass({required this.persons});


  @override
  Widget build(BuildContext context) {

    return  Scaffold(
      body: Center(
        child:  ListView.builder(
            padding: const EdgeInsets.all(8),
            itemCount: persons.getList().length,
            itemBuilder: (BuildContext context, int index) {
              return Container(
                height: 50,
                color: Colors.amber,
                child: Center(child: Text(personAdd.getList()[index].name)),
              );
            }
        ),


      ),
    );
  }
}

我按顺序插入了 Name1、Name2、Name3 和 Name4。但是,结果是这样的

【问题讨论】:

    标签: list flutter dart listview


    【解决方案1】:

    因为您列表中的所有项目都有相同的地址。 让我们试试这个更新:

    setState(() {
       personAdd.addList(person);
       person= Person();
    });
    

    在此代码上,我们将在将其添加到列表后创建新人。

    【讨论】:

    • 谢谢,它工作得很好。另一个问题是,如果我想使用 Provider 而不是通过构造函数发送这些数据怎么办。如何更改提供者数据?
    • 如果你使用Provider,把它包装在MaterialApp上,你可以将PersonAdd定义为Provider的ChangeNotifier。可以使用context.read访问Provider并修改状态
    猜你喜欢
    • 2014-09-06
    • 2021-07-06
    • 2021-02-16
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多