即使在setState调用之后,Gridview也不会更新

时间:2020-08-08 12:58:28

标签: flutter dart gridview

自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会生成项。

0 个答案:

没有答案