我一直在评估Flutter是否适用于应用程序,并从一个非常简单的文本列表示例开始。在构建了这个第一个视图之后,我注意到列表视图滚动不流畅,因此我仔细查看了展示应用程序,结果发现例如Reflectly是一个美丽的应用程序,但它也存在同样的问题-只有一个简单的文本列表却出现了非常卡顿的滚动。到目前为止,我已经在iOS模拟器,iPhone XR,三星Galaxy Android设备和Android Pixel 2 XL模拟器上确认了这一点。
我没有看到关于这个问题的讨论,所以我想知道我是否做错了什么,但也怀疑我的例子如此简单,而Reflectly也有相同的问题。
我希望社区能够理解: 1.我是否明显地做错了什么导致这种情况? 2.如果您在您的设备上运行,您是否看到与我相同的情况? 3.这是否已知并将得到解决?如果我承诺使用Flutter,我是否可以放心,在不久的将来我的列表将平稳滚动?
以下是您可以运行以重现此问题的代码(抱歉,它有点牵强,但我想尝试各种Flutter / Dart功能):
我没有看到关于这个问题的讨论,所以我想知道我是否做错了什么,但也怀疑我的例子如此简单,而Reflectly也有相同的问题。
我希望社区能够理解: 1.我是否明显地做错了什么导致这种情况? 2.如果您在您的设备上运行,您是否看到与我相同的情况? 3.这是否已知并将得到解决?如果我承诺使用Flutter,我是否可以放心,在不久的将来我的列表将平稳滚动?
以下是您可以运行以重现此问题的代码(抱歉,它有点牵强,但我想尝试各种Flutter / Dart功能):
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My List',
home: Scaffold(
appBar: AppBar(
title: Text('My List'),
backgroundColor: Color.fromRGBO(255, 0, 0, 0.9),
),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
children: [
Expanded(child: TimeSelector()),
],
)),
));
}
}
abstract class ListItem {}
class TimeHeader implements ListItem {
final String header;
TimeHeader(this.header);
}
class TimeOption implements ListItem {
final String timeString;
final String meridian;
TimeOption(this.timeString, this.meridian);
}
final List<ListItem> litems = [
TimeHeader("Morning"),
TimeOption("10:00", "am"),
TimeOption("10:30", "am"),
TimeOption("11:30", "am"),
TimeHeader("Afternoon"),
TimeOption("1:00", "pm"),
TimeOption("1:30", "pm"),
TimeOption("2:30", "pm"),
TimeHeader("Night"),
TimeOption("5:30", "pm"),
TimeOption("6:30", "pm"),
TimeOption("7:30", "pm"),
TimeOption("8:30", "pm"),
TimeOption("9:30", "pm"),
TimeOption("10:30", "pm"),
TimeOption("11:30", "pm"),
TimeOption("11:45", "pm"),
TimeOption("11:49", "pm"),
];
class TimeSelector extends StatelessWidget {
final _headerFont = new TextStyle(fontWeight: FontWeight.w600, fontSize: 13.0, color: Color.fromRGBO(164, 164, 164, 1));
final _smallerFont = const TextStyle(fontSize: 12.0);
@override
ListView build(BuildContext context) {
return new ListView.builder(
padding: const EdgeInsets.all(16.0),
itemCount: litems.length,
itemBuilder: (BuildContext ctxt, int index) => _buildItem(ctxt, index),
);
}
Widget _buildItem(BuildContext ctxt, int index) {
final item = litems[index];
if (item is TimeHeader) {
return new ListTile(
title: Text(
item.header,
style: _headerFont,
),
);
} else if (item is TimeOption) {
return new ListTile(
title: Text(
item.timeString + item.meridian.toUpperCase(),
style: _smallerFont,
),
);
} else {
return new Text("UNKNOWN");
}
}
}