如何在 Flutter 中过滤和更新 ListViewBuilder?
How to filter and update ListViewBuilder in Flutter?
{
"data": [
{
"title": "Asignment 1 ",
"status": true,
"date" : "7/18/2020"
},
{
"title": "Asignment 2 ",
"status": false,
"date" : "7/18/2020"
},
{
"title": "Asignment 2 ",
"status": false,
"date" : "7/18/2020"
}
]
}
这是我从 API 获得的数据。
@override
void initState() {
_allTaskModel =
API_Manager().getAllTasksofUser(firebaseAuth.currentUser.uid);
super.initState();
}
@override
// Widget projectWidget() {
Widget build(BuildContext context) {
return FutureBuilder<AllTasksModel>(
future: _allTaskModel,
builder: (context, snapshot) {
if (snapshot.hasData) {
if (snapshot.data.response.data.length > 0) {
return ListView.builder(
itemCount: snapshot.data.response.data.length,
itemBuilder: (context, index) {
// UserDetailsModel userDetails = snapshot.data[index];
var tasks = snapshot.data.response.data[index];
return cardWidget(tasks);
});
} else
return Container(
child: Center(
child: Text('No Task found'),
));
} else {
try {
if (snapshot.data.response.data.length == 0) {
return Container(
child: Center(
child: Text('No Task found'),
));
}
} catch (e) {
return Center(child: CircularProgressIndicator());
}
}
},
);
}
我的 code.cardWidget() 基本上是 returns 包含任务数据的小部件。我想使用 SpeedDial 按钮根据状态将 listView 过滤为完整或不完整。当我单击 SpeedDial FloatingActionButtons 中的未完成按钮时,我想获得未完成任务列表。如何应用过滤器并更新列表?
如果我没理解错的话,你是从 api 加载的,你想要一个按钮
单击时仅显示未完成的任务。如果是,那么您可以这样做:
import 'package:flutter/material.dart';
void main() => runApp(App());
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Home(),
);
}
}
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
final tasks = {
"data": [
{"title": "Asignment 1 ", "status": true, "date": "7/18/2020"},
{"title": "Asignment 2 ", "status": false, "date": "7/18/2020"},
{"title": "Asignment 2 ", "status": false, "date": "7/18/2020"}
]
};
bool showOnlyIncomplete = false; // the value that controls which tasks will be shown
// this function toggles the showOnlyIncomplete value between false and true when
// clicked
void toggleShowOnlyIncomplete() =>
setState(() => showOnlyIncomplete = !showOnlyIncomplete);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: <Widget>[
ElevatedButton(
child: showOnlyIncomplete ? Text('Show all') : Text('Show only incomplete'),
onPressed: () => toggleShowOnlyIncomplete(),
),
Expanded(
child: ListView.builder(
itemCount: tasks['data'].length,
itemBuilder: (context, index) {
final task = tasks['data'][index];
// If we only want to show incompleted tasks and the current task
// is done we show an empty Container
if (showOnlyIncomplete && task['status'])
return Container();
return ListTile(
title: Text('${task['title'] ?? 'Unknown'}'),
subtitle: Text('${task['date'] ?? 'Unknown'}'),
trailing:
task['status'] ? Icon(Icons.check) : Icon(Icons.close),
);
},
),
),
],
),
);
}
}
{
"data": [
{
"title": "Asignment 1 ",
"status": true,
"date" : "7/18/2020"
},
{
"title": "Asignment 2 ",
"status": false,
"date" : "7/18/2020"
},
{
"title": "Asignment 2 ",
"status": false,
"date" : "7/18/2020"
}
]
}
这是我从 API 获得的数据。
@override
void initState() {
_allTaskModel =
API_Manager().getAllTasksofUser(firebaseAuth.currentUser.uid);
super.initState();
}
@override
// Widget projectWidget() {
Widget build(BuildContext context) {
return FutureBuilder<AllTasksModel>(
future: _allTaskModel,
builder: (context, snapshot) {
if (snapshot.hasData) {
if (snapshot.data.response.data.length > 0) {
return ListView.builder(
itemCount: snapshot.data.response.data.length,
itemBuilder: (context, index) {
// UserDetailsModel userDetails = snapshot.data[index];
var tasks = snapshot.data.response.data[index];
return cardWidget(tasks);
});
} else
return Container(
child: Center(
child: Text('No Task found'),
));
} else {
try {
if (snapshot.data.response.data.length == 0) {
return Container(
child: Center(
child: Text('No Task found'),
));
}
} catch (e) {
return Center(child: CircularProgressIndicator());
}
}
},
);
}
我的 code.cardWidget() 基本上是 returns 包含任务数据的小部件。我想使用 SpeedDial 按钮根据状态将 listView 过滤为完整或不完整。当我单击 SpeedDial FloatingActionButtons 中的未完成按钮时,我想获得未完成任务列表。如何应用过滤器并更新列表?
如果我没理解错的话,你是从 api 加载的,你想要一个按钮 单击时仅显示未完成的任务。如果是,那么您可以这样做:
import 'package:flutter/material.dart';
void main() => runApp(App());
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Home(),
);
}
}
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
final tasks = {
"data": [
{"title": "Asignment 1 ", "status": true, "date": "7/18/2020"},
{"title": "Asignment 2 ", "status": false, "date": "7/18/2020"},
{"title": "Asignment 2 ", "status": false, "date": "7/18/2020"}
]
};
bool showOnlyIncomplete = false; // the value that controls which tasks will be shown
// this function toggles the showOnlyIncomplete value between false and true when
// clicked
void toggleShowOnlyIncomplete() =>
setState(() => showOnlyIncomplete = !showOnlyIncomplete);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: <Widget>[
ElevatedButton(
child: showOnlyIncomplete ? Text('Show all') : Text('Show only incomplete'),
onPressed: () => toggleShowOnlyIncomplete(),
),
Expanded(
child: ListView.builder(
itemCount: tasks['data'].length,
itemBuilder: (context, index) {
final task = tasks['data'][index];
// If we only want to show incompleted tasks and the current task
// is done we show an empty Container
if (showOnlyIncomplete && task['status'])
return Container();
return ListTile(
title: Text('${task['title'] ?? 'Unknown'}'),
subtitle: Text('${task['date'] ?? 'Unknown'}'),
trailing:
task['status'] ? Icon(Icons.check) : Icon(Icons.close),
);
},
),
),
],
),
);
}
}