Dart 如何重建颤振中的所有网格项?
我有一个用网格表示的仪表板,它应该在长按事件(使用)中删除项目,但它删除最后一个项目而不是选中的项目。所有调试打印显示,所需的元素实际上已从列表中删除,但视图层仍保留该元素 我的构建功能代码:Dart 如何重建颤振中的所有网格项?,dart,flutter,bloc,Dart,Flutter,Bloc,我有一个用网格表示的仪表板,它应该在长按事件(使用)中删除项目,但它删除最后一个项目而不是选中的项目。所有调试打印显示,所需的元素实际上已从列表中删除,但视图层仍保留该元素 我的构建功能代码: Widget build(BuildContext context) { double pyxelRatio = MediaQuery.of(context).devicePixelRatio; double width = MediaQuery.of(context).size.wi
Widget build(BuildContext context) {
double pyxelRatio = MediaQuery.of(context).devicePixelRatio;
double width = MediaQuery.of(context).size.width * pyxelRatio;
return BlocProvider(
bloc: _bloc,
child: BlocBuilder<Request, DataState>(
bloc: _bloc,
builder: (context, state) {
if (state is EmptyDataState) {
print("Uninit");
return Center(
child: CircularProgressIndicator(),
);
}
if (state is ErrorDataState) {
print("Error");
return Center(
child: Text('Something went wrong..'),
);
}
if (state is LoadedDataState) {
print("empty: ${state.contracts.isEmpty}");
if (state.contracts.isEmpty) {
return Center(
child: Text('Nothing here!'),
);
} else{
print("items count: ${state.contracts.length}");
print("-------");
for(int i = 0; i < state.contracts.length; i++){
if(state.contracts[i].isFavorite)print("fut:${state.contracts[i].name} id:${state.contracts[i].id}");
}
print("--------");
List<Widget> testList = new List<Widget>();
for(int i = 0; i < state.contracts.length; i++){
if(state.contracts[i].isFavorite) testList.add(
InkResponse(
enableFeedback: true,
onLongPress: (){
showShortToast();
DashBLOC dashBloc = BlocProvider.of<DashBLOC>(context);
dashBloc.dispatch(new UnfavRequest(state.contracts[i].id));
},
onTap: onTap,
child:DashboardCardWidget(state.contracts[i])
)
);
}
return GridView.count(
crossAxisCount: width >= 900 ? 2 : 1,
padding: const EdgeInsets.all(2.0),
children: testList
);
}
}
})
);
}
小部件构建(构建上下文){
double pyxelRatio=MediaQuery.of(context.devicePixelRatio);
double width=MediaQuery.of(context).size.width*pyxelRatio;
返回BlocProvider(
集团:集团,
孩子:BlocBuilder(
集团:集团,
生成器:(上下文、状态){
如果(状态为EmptyDataState){
打印(“取消打印”);
返回中心(
子对象:CircularProgressIndicator(),
);
}
如果(状态为ErrorDataState){
打印(“错误”);
返回中心(
孩子:文本(‘出了点问题……),
);
}
如果(状态为LoadedDataState){
打印(“空:${state.contracts.isEmpty}”);
if(state.contracts.isEmpty){
返回中心(
child:Text('Nothing here!'),
);
}否则{
打印(“项目计数:${state.contracts.length}”);
打印(“----”);
for(int i=0;i=900?2:1,
填充:常数边集全部(2.0),
儿童:测试列表
);
}
}
})
);
}
及
看起来栅格会自行重建,但不要重建其平铺。
如何使用网格小部件的所有子小部件完全更新网格小部件
我已经花了两天的时间修好了,请帮忙
您的代码总是发送int i的最后一个值 所以不是
for(int i = 0; i < state.contracts.length; i++){
if(state.contracts[i].isFavorite) testList.add(
InkResponse(
enableFeedback: true,
onLongPress: (){
showShortToast();
DashBLOC dashBloc = BlocProvider.of<DashBLOC>(context);
dashBloc.dispatch(new UnfavRequest(state.contracts[i].id));
},
onTap: onTap,
child:DashboardCardWidget(state.contracts[i])
)
);
for(int i=0;i
做
List testList=newlist();
state.contracts.forEach((合同){
if(contract.isFavorite)testList.add(
墨水反应(
启用反馈:正确,
onLongPress:(){
showShortToast();
DashBLOC DashBLOC=BlocProvider.of(上下文);
dashBloc.dispatch(新的UnforRequest(contract.id));
},
onTap:onTap,
子项:DashboardCardWidget(合同)
)
));
它实际上是重建的吗?我只是不明白为什么要将状态与BLoC一起使用。即使使用状态,也应该调用setState()方法来用新数据更新小部件。
在我看来,最好的解决方案是尝试从无状态widget继承您的widget,并调用DashBLOC构造函数中的分派(new UpdateRequest();
还要始终记住关于集团的链接,这里有很多例子:
我认为应该使用GridView.builder
构造函数指定生成函数,该函数将在项目列表中发生更改时更新,因此当数据中发生任何更新时,BlocBuilder
将触发GridView
中的生成函数
我希望这个例子能更清楚地说明这一点
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Test(),
);
}
}
class Test extends StatefulWidget {
@override
_TestState createState() => _TestState();
}
class _TestState extends State<Test> {
List<int> testList = List<int>();
@override
void initState() {
for (int i = 0; i < 20; i++) {
testList.add(i);
}
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
floatingActionButton: FloatingActionButton(
//Here we can remove an item from the list and using setState
//or BlocBuilder will rebuild the grid with the new list data
onPressed: () => setState(() {testList.removeLast();})
),
body: GridView.builder(
// You must specify the items count of your grid
itemCount: testList.length,
// You must use the GridDelegate to specify row item count
// and spacing between items
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 5,
childAspectRatio: 1.0,
crossAxisSpacing: 1.0,
mainAxisSpacing: 1.0,
),
// Here you can build your desired widget which will rebuild
// upon changes using setState or BlocBuilder
itemBuilder: (BuildContext context, int index) {
return Text(
testList[index].toString(),
textScaleFactor: 1.3,
);
},
),
);
}
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:主题数据(
主样本:颜色。蓝色,
),
主页:Test(),
);
}
}
类测试扩展了StatefulWidget{
@凌驾
_TestState createState();
}
类_TestState扩展状态{
List testList=List();
@凌驾
void initState(){
对于(int i=0;i<20;i++){
添加(i);
}
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(),
浮动操作按钮:浮动操作按钮(
//在这里,我们可以使用setState从列表中删除一项
//或者BlocBuilder将使用新的列表数据重建网格
onPressed:()=>setState((){testList.removeLast();})
),
正文:GridView.builder(
//必须指定网格的项目数
itemCount:testList.length,
//必须使用GridDelegate指定行项目计数
//以及项目之间的间距
gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:5,
childAspectRatio:1.0,
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Test(),
);
}
}
class Test extends StatefulWidget {
@override
_TestState createState() => _TestState();
}
class _TestState extends State<Test> {
List<int> testList = List<int>();
@override
void initState() {
for (int i = 0; i < 20; i++) {
testList.add(i);
}
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
floatingActionButton: FloatingActionButton(
//Here we can remove an item from the list and using setState
//or BlocBuilder will rebuild the grid with the new list data
onPressed: () => setState(() {testList.removeLast();})
),
body: GridView.builder(
// You must specify the items count of your grid
itemCount: testList.length,
// You must use the GridDelegate to specify row item count
// and spacing between items
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 5,
childAspectRatio: 1.0,
crossAxisSpacing: 1.0,
mainAxisSpacing: 1.0,
),
// Here you can build your desired widget which will rebuild
// upon changes using setState or BlocBuilder
itemBuilder: (BuildContext context, int index) {
return Text(
testList[index].toString(),
textScaleFactor: 1.3,
);
},
),
);
}
}
return GridView.builder(
itemCount: children.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(3),
itemBuilder: (context, index) {
return Container(
key: ValueKey(children.length+index),
);
});