Flutter 在 Stateless Widget 中动态添加项目到 ListView

Flutter adding items dynamically to ListView in Stateless Widget

我正在创建一个 Flutter 应用程序。我已经第 3 天无法使用 'Add' 按钮将项目手动添加到 ListView。

我尝试使用 setState,但它在无状态小部件中不起作用。因为我有一条从有状态小部件到无状态的路线。我正在使用 Navigator.push(...).

然后我尝试使用 Cubit,但它不起作用。 Flutter - BloC Cubit function doesn't emitting state

我能做什么?

[代码量太大了。我上传了必要的部分]

主页(状态小部件)

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

Stateful Widget

class _MyHomePageState extends State<MyHomePage> {
 @override
  Widget build(BuildContext context) {
   return Scaffold(
      appBar: AppBar(
       title: 'List App',
       actions: [
          IconButton(
              onPressed: () {
                Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => SearchPage())
                );
                }
           ])
})

SearchPage(带 ListView)

class SearchPage extends StatelessWidget {
  const SearchPage({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      child: Builder(builder: (BuildContext context) {
        final TabController tabController = DefaultTabController.of(context)!;
        tabController.addListener(() {
          if (!tabController.indexIsChanging) {
          }
        });
return Scaffold(
body: (context, items) => TabBarView(
children: [
Container(
child: FutureBuilder(
                      future: items_client.getItems(),
                      builder: (BuildContext context, AsyncSnapshot<List<Item>> snapshot) {
                        if (snapshot.hasData) {
                          items = snapshot.data!;

return ListView(
                                children: items.asMap()
                                    .map(
                                      (i, item) => MapEntry(i, 
Column(
    children: [
      Text('${item.name'})
    ]

))
)
}
}
)
]
)
)
  }
}

至于你的代码,我已经为你创建了一个示例,请检查示例

主页:

import 'package:demo_stack/search_page.dart';
import 'package:flutter/material.dart';

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

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

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

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

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

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('List app'),
        actions: [
          IconButton(
              onPressed: () {
                Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (context) => const SearchPage()));
              },
              icon: const Icon(Icons.six__ft_apart_rounded))
        ],
      ),
    );
  }
}

搜索小部件。

import 'package:flutter/material.dart';

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

  @override
  State<SearchPage> createState() => _SearchPageState();
}

// Using the statefull widget to change the index of tab bars
class _SearchPageState extends State<SearchPage> {
  var tabIndex = 0;

  @override
  Widget build(BuildContext context) {
    var childList = [
      const FirstPage(),
      Container(color: Colors.red),
      Container(color: Colors.yellow),
      Container(color: Colors.cyan),
    ];

    return Scaffold(
      body: DefaultTabController(
        length: 4,
        initialIndex: tabIndex,
        child: Scaffold(
          appBar: AppBar(),
          body: childList[tabIndex],
          bottomNavigationBar: TabBar(
            onTap: (index) {
              setState(() {
                tabIndex = index;
              });
            },
            labelColor: Colors.black,
            tabs: const <Widget>[
              Tab(text: 'First Page'),
              Tab(text: 'Red'),
              Tab(text: 'Yellow'),
              Tab(text: 'Cyan'),
            ],
          ),
        ),
      ),
    );
    ;
  }
}

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

  Future<List<Item>> getItems() async {
    await Future.delayed(const Duration(seconds: 3));

    return [Item("one"), Item("two"), Item("three")];
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<Item>>(
        future: getItems(),
        builder: (BuildContext context, snapshot) {
          
          //This is to check currently in which state the app is 
          // there are four states none,waiting,active,done
          // you can add the check accordingly
          
          print(snapshot.connectionState);
          
          return snapshot.data == null
              ? const Center(
                  child: CircularProgressIndicator(),
                )
              : ListView.builder(
                  itemCount: snapshot.data!.length,
                  itemBuilder: (context, index) {
                    var item = snapshot.data![index];
                    return Padding(
                      padding: const EdgeInsets.all(15.0),
                      child: Text(item.name),
                    );
                  });
        });
  }
}

class Item {
  final String name;

  Item(this.name);
}


这是搜索页面

如果您仍然遇到任何问题,请检查 futurebuilder 状态并相应地添加检查它会起作用。

谢谢。