【发布时间】:2020-12-14 19:42:33
【问题描述】:
我试图实现这种前景。 [1]:https://i.stack.imgur.com/6COFI.png 这是我第一次使用提供程序。相同的代码在 todo 应用中运行良好。但我无法为这个应用程序编写代码。我试图调整代码,但徒劳无功。
报错信息是,══╡异常捕捉到手势╞═══════════════════════════════════════ ═════════════════════════════════ 处理手势时抛出了以下断言:试图监听暴露的值与提供者一起,从小部件树的外部。
这可能是由调用 Provider.of 而不传递 listen: false 的事件处理程序(如按钮的 onPressed)引起的。
要修复,写:Provider.of(context, listen: false);
它不受支持,因为当小部件树不关心值时,可能会毫无意义地重建与事件处理程序关联的小部件。
使用的上下文是:AddPlayersScreen(state: _AddPlayersScreenState#da0e7) 'package:provider/src/provider.dart':断言失败:第 242 行 pos 7:'context.owner.debugBuilding || 听 == 假 || debugIsInInheritedProviderUpdate'
当异常被抛出时,这是堆栈: #2 Provider.of (package:provider/src/provider.dart:242:7) #3 _AddPlayersScreenState.build。 (包:badminton_app/screens/add_players_screen.dart:73:34) #4 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:992:19) #5 _InkResponseState.build。 (包:flutter/src/material/ink_well.dart:1098:38) #6 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:184:24) #7 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:524:11) #8 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:284:5) #9 BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:256:7) #10 GestureArenaManager.sweep(包:flutter/src/gestures/arena.dart:158:27) #11 GestureBinding.handleEvent(包:flutter/src/gestures/binding.dart:224:20) #12 GestureBinding.dispatchEvent(包:flutter/src/gestures/binding.dart:200:22) #13 GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:158:7) #14 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:104:7) #15 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:88:7) #19 _invoke1 (dart:ui/hooks.dart:267:10) #20 _dispatchPointerDataPacket (dart:ui/hooks.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,
);
});
}
}
有人可以帮我解决这个问题吗?这件事在脑子里搞了好几天。提前致谢。
【问题讨论】:
-
从我读到的错误中说:要修复,请写:Provider.of(context, listen: false);
-
我无法通过添加来更新我的 UI。
-
然后在代码重建 UI 之后调用
setState((){})