我正在制作一个书签应用程序,您可以添加标题和URL从一个对话框并列出在屏幕上. 我试图将对话框上两个文本字段的值传递到最后一个屏幕上的ListView,但未能成功.对话框上有两个文本字段(标题和URL),我想将这些文本传递给最后一个屏幕上的ListView.我试过用pop的方法,但不起作用.有谁能帮帮我吗? 以下是全部代码.

main.dart

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

class BookmarkApp extends StatelessWidget {
  const BookmarkApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Bookmark App',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        useMaterial3: true,
      ),
      home:  BookmarkListPage(text: '', url: '',),
    );
  }
}

class BookmarkListPage extends StatefulWidget {
  BookmarkListPage({super.key, title, required this.text, required this.url});

  String text;
  String url;

  final String title = 'Bookmark List';

  @override
  State<BookmarkListPage> createState() => _BookmarkListPageState();
}

class _BookmarkListPageState extends State<BookmarkListPage> {

  List<String> bookmarkList = [];
  List<String> bookmarkUrl = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        title: Text(widget.title),
        bottom: PreferredSize(
          child: Container(
            height: 1,
            color: Colors.black,
          ),
          preferredSize: Size.fromHeight(1),
        ),
      ),
      body: ListView.builder(
        itemCount: bookmarkList.length,
        itemBuilder: (context, index) {
          return Card(
            child: ListTile(
              title: Text(bookmarkList[index]),
              subtitle: Text(bookmarkUrl[index]),
            ),
          );
        },
      ),

      // show dialog to add a bookmark
      floatingActionButton: FloatingActionButton(
        shape: const CircleBorder(),
        backgroundColor: Colors.blue,
        onPressed: () async {
          final newBookmarkList = await showDialog(
              context: context,
              builder: (_) {
                return BookmarkDialog();
              });

          if (newBookmarkList != null) {
            setState(() {
              bookmarkList.add(newBookmarkList);
              bookmarkUrl.add(newBookmarkList);
            });
          }
        },
        child: const Icon(
          Icons.add,
          color: Colors.white,
        ),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

dialog.dart

class BookmarkDialog extends StatefulWidget {
  const BookmarkDialog({super.key});

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

class BookMarkDialogState extends State<BookmarkDialog> {
  String bookmarkTitle = "";
  String bookmarkUrl = "";

  @override
  Widget build(BuildContext context) {
    return AlertDialog(
      title: const Text('Add Bookmark'),
      content: Column(
        children: [
          Text('Title'),
          TextField(onChanged: (value) {
            setState(() {
              bookmarkTitle = value;
            });
          }),
          Text('URL'),
          TextField(
            onChanged: (value) {
              setState(() {
                bookmarkUrl = value;
              });
            },
          )
        ],
      ),
      actions: <Widget>[
        GestureDetector(
          child: const Text('Cancel'),
          onTap: () {
            Navigator.pop(context);
          },
        ),
        GestureDetector(
          child: const Text('Add'),
          onTap: () {
            Navigator.of(context).pop(bookmarkTitle);
          },
        )
      ],
    );
  }
}

推荐答案

如果您使用的DART版本至少为3.0,则可以使用Record.

Navigator.of(context).pop((bookmarkTitle, bookmarkUrl));

然后,您可以使用pattern variable declaration来读取值:

final (newBookmarkTitle, newBookmarkUrl) = await showDialog(
  context: context,
  builder: (_) {
    return BookmarkDialog();
});

Flutter相关问答推荐

从Flutter应用程序解释蓝牙BLE数据:了解Sylvania压力值

在Riverpod ConsumerWidget中使用文本编辑控制器

使用ThemeProvider不在亮模式和暗模式之间切换

如何在Ffltter Chrome应用程序中使用webview_fltter_web显示自定义html而不是外部uri?

如何在容器小部件中的图像旁边添加文本?

设置Flutter 中的ListView.Builder()的最小高度

在选项卡栏视图中搜索和筛选不起作用

如何在抖动中将PNG图像转换为WebP

Flutter 数独网格

为Android生成时出现Flutter 错误:给定资源值的<;COLOR&>无效

如何在巡逻测试期间重新启动dart 侧应用程序状态?

Riverpod Provider.family 和 HookConsumerWidget 不刷新 UI

Flutter:使用不包含导航器的上下文请求导航器操作

Flutter居中的SizedBox无法居中

在允许屏幕 Select 和点击的同时保持通用对话框显示

如何将行推到列的底部

具有 BLOC 和存储库模式的 Flutter Workmanager

Flutter:当我通过 Transform.rotate 旋转水平 ListView 时,左右边缘被切断

Getx Flutter 在更新值时抛出空错误

在 flutter 中使用 StreamBuilder 在文本字段中键入时显示过滤记录