【发布时间】:2021-02-11 15:14:49
【问题描述】:
我正在尝试使用异步接收的消息填充 RichText 小部件。消息存储在 TextSpan 对象列表中。在附加的示例中,我将对象从计时器添加到列表中,但 RichText 小部件未显示新消息。有没有人能看到我做错了什么?
import 'package:flutter/material.dart';
import 'dart:async';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: TstWidget(name: 'tst'),
);
}
}
class TstWidget extends StatefulWidget {
final String name;
TstWidget({this.name});
@override
_TstWidgetState createState() => _TstWidgetState();
}
class _TstWidgetState extends State<TstWidget> {
Timer _timer;
int _idx = 10;
List<TextSpan> _messages = [];
@override
void initState() {
super.initState();
// Create a couple of initial messages just so see something in the RichText widget.
_messages.add(TextSpan(text: 'pre set message 1\n'));
_messages.add(TextSpan(text: 'pre set message 2\n'));
_timer = new Timer.periodic(new Duration(seconds: 1), (time) {
print('adding message $_idx');
setState(() {
_messages.add(TextSpan(text: 'this is message $_idx\n'));
});
if (--_idx == 0) {
print('timer complete');
_timer.cancel();
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.name),
),
body: Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Expanded(
child: Container(
decoration: BoxDecoration(border: Border.all(width: 1)),
margin: EdgeInsets.all(4.0),
padding: EdgeInsets.all(4.0),
child: RichText(
text: TextSpan(
children: _messages,
),
),
),
),
],
),
),
);
}
}
【问题讨论】: