【问题标题】:cant pop from a ListView.builder()无法从 ListView.builder() 中弹出
【发布时间】:2026-01-09 12:00:02
【问题描述】:

我正在尝试构建一个ListView.builder() 小部件,其中每个项目都是一个ListTile。当点击磁贴时,我想执行Navigator.of(context).pop()。但ListView.builder() 中的每个项目都有Navigator.of(context).canPop() false 的属性,所以我无法弹出或返回上一个屏幕。


class AllHabitsView extends StatelessWidget {
  static const routeName = 'all_habits_view';
  const AllHabitsView({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    print(Navigator.of(context).canPop()); // Evaluate to true

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: ListView.builder(
          itemBuilder: (context, index) {
            print(Navigator.of(context).canPop()); // evaluate to false
            return Text('data');
          },
          itemCount: 5,
        ),
      ),
    );
  }
}

【问题讨论】:

  • 你可以在被其他屏幕推送时弹出。
  • @MehranUllah 对。如您所见,有两个 canPop() 方法。一个返回真另一个假。
  • MaterialApp 建立一个新的Navigator,因此您的ListView 看不到任何以前的屏幕。为什么这里有MaterialApp
  • @PatrickO'Hara 谢谢。那是错误。

标签: flutter dart flutter-navigation


【解决方案1】:

如果不将页面推送到路由堆栈,则无法使用 pop。我已经实现了您想要的相同行为。请检查以下代码 sn-ps。

import 'package:flutter/material.dart';

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: TextButton(
          child: Text('Click me'),
          onPressed: () {
            Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => MySecondScreen(key: key)));
          },
        ),
      ),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView.builder(
          itemCount: 10,
          itemBuilder: (context, index) {
            return ListTile(
                tileColor: Colors.amber,
                onTap: () => Navigator.pop(context),
                title: Text('List Tile $index'));
          }),
    );
  }
}

【讨论】: