【发布时间】:2021-04-27 15:02:46
【问题描述】:
- WallStream 类为我提供了一个字符串流,在应用运行时每 1 秒递增一次
- 我正在使用来自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();
}
- 我还在这里查找了源代码(https://raw.githubusercontent.com/ech89899/spannablegrid-flutter/master/lib/spannable_grid.dart - 我认为它尚未使用最新代码进行更新,但我尝试使用在 repo 上看到的代码并且遇到了同样的问题)。我不明白为什么每当我看到流数据发生变化但 cell.Child 没有最新数据时,就会调用
class _SpannableGridDelegate extends MultiChildLayoutDelegate中的 performLayout。
请帮忙。提前谢谢你。
【问题讨论】: