SetState 不更新列表视图

EFT*_*PMC 5 dart flutter

我试图做到这一点,以便当您按搜索时它会创建一个列表图块。它可以工作,但要使其工作,我必须单击按钮,然后重建应用程序才能显示它。我正在查看其他一些帖子,但找不到任何有用的内容。要查看的主要部分是我有一个添加列表图块的函数。我有一个按下按钮即可创建图块。我将容器的子项放在底部作为创建的列表图块的列表。

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

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {

  List<Widget> _listOfWidgets = [];

  @override
  Widget build(BuildContext context) {

    _addItemToList() {
      List<Widget> tempList =
          _listOfWidgets; // defining a new temporary list which will be equal to our other list
      tempList.add(ListTile(
          key: UniqueKey(),
          leading: Icon(Icons.list),
          trailing: FlatButton(
            onPressed: () async {},
            //Download Link
            child: Text(
              "Download",
              style: TextStyle(color: Colors.green, fontSize: 15),
            ),
          ),
          title: Text("")));
      this.setState(() {
        _listOfWidgets =
            tempList; // this will trigger a rebuild of the ENTIRE widget, therefore adding our new item to the list!
      });
    }

    return MaterialApp(
        theme: ThemeData.light(),
        darkTheme: ThemeData.dark(),
        themeMode: currentTheme.currentTheme(),
        home: Scaffold(
            appBar: AppBar(
              actions: [
                IconButton(
                  onPressed: () {
                    setState(() {
                      currentTheme.switchTheme();
                    });
                  },
                  icon: Icon(Icons.wb_sunny),
                ),
                IconButton(
                  onPressed: () async {
                    await FirebaseAuth.instance.signOut();
                  },
                  icon: Icon(Icons.exit_to_app),
                ),
              ],
              backgroundColor: Colors.blue,
              title: Text("Home"),
            ),
            body: ListView(
              children: [
                ListTile(
                  leading: SizedBox(
                    width: 300,
                    child: TextField(
                      controller: search,
                      decoration: InputDecoration(
                        labelText: "Enter Manga Name",
                      ),
                    ),
                  ),
                  trailing: ElevatedButton(
                      onPressed: () async {
                        _addItemToList();
                      },
                      child: Text("Search")),
                ),
                Container(
                    margin: EdgeInsets.all(15),
                    width: 100,
                    height: 515,
                    color: Colors.black12,
                    child: ListView(
                      children: _listOfWidgets,
                    ))
              ],
            )));
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 0

尝试添加下面的代码

如果您更新需要的状态setState()

更好的状态管理方法是使用 BLoC 或 Provider 包。


...

onPressed: () {
    setState(() {
        _addItemToList();
    });    
},

...
Run Code Online (Sandbox Code Playgroud)