如何解决Flutter-如何在Flutter中将滚动视图添加到具有ListView的列
我有一个容器,该容器的列包含三个容器和一个用expand包裹的listview,可以很好地工作,但是我正在尝试向整个容器中添加一个滚动视图,以便在三个带有listview的滚动中,请问如何实现这一点?下面是我的代码。
List<Content> content = [];
_fetchComments() async {
setState(() {
isLoading = true;
_isDealButtonRefresh = true;
});
try {
final result = await InternetAddress.lookup('google.com');
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
print('connected');
String baseURL;
debugPrint("my select:$_mySelection");
if (_mySelection == null && _myFeatureSelection == null) {
baseURL = "myjson link";
} else if (_myFeatureSelection != null) {
baseURL =
"my json link" +
_myFeatureSelection;
debugPrint("feature enter");
_mySelection = null;
} else if (_mySelection != null && _myFeatureSelection == null) {
baseURL = "my json link" +
_mySelection;
}
print("our url:$baseURL");
final response = await http.get(baseURL);
if (response.statusCode == 200) {
print(response.body);
content = (json.decode(response.body) as List)
.map((data) => new Content.fromJson(data))
.toList();
setState(() {
print(response.body);
isLoading = false;
_isDealButtonRefresh = false;
});
} else {
print(response.body);
throw Exception('Failed to load post');
}
}
} on SocketException catch (_) {
print('not connected');
setState(() => isLoading = false);
Navigator.pushReplacement(
context,new MaterialPageRoute(
builder: (BuildContext context) => NoInternet()));
}
}
initState() {
super.initState();
_fetchComments();
}
body: Container(
child: Column(children: <Widget>[
Container(),Container(),Expanded(child: ListView.separated(
separatorBuilder:
(context,index) => Divider(
color: Colors.grey,),itemCount: content == null
? 0
: _searchResult.length,itemBuilder:
(context,position) {
final current =
_searchResult[position];
double myrate = double.parse(
_searchResult[position]
.ratings ==
null
? "0"
: _searchResult[position]
.ratings);
debugPrint("rato:$myrate");
return FutureBuilder<String>(
future: getDistance(
current.lat,current.lng)
.then((value) =>
value.toString()),builder:
(context,snapshot) {
return Container(
child:
GestureDetector(
onTap: () {
Navigator.push(
context,CupertinoPageRoute(
builder: (BuildContext ctx) => Maps(_searchResult[position])));
},child:
Column(
children: <
Widget>[
Row(
children: <
Widget>[
Expanded(
child:Container(
height:150,width: MediaQuery.of(context).size.width,child: SizedBox(
child: FadeInImage(image: NetworkImage(_searchResult[position].thumbnail_name),placeholder: AssetImage("assets/640x360.png"),fit: BoxFit.cover,)),],Container(
padding:
const EdgeInsets.all(5.0),child:
Row(
crossAxisAlignment:
CrossAxisAlignment.start,children: <Widget>[
Expanded(
child: Column(
children: <Widget>[
Container(
padding: const EdgeInsets.only(bottom: 1.0),child: Text(
_searchResult[position].title,style: TextStyle(fontFamily: 'Montserrat',fontSize: 13,fontWeight: FontWeight.bold),Container(
padding: const EdgeInsets.only(bottom: 1.0),child: Text(
_searchResult[position].address,maxLines: 2,fontSize: 10,color: Colors.black54),child: _status != PermissionStatus.denied
? snapshot.hasData
? Text(
snapshot.data + " " + "km",maxLines: 1,fontWeight: FontWeight.bold,color: colorBlue),)
: SizedBox(
child: CircularProgressIndicator(
valueColor: new AlwaysStoppedAnimation<Color>(
colorBlue,strokeWidth: 1,height: 5.0,width: 5.0,)
: Icon(
Icons.do_not_disturb,color: Colors.red,size: 15,SizedBox(
height: 2,Container(
child: Text(
_searchResult[position].price + " " + "USD",style: TextStyle(
color: colorPink,fontSize: 12,fontFamily: 'Montserrat',)
],crossAxisAlignment: CrossAxisAlignment.start,flex: 9,Column(
children: <Widget>[
Container(
padding: const EdgeInsets.only(bottom: 0),child: SmoothStarRating(
allowHalfRating: false,onRatingChanged: (v) {
setState(() {});
},starCount: 5,rating: myrate,size: 12.0,filledIconData: Icons.star,halfFilledIconData: Icons.star_half,color: Colors.orange,borderColor: Colors.orange,spacing: 0.0)),Text(
"(" + myrate.toStringAsFixed(1) + ")",style: TextStyle(color: Colors.black,fontStyle: FontStyle.normal),)
],)
],)));
});
}))
])
)
在上面的代码中,listview从json rest API获取数据。
解决方法
因此,经过几个月的研究,终于可以通过给出每个容器的高度来解决此问题。由于我希望listview的高度能够覆盖活动中的大部分空间,因此我没有使用ListView设置Container的高度。首先,我将上面的#include<stdio.h>
int summation(int);
int main(){
int val,sum;
scanf("%d",&val);
sum=summation(val<0?-val:val);//We need the absolute value
printf("%d",sum);
return 0;
}
//Get the sum recurcively
int summation(int v){
if(v==0)
return 0;
return (v%10)+summation(v/10);//v%10 is the reminder which is the last digit
}
更改为package com.examplehub.sorts;
public class BubbleSortRecursion implements Sort {
@Override
public void sort(int[] numbers) {
sortRecursion(numbers,numbers.length);
}
/**
* BubbleSort algorithm implements using recursion.
*
* @param numbers the numbers to be sorted.
* @param length the length of numbers.
*/
public void sortRecursion(int[] numbers,int length) {
boolean swapped = false;
for (int i = 0; i < length - 1; ++i) {
if (numbers[i] > numbers[i + 1]) {
int temp = numbers[i];
numbers[i] = numbers[i + 1];
numbers[i + 1] = temp;
swapped = true;
}
}
if (!swapped) {
return;
}
sortRecursion(numbers,length - 1);
}
@Override
public <T extends Comparable<T>> void sort(T[] array) {
sortRecursion(array,array.length);
}
/**
* Generic BubbleSort algorithm implements using recursion.
*
* @param array the array to be sorted.
* @param length the length of array.
* @param <T> the class of the objects in the array.
*/
public <T extends Comparable<T>> void sortRecursion(T[] array,int length) {
boolean swapped = false;
for (int i = 0; i < length - 1; ++i) {
if (array[i].compareTo(array[i + 1]) > 0) {
T temp = array[i];
array[i] = array[i + 1];
array[i + 1] = temp;
swapped = true;
}
}
if (!swapped) {
return;
}
sortRecursion(array,length - 1);
}
}
,设置了ListView Expanded()
。在下面找到我的更新代码:
Container()
,
您可以将3个内部容器添加为listview的子容器。
类似这样的东西:
Widget getListView(yourListWithData) {
List<Widget> listViewChildren = [
Container(),Container(),];
listViewChildren.addAll(
yourListWithData
.map(
(e) => Text(e),//text widget as an example,use your own widget
)
.toList(),);
return ListView(
children: listViewChildren,);
}
然后您可以摆脱Column并使Listview成为父容器的唯一子项:
Container(
child: getListView(yourListWithData),);
,
要解决此问题:
-
在
SingleChildScrollView
属性的开头添加physics: ClampingScrollPhysics()
小部件。 -
向列表视图添加
shrinkWrap: true
属性。SingleChildScrollView( scrollDirection: Axis.vertical,physics: ClampingScrollPhysics(),child: Container( child: Column( crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[ Container(),Expanded(child: Listview.builder(shrinkWrap: true,)) ]) )
希望对您有帮助
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。