我有一个从 Json 填充 listView 的 futureBuilder。
在列表的每次迭代中,我都调用了一个自定义小部件,它返回一张卡片。
奇迹般有效。但是每当我尝试在我的子小部件中添加交互性时,就像一个提升按钮......什么都没有发生。
是否甚至可以在 futurebuilder 列表视图中添加交互性???我的意思是,我知道它是有状态的。我的问题可能与它有关吗?
无论如何我可以解决这个问题吗?
Future<List> get campaignList async {
String jwt = await userToken;
var url = Uri.parse('[API_URL]');
var response = await http.get(
url,
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer $jwt',
},
);
List<dynamic> list = json.decode(response.body);
return list;
}
....................
FutureBuilder<List>(
future: campaignList,
builder: (BuildContext context,
AsyncSnapshot<List> snapshot) {
List<Widget> children;
children = <Widget>[];
if (snapshot.hasData) {
var campaignList = snapshot.data;
campaignList!
.forEach((campaign) => children += <Widget>[
CampaignCard(
id: campaign['id'],
title: campaign['title'],
operatingModeId:
campaign['operating_mode_id'],
coringTypeId:
campaign['coring_type_id'],
createdAt: campaign['created_at'],
status: campaign['status'],
statusId: campaign['status_id'],
done: campaign['done'],
total: campaign['total'])
]);
} else {
if (snapshot.hasError) {
children = <Widget>[Text('${snapshot.error}')];
} else {
children = <Widget>[Text('Loading')];
}
}
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: children,
),
);
})
.....................
import 'dart:convert';
import 'package:flutter/material.dart';
//++import 'package:intl/intl.dart';
import 'package:percent_indicator/percent_indicator.dart';
import '../colors.dart';
import '../map_screen.dart';
import 'package:jiffy/jiffy.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:http/http.dart' as http;
class CampaignCard extends StatefulWidget {
CampaignCard(
{Key? key,
required this.id,
required this.title,
required this.operatingModeId,
required this.coringTypeId,
required this.createdAt,
required this.status,
required this.statusId,
required this.done,
required this.total})
: super(key: key);
final int id;
final String title;
final int operatingModeId;
final int coringTypeId;
final String createdAt;
final String status;
final int statusId;
final int done;
final int total;
final _storage = FlutterSecureStorage();
Future<String> get userToken async {
var jwt = await _storage.read(key: "token");
if (jwt == null) return "Votre compte n\' a pas pu être identifié.";
return jsonDecode(jwt);
}
Future<String> get coringType async {
String jwt = await userToken;
var url = Uri.parse('https://api-dev.maorie.com/api/campaigns');
var response = await http.get(
url,
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer $jwt',
},
);
String string = json.decode(response.body);
return string;
}
@override
_CampaignCardState createState() => _CampaignCardState();
}
class _CampaignCardState extends State<CampaignCard>
with SingleTickerProviderStateMixin {
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
final percent = widget.done / widget.total;
return Card(
elevation: 5,
child: ClipRect(
child: Padding(
padding: EdgeInsets.all(7),
child: Stack(children: <Widget>[
Align(
alignment: Alignment.centerRight,
child: Stack(
children: <Widget>[
Padding(
padding: const EdgeInsets.only(left: 10, top: 5),
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
widget.title,
style: TextStyle(
fontWeight: FontWeight.bold, fontSize: 20),
),
Chip(
label: Text(widget.coringTypeId.toString(),
style: TextStyle(color: Colors.white)),
backgroundColor:
generateMaterialColor(Palette.tiro),
),
]),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
'${Jiffy(widget.createdAt).yMMMd}',
),
]),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
DataTable(
columnSpacing: 100.0,
columns: const <DataColumn>[
DataColumn(
label: Text(
'Carottes',
),
),
DataColumn(
label: Text(
'Matériau',
),
),
],
rows: <DataRow>[
DataRow(
cells: <DataCell>[
DataCell(Text(widget.total.toString(),
textAlign: TextAlign.center)),
DataCell(Text(
widget.operatingModeId.toString())),
],
),
],
),
]),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(25.0),
child: new CircularPercentIndicator(
radius: 100.0,
lineWidth: 10.0,
percent: percent,
animation: true,
center: Text("${percent * 100}%"),
backgroundColor: Colors.grey,
progressColor:
generateMaterialColor(Palette.ponga),
)),
]),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(25.0),
child: ElevatedButton(
onPressed: () => Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MapScreen(
campaignId: widget.id))),
child: Text('Voir sur la carte')),
),
]),
],
))
],
),
)
]),
)),
);
}
}