自5个月以来,我一直在开发一款流畅的应用程序。直到昨天一切都很好。今天,我将Flutter升级到了最新版本1.20.1,该应用开始崩溃。
我有一个带有两个标签的屏幕。 第一个选项卡包含ListView,用户可以在其中选择要构建的GridView项的数量,然后动画显示第二个选项卡,其中包含用于构建所选项的GridView。 要构建的网格项目数存储在 _chapterCount 变量中。
到昨天为止,它的运行状况还算不错,但是升级后却无法正常运行。也没有任何例外。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../models/book.dart';
import '../providers/font.dart';
class ChoiceScreen extends StatefulWidget {
@override
_ChoiceScreenState createState() => _ChoiceScreenState();
}
class _ChoiceScreenState extends State<ChoiceScreen> {
int _chapterCount = 0;
int _id = 0;
int _initialIndex = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Consumer<FontManager>(builder: (context, manager, _) {
return DefaultTabController(
length: 2,
initialIndex: _initialIndex,
child: Scaffold(
appBar: AppBar(
title: TabBar(
tabs: [
Tab(
child: Text(
'Book',
style: TextStyle(fontSize: manager.fontSize),
),
),
Tab(
child: Text(
'Chapter',
style: TextStyle(fontSize: manager.fontSize),
),
),
],
),
),
body: TabBarView(
children: [
ListView.builder(
itemCount: BOOK.length,
itemBuilder: (ctx, i) {
return buildListTile(
ctx,
BOOK.firstWhere((test) => test.id == i + 1),
manager.fontSize);
},
),
buildGridView(manager, context, _chapterCount),
],
),
),
);
}),
);
}
GridView buildGridView(
FontManager manager, BuildContext context, int chapterCount) {
print('building gridView $chapterCount'); //Updated value is printed here but no element gets built
return GridView.builder(
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 50,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
),
itemCount: chapterCount,
itemBuilder: (ctx, i) {
return InkWell(
child: Container(
child: Center(
child: Text(
(i + 1).toString(),
style:
TextStyle(color: Colors.white, fontSize: manager.fontSize),
),
),
decoration: BoxDecoration(color: Colors.deepPurple),
),
onTap: () {
Navigator.of(context).pop({
'chapter': i,
'id': _id,
});
},
);
},
);
}
Widget buildListTile(BuildContext ctx, Book book, double fontSize) {
return InkWell(
child: ListTile(
leading: Text((book.id).toString()),
title: Text(
book.title,
style: TextStyle(fontSize: fontSize),
),
),
onTap: () {
setState(() {
_chapterCount = book.chapter;
_id = book.id;
});
DefaultTabController.of(ctx).animateTo(1);
},
);
}
}
调用setState时,将重新生成小部件,并且 _chapterCount 变量也会更新。甚至gridView生成器功能都可以获取更新的 _chapterCount ,但不会生成。 奇怪的是,在调用setState之后,我从VSCode热重载时,GridView会生成项。