【问题标题】:Why doesn't the UI in Flutter's SpannableGrid widget refresh to update with latest content from stream of String?为什么 Flutter 的 SpannableGrid 小部件中的 UI 不刷新以使用 String 流中的最新内容进行更新?
【发布时间】:2021-04-27 15:02:46
【问题描述】:
  1. WallStream 类为我提供了一个字符串流,在应用运行时每 1 秒递增一次
  2. 我正在使用来自https://pub.dev/packages/spannable_grid 的 spannable_grid。每当流内容发生变化时,我都希望 _buildData 也会发生变化(它确实会发生变化,因为第 27 行的打印值)。然后,我将带有更新内容的新 SpannableGridCellData 添加到列表中,并根据更新的单元格返回一个新的 SpannableGrid 小部件。我希望 UI 会更改以显示新内容,但事实并非如此。为什么不呢?

pubspec.yaml

  spannable_grid: ^0.1.3
  provider: ^3.1.0

main.dart

import 'dart:math';

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:spannable_grid/spannable_grid.dart';

void main() => runApp(MaterialApp(home: WallPane()));

class WallPane extends StatefulWidget {
  @override
  _WallPaneState createState() => _WallPaneState();
}

class _WallPaneState extends State<WallPane> {
  @override
  Widget build(BuildContext context) {
    return StreamProvider<String>.value(
        value: WallStream.instance.wallStateStream,
        child: new LayoutBuilder(
            builder: (BuildContext context, BoxConstraints constraints) {
          return _buildData(context, constraints);
        }));
  }

  Widget _buildData(BuildContext context, BoxConstraints constraints) {
    String content = Provider.of<String>(context);
    print(content);

    List<SpannableGridCellData> cells = List();
    cells.add(SpannableGridCellData(
      column: 1,
      row: 1,
      columnSpan: 2,
      rowSpan: 2,
      id: content,
      child: Container(
        color: Colors.lime,
        child: Center(
          child: Text(content),
        ),
      ),
    ));

    return SpannableGrid(
      columns: 4,
      rows: 4,
      cells: cells,
      spacing: 2.0,
      onCellChanged: (cell) {
        print('Cell ${cell.id} changed');
      },
    );
  }
}

class WallStream {
  static int _counter = 0;

  Stream<String> get wallStateStream async* {
    while (true) {
      yield (_counter++).toString();
      await Future.delayed(Duration(seconds: 1));
    }
  }

  WallStream._privateConstructor();
  static final WallStream instance = WallStream._privateConstructor();
}
  1. 我还在这里查找了源代码(https://raw.githubusercontent.com/ech89899/spannablegrid-flutter/master/lib/spannable_grid.dart - 我认为它尚未使用最新代码进行更新,但我尝试使用在 repo 上看到的代码并且遇到了同样的问题)。我不明白为什么每当我看到流数据发生变化但 cell.Child 没有最新数据时,就会调用 class _SpannableGridDelegate extends MultiChildLayoutDelegate 中的 performLayout。

请帮忙。提前谢谢你。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我是SpannableGrid 包的作者。感谢您使用它并提供反馈。

    包中有错误。我为此添加了一个修复程序。请检查 0.1.4+ 版本是否适合您。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多