当前位置: 首页 > 知识库问答 >
问题:

手势捕获的异常试图从小部件树外部侦听提供者公开的值

狄旻
2023-03-14

我正试图实现这一愿景。[1]: https://i.stack.imgur.com/6COFI.png这是我第一次使用提供商。同样的代码也适用于todo应用程序。但我无法使用此应用程序的代码。我尝试过修改代码,但徒劳无功。

错误消息是:EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════ 抛出以下断言处理手势时:尝试从小部件树外部监听提供程序公开的值。

这可能是由调用Provider的事件处理程序(如按钮的onPressed)引起的。未通过的of侦听:false

要修复,请写入:Provider。of(上下文,听:假);

它不受支持,因为当小部件树不关心值时,它可能会无意义地重建与事件处理程序关联的小部件。

使用的上下文是:AddPlayersScreen(状态:_AddPlayersScreenState#da0e7)'包:provider/src/provider。dart':失败的断言:第242行第7位:“上下文”。物主debugBuilding | | listen==false | | DebugIsInheritedProviderUpdate'

抛出异常时,这是堆栈:#2 Provider.of(包:提供者/src/provider.dart:242: 7)#3_AddPlayersScreenState.build.(包:badminton_app/屏幕/add_players_screen.dart:73: 34)#4_InkResponseState。_handleTap(包:flutter/src/材料/ink_well.dart:992: 19)#5_InkResponseState.build.(包:flutter/src/材质/ink_well.dart:1098: 38)#6 GestureRecognizer.invokeCallback(包:flutter/src/手势/recognizer.dart:184: 24)#7 TapGestureRecognizer.handleTapUp(包:flutter/src/_checkUp(包:flutter/src/手势/tap.dart:284: 5)#9 BaseTapGestureRecognizer.accept手势(包:flutter/src/手势/tap.dart:256: 7)#10 GestureArenaManager.sweep(包:flutter/src/手势/arena.dart:158: 27)#11 GestureBinding.handle事件(软件包:flutter/src/手势/binding.dart:224: 20)#12 GestureBinding.dispatch事件(软件包:flutter/src/手势/binding.dart:200: 22)#13 Gesture绑定._handlePointerEvent(软件包:flutter/src/手势/绑定. dart: 158:7)#14手势绑定。_flushPointerEventQueue(软件包:flutter/src/手势/绑定。dart: 104:7)#15手势绑定。_handlePointerDataPacket(软件包:flutter/src/手势/绑定。dart: 88:7)#19_invoke1(dart: ui/钩子。dart: 267:10)#20_dispatchPointerDataPacket(dart: ui/钩子。dart: 176:5)(省略了类_AssertionError和dart: async的5帧)

处理程序:“onTap”识别器:TapGestureRecognizer#65790════════════════════════════════════════════════════════════════════════════════════════════════════

import 'package:badminton_app/constants.dart';
import 'package:badminton_app/model/player_list.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:badminton_app/constants.dart';
import 'package:badminton_app/model/players_data.dart';
import 'package:badminton_app/widgets/check_cards.dart';

TextEditingController _controller = TextEditingController();

class AddPlayersScreen extends StatefulWidget {
  @override
  _AddPlayersScreenState createState() => _AddPlayersScreenState();
}

class _AddPlayersScreenState extends State<AddPlayersScreen> {
  String newText;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Color(0xff07021A),
      body: SafeArea(
        child: Padding(
          padding: const EdgeInsets.all(25.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              SizedBox(
                height: 30.0,
              ),
              Text(
                'Add Players',
                style: TextStyle(
                    color: Colors.white,
                    fontSize: 40.0,
                    fontFamily: 'Montserrat'),
              ),
              SizedBox(
                width: 400.0,
                height: 50.0,
                child: Divider(
                  height: 10.0,
                  color: Color(0xff525274),
                ),
              ),
              Container(
                constraints: BoxConstraints.tight(Size(400.0, 70.0)),
                child: TextField(
                  cursorColor: Color(0xffA8A3BE),
                  style: TextStyle(color: Color(0xffA8A3BE), fontSize: 20.0),
                  controller: _controller,
                  onChanged: (newValue) {
                    newText = newValue;
                  },
                  enabled: true,
                  decoration: InputDecoration(
                    suffix: IconButton(
                      onPressed: () {
                        _controller.clear();
                      },
                      icon: CircleAvatar(
                        radius: 13.0,
                        backgroundColor: Color(0xff939393),
                        child: Icon(
                          Icons.clear,
                          size: 25.0,
                          color: Color(0xff585179),
                        ),
                      ),
                    ),
                    suffixIcon: IconButton(
                      onPressed: () {
                        Provider.of<PlayerData>(context).changeString(newText);
                      },
                      icon: Container(
                          height: 100.0,
                          width: 50.0,
                          decoration: BoxDecoration(
                              color: Colors.yellow,
                              borderRadius: BorderRadius.only(
                                  topRight: Radius.circular(5.0),
                                  bottomRight: Radius.circular(5.0))),
                          child: Icon(
                            Icons.add,
                            color: Colors.black,
                          )),
                    ),
                    hintText: "New member......",
                    hintStyle: TextStyle(
                      fontSize: 20.0,
                      fontFamily: "Montserrat",
                      color: Color(
                        0xffA199C6,
                      ),
                    ),
                    filled: true,
                    fillColor: Color(0xff585179),
                    enabledBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(10.0)),
                        borderSide: BorderSide.none),
                    focusedBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(
                          Radius.circular(10.0),
                        ),
                        borderSide: BorderSide.none),
                  ),
                ),
              ),
              SizedBox(
                height: 20.0,
              ),
              Expanded(
                child: PlayerList(),
              ),
            ],
          ),
        ),
      ),
    );
  }
}


   
import 'dart:collection';

import 'package:flutter/cupertino.dart';
import 'package:badminton_app/model/players.dart';

class PlayerData extends ChangeNotifier {
  List<Players> _playerData = [];

  UnmodifiableListView<Players> get playerData {
    return UnmodifiableListView(_playerData);
  }

  toggleSelect(Players players) {
    players.toggle();
    notifyListeners();
  }

  int get getLength {
    return playerData.length;
  }

  changeString(newString) {
    _playerData.add(Players(name: newString));
    notifyListeners();
  }

  removeString(Players player) {
    _playerData.remove(player);
    notifyListeners();
  }
}



import 'package:badminton_app/model/players_data.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:badminton_app/model/players.dart';

class CheckCards extends StatelessWidget {
  final String name;
  final bool isSelected;
  final Function callBack;
  CheckCards({this.name, this.isSelected = false, this.callBack});

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.only(bottom: 20.0),
      child: Stack(
        children: [
          Positioned(
            left: 25.0,
            top: 17.0,
            child: Center(
              child: InkWell(
                onTap: callBack,
                child: Container(
                  decoration: BoxDecoration(
                      borderRadius: BorderRadius.all(Radius.circular(7.0)),
                      color: Colors.yellow),
                  child: Padding(
                    padding: const EdgeInsets.all(1.0),
                    child: isSelected
                        ? Icon(
                            Icons.brightness_1,
                            size: 30.0,
                            color: Color(0xff585179),
                          )
                        : Icon(
                            Icons.stop,
                            size: 30.0,
                            color: Color(0xff585179),
                          ),
                  ),
                ),
              ),
            ),
          ),
          Positioned(
            left: 80.0,
            top: 22.0,
            child: Text(
              'Sai Deepak',
              style: TextStyle(
                  fontWeight: FontWeight.bold,
                  fontSize: 20.0,
                  color: Colors.white,
                  fontFamily: 'Montserrat'),
            ),
          ),
        ],
      ),
      height: 70.0,
      width: 500.0,
      decoration: BoxDecoration(
          color: isSelected ? Color(0xff21213C) : Color(0xff585179),
          borderRadius: BorderRadius.all(Radius.circular(10.0))),
    );
  }
}



import 'package:badminton_app/model/players.dart';
import 'package:badminton_app/model/players_data.dart';
import 'package:badminton_app/widgets/check_cards.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:badminton_app/widgets/tile.dart';

class PlayerList extends StatefulWidget {
  @override
  _PlayerListState createState() => _PlayerListState();
}

class _PlayerListState extends State<PlayerList> {
  @override
  Widget build(BuildContext context) {
    return Consumer<PlayerData>(builder: (context, data, child) {
      return ListView.builder(
        itemBuilder: (context, index) {
          final playo = data.playerData[index];
          return CheckCards(
            name: playo.name,
            isSelected: playo.isDone,
            callBack: () {
              data.toggleSelect(playo);
            },
          );
        },
        itemCount: data.getLength,
      );
    });
  }
}
    

谁能帮帮我吗。这件事好几天都让我心烦意乱。提前谢谢。

共有1个答案

查淮晨
2023-03-14

在onPressed()中使用

供应商。of(上下文,听:假);

检查您是否通过了listen:false如果您更改了本地数据,您还可以设置state

 类似资料:
  • 所以,我有一个项目在Flatter中,我试图建立一个卡片列表,其中的内容取决于我的OrderModel类,我试图使用Provider来实现这一点,但我得到了以下错误: ════════ 异常捕获调度程序库 ══════════════════════════ 尝试从小部件树外部侦听提供程序公开的值。 这很可能是由调用Provider.of的事件处理程序(如按钮的onP)引起的,该事件处理程序没有传

  • 问题内容: 如何使用Tomcat从Web应用程序外部的公共文件夹中提供图像文件?我不想在其他端口上使用第二个Apache文件服务器,因为图像文件是同一应用程序的一部分。而且我不想在webapps内部创建指向公共文件夹的符号链接,因为我的应用程序被部署为war文件....是否有一个更简单的解决方案,类似于将默认servlet用于webapps内部的静态内容,用于webapps外部的静态内容 问题答案

  • 问题内容: 当在下拉组件外部单击时,我想关闭下拉菜单。 我怎么做? 问题答案: 在我添加的元素中,像这样: 然后在父母中,我这样做: 该是一个布尔值,当显示在我的情况下,日历和隐藏它。

  • 问题内容: 最近,我遇到了一位程序员的代码,其中他在catch中有一条try-catch语句! 请原谅我无法粘贴实际代码,但是他所做的与以下内容类似: 我个人认为这是我见过的最差的代码!以1到10的比例,您认为我应该多久才能动一下脑子,还是我反应过度? 编辑:他实际上在抓捕中所做的事情,他正在执行一些操作,这些操作在初始尝试失败时可以/应该执行。我的问题是拥有干净的代码和可维护性。将异常从第一个c

  • 问题内容: 关于使用/的最佳实践,我有一个非常基本的问题。我有一个像这样的简单函数(DAO) 并在Web服务中使用DAO功能: OR最好在DAO函数中使用/,如下所示: 问题答案: 没有完美的规则。 如果需要尽早但尽可能晚地捕获异常,通常代码会更清晰,更简单。 您应该考虑在发生这种情况时谁必须采取行动,这决定了您是在方法(addVehicle)内进行操作还是调用方必须执行该操作。 例如: 在此示例

  • 我尝试使用mallet库运行LDA算法。当我尝试使用一组参数运行LDA时,没有问题,但使用另一组参数时,我遇到了以下错误: 我的代码如下所示: 如何捕捉由外部jar引起的异常?我听过这个问题,但它对我不起作用。知道吗? 编辑: 我的项目是一个在apache tomcat服务器上运行的restful网络服务。我试着在多普斯特函数中调用lda算法。 编辑2 Mallet是一个开源库。所以我试着阅读代码