【问题标题】:Flutter: My screen doesn't update when I update my List in the provider trough functionsFlutter:当我在提供程序槽函数中更新我的列表时,我的屏幕没有更新
【发布时间】:2021-01-16 22:15:39
【问题描述】:

我的主文件中的提供程序中有一个包含函数的列表。如果我通过小部件中的功能更新此列表(通过按下按钮),它似乎可以工作,但不会改变屏幕上的任何内容...

我有两个 Screens,应该使用相同的 List 归档,所以我需要 Provider Functions。 在我看来(当然不一定是正确的)我对功能进行了正确的编码,所以问题可能是屏幕没有更新,尽管我使用了消费者。如果您能告诉我代码中的错误,那就太好了。

如果你能看看我的问题,我会很高兴 - 谢谢!

主文件:

void main() => runApp(
  MultiProvider(
  providers: [

    ChangeNotifierProvider(create: (_) => MyList()),

  ],

  child: MyApp(),
),);


class MyList extends ChangeNotifier {

 final List<String> heute = [
    'Ereignis 1',
    'Ereignis 2',
    'Ereignis 3',
    'Ereignis 4',
    'Ereignis 5'
  ];

  UnmodifiableListView<String> get items => UnmodifiableListView(heute);

  int get totallength => heute.length;

  void addItem(String item) {
      heute.add(item);
      notifyListeners();
  }

  void deleteItem(int index) {
    heute.removeAt(index);
    notifyListeners();
  }

  void removeAll() {
    heute.clear();
    notifyListeners();
  }

}

小部件:

class ContainerListe extends StatefulWidget {
  @override
  _ContainerListeState createState() => _ContainerListeState();

}
class _ContainerListeState extends State<ContainerListe> {

final heute = MyList();

  void addItem(String item) {
    setState(() {
    heute.addItem(item);});
    Navigator.of(context).pop();
  }

  void removeAll(){setState(() {
    setState(() {
    heute.removeAll();});
  });}

  void deleteItem(int index) {
  setState(() {
  heute.deleteItem(index);
  });}


  void newEntry() {
  showDialog<AlertDialog>(
  context: context, 
  builder: (BuildContext context) 
  {return AddItemDialogWHW(addItem);});}


  @override
  Widget build(BuildContext context) {
    final heute = MyList();
    final elemente = heute.items;


      return Consumer<MyList>(
          builder: (context, mylist, child)
    {
      return
        Column(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Container(
                  width: 400.0,
                  height: 550.0,
                  child: Align(
                      alignment: Alignment.bottomCenter,
                      child:

                      ListView.builder(
                        itemCount: Provider
                            .of<MyList>(context, listen: true)
                            .totallength,
                        itemBuilder: (context, i) {
                          return
                            Column(
                              children: [

                                ContainerVorlage(
                                  elemente[i],
                                      () => deleteItem(i),
                                ),

                                SizedBox(
                                  height: 15,
                                ),


                              ],
                            )

                          ;
                        },
                      )

                  )),


              SizedBox(
                height: 40,
              ),


              AddButton(
                    () => newEntry(),
              ),


            ]);
    });

  }
}


//More Code

【问题讨论】:

  • 您没有参考正确的列表
  • 这是什么意思?我不明白我必须在哪里进行更改,因为在我的小部件中我只调用函数,这不起作用......如果你能告诉我我必须在哪个地方更改代码,那就太好了。谢谢;)
  • 当然,检查答案,看看这是否适合你,但可能存在一些语法错误。

标签: list flutter dart provider flutter-change-notifier


【解决方案1】:

首先,从_ContainerListeState中删除这一行

final heute = MyList();

然后使用MyList对象中的方法,你可以使用

 return Consumer<MyList>(builder: (context, mylist, child)
 ... // rest  code
   ContainerVorlage(
     elemente[i],
     () => mylist.deleteItem(i),
  ),

【讨论】:

    【解决方案2】:

    您正在构建方法下创建新对象并将其用于添加删除操作,它与您获得长度的部分无关。
    为了正确删除,请使用它:

    mylist.deleteItem(i)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-06
      • 2019-08-17
      • 2020-06-05
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      相关资源
      最近更新 更多