У меня есть ListView в столбце, и мне нужно добавить RefreshIndicator в ListView, но он не работает. Я пытался содержать listView с помощью Expanded, затем список отображался хорошо, но при вызове RefreshIndicator дамп приложения... кто-нибудь может мне помочь, как исправить этот код, спасибо
import 'dart:async';
import 'package:flutter/material.dart';
void main() {
runApp(new MaterialApp(
home: new MyApp(),
));
}
class MyApp extends StatefulWidget {
@override
State<StatefulWidget> createState() => MyAppState();
}
class MyAppState extends State<MyApp> {
List<int> items = List.generate(16, (i) => i);
Future<Null> _handleRefresh() async {
await Future.delayed(Duration(seconds: 5), () {
print('refresh');
setState(() {
items.clear();
items = List.generate(40, (i) => i);
return null;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Refresh"),
),
body: Column(
children: <Widget>[RefreshIndicator(child:
ListView.builder(
itemCount: items.length,
shrinkWrap: true,
itemBuilder: (context, index) {
return ListTile(
title: Text("Index$index"),
);
},
), onRefresh: _handleRefresh,)
],
)
);
}
}
это тест, в реальном приложении у меня есть серверный виджет в столбце
Хорошо, я отправил ответ.





У меня два замечания:
Expanded с параметром flex.return ничего делать в setState методе. import 'dart:async';
import 'package:flutter/material.dart';
void main() {
runApp(new MaterialApp(
home: new MyApp(),
));
}
class MyApp extends StatefulWidget {
@override
State<StatefulWidget> createState() => MyAppState();
}
class MyAppState extends State<MyApp> {
List<int> items = List.generate(16, (i) => i);
Future<Null> _handleRefresh() async {
await Future.delayed(Duration(seconds: 5), () {
print('refresh');
setState(() {
items.clear();
items = List.generate(40, (i) => i);
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Refresh"),
),
body: Column(
children: <Widget>[
Expanded(
flex: 1,
child: RefreshIndicator(
child: ListView.builder(
itemCount: items.length,
shrinkWrap: true,
itemBuilder: (context, index) {
return ListTile(
title: Text("Index$index"),
);
},
),
onRefresh: _handleRefresh,
),
)
],
),
);
}
}
Большое вам спасибо, это работает хорошо, поэтому причина в том, что мой расширенный файл помещен в неправильное место.
Ответ выше (от Тарека База) правильный, однако в некоторых особых случаях (например, глубокое/сложное дерево виджетов) этого может быть недостаточно, и вам может потребоваться передать параметр физики в функцию ListView.builder().
ListView.builder(
physics: const AlwaysScrollableScrollPhysics(),
itemCount: .... ... )
спасибо, это решает мою проблему, когда у меня есть Container и ListView внутри столбца
почему вы использовали
Columnвместо простогоContainer? у тебя только один ребенок