问题描述
是否有更好的异步方式将数据按需加载到Cupertinopicker?
我基本上要做的是监听滚动事件,并检测Cupertinopicker是否滚动到起点之外,并在“数据”加载期间显示一个微调框。我将微调框插入到根据数据构建的小部件列表中,并在将新的小部件添加到列表中时将其删除。
我不能说是什么让我想知道是否有更好的方法,但是我认为应该有解决这个问题的更好的方法。
import 'package:Flutter/material.dart';
import 'package:Flutter/cupertino.dart';
void main(){
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
List<Widget> items = [Divider(color: Colors.red)];
bool refreshInProgress = false;
loadMoreData() {
if(refreshInProgress) return;
setState(() {
refreshInProgress = true;
});
items.insert(0,FutureBuilder(
future: Future.delayed(Duration(seconds: 2)).then((value) {
var newItems = [Text("A"),Text("B"),Text("C")];
setState((){
items = [...newItems,...items.where((w) => !(w is FutureBuilder) || w == null)];
refreshInProgress = false;
});
return newItems;
}),builder: (context,snapshot) {
if(snapshot.connectionState == ConnectionState.waiting) return Center(child: CircularProgressIndicator());
return null;
},));
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(child: Container(
margin: EdgeInsets.all(20),child: Column(children: [
Expanded(flex: 4,child: NotificationListener<ScrollNotification>(
onNotification: (ScrollNotification notification) {
if ((notification is ScrollEndNotification) && notification.metrics.pixels <= 0) {
loadMoreData();
return true;
}
return false;
},child: Cupertinopicker.builder(
itemExtent: 32,itemBuilder: (BuildContext context,int index) {
if(index >= 0 && index < items.length) return Center(child: items[index]);
return null;
},onselecteditemchanged: (int value) {
print("onselecteditemchanged: $value");
},))
),Expanded(child: Container(child: Text("$items"))),Row(children: [
RaisedButton(onpressed: () => setState(() => loadMoreData()),child: Text("Load more data")),])
],)),);
}
}
https://dartpad.dev/b27137f4bff39281980f5957f5e140ad
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)