【问题标题】:Do not reload the page after updating data with setState使用 setState 更新数据后不要重新加载页面
【发布时间】:2021-05-13 05:05:34
【问题描述】:

我想在单击星形图标时删除记录,但是当我单击星形图标更改 setState 中的值时,数据不会立即更新,而是必须重定向到另一个页面。那么,如何在点击星形图标后立即更新列表呢?感谢任何帮助!

我的代码:

Future<List<Favorite>> fetchFavorite() async{
  var requestHeaders = <String, String>{
    "Content-type": "application/json",
    "Accept": "application/json",
    "Authorization": "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ2YW50aHUiLCJpYXQiOjE2MjAyMTA4NzcsImV4cCI6MTYyMjgwMjg3N30.9QrtUCQpy-Jd_4b7YwLY6GXlEab4M2_NDLRipNcFF_iEmIIzX1JKlotu7L_WJbXTJgtpFYY9kIW3GY6zhAx-JA"
  };
  final response = await http.get(Uri.parse(URL1), headers: requestHeaders);
  print(response);
  // print(response.body);
  var decoded = utf8.decode(response.bodyBytes);
  var responseJson = json.decode(decoded);
  var rs = (responseJson['data']['content'] as List)
      .map((p) => Favorite.fromJson(p))
      .toList();

  return rs;
}
Future<Favorite> setFavorite(nodeId) async{
  var requestHeaders = <String, String>{
    "Content-type": "application/json",
    "Accept": "application/json",
    "Authorization": "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ2YW50aHUiLCJpYXQiOjE2MjAyOTAxMDQsImV4cCI6MTYyMjg4MjEwNH0.G7vSN6jU9Y-87qEiU4UeyLZN6JkuRTFnmqkkYLWvIJZ8yCUXFSU8cAbIZ-RxD6-4Pab_9yqTC9Yo5fFpVcpcIQ"
  };
  final response = await http.post(
      Uri.parse(URL_SETFAVORITE+nodeId),
    headers: requestHeaders,
    body: jsonEncode(null)
  );
  print(URL_SETFAVORITE+nodeId);
  if (response.statusCode == 200) {
    return Favorite.fromJson(json.decode(response.body));
  } else {
    throw Exception('Failed to update album.');
  }
}

还有:

class TableCategoryState extends State<TableCategory> {

  bool isButton = true;
  Future dataFuture;
  Future _futureFavorite;
  Widget star;
  SearchAppState searchAppState = SearchAppState();

  TableCategoryState();
  @override
  void initState(){
    super.initState();
    dataFuture = fetchFavorite();
  }

  @override
  Widget build(BuildContext context) {

    return SingleChildScrollView(
      scrollDirection: Axis.vertical,
      child: FittedBox(
        child: DataTable(
          dataRowHeight: 50,
          columnSpacing: 20,
          columns: <DataColumn>[
            DataColumn(
                label: Container(
                    child: Text('Danh mục')
                )
            ),
            DataColumn(
                label: Container(

                    child: Text('Loại')
                )
            ),
            DataColumn(
                label: Container(
                  child: Text('Ngày tạo')
                )
            ),
            DataColumn(label: Text('')),
          ],
          rows: widget.favorites?.map((Favorite e) {
            return DataRow(
                cells: <DataCell>[
                  DataCell(
                      Container(
                        width: 90,
                        child: Text(e.name, overflow: TextOverflow.ellipsis, maxLines: 2,),
                      ),
                  ),
                  DataCell(
                    Container(
                      width: 50,
                      child: e.type == 'folder' ? Text('Tài liệu') : Text('File')
                    ),
                  ),
                  DataCell(
                    Container(
                      width: 75,
                      child: Text(readTimestamp(e.timeCreate))
                    ),
                  ),
                  DataCell(
                    Container(
                      child: isButton
                          ? IconButton(
                          icon: Icon(
                            Icons.star, color: Colors.amber,
                          ),
                          onPressed: (){
                            setState(() {
                              setFavorite(e.nodeId);

                            });
                          })
                          : Container(child: Text('a'),),
                    ),
                ),
              ],
            );
          }).toList(),
        ),
      ),
    );
  }
}

【问题讨论】:

  • 您的标题和问题描述不匹配。我在您的代码中看不到任何与删除相关的内容。您能否改写您的描述以明确您的要求
  • 在 DataCell 的 setState 中,我执行 setFavorite() 函数。根据 nodeId 设置字段 favorite = false 并从列表中删除这条记录,但是在我成功设置它之后我不知道如何让列表再次更新而无需重新加载页面,你知道我的意思吗?

标签: flutter


【解决方案1】:

如果您想通过执行dataFuture = fetchFavorite(); anf 来更新您的列表,然后使用更新后的dataFuture,那么您应该考虑使用FutureBuilder。然后您可以在执行过程中更新您的 dataFuture 实例,FutureBuilder 将适应您的更改

class TableCategoryState extends State<TableCategory> {

  Future dataFuture;

  TableCategoryState();
  @override
  void initState(){
    super.initState();
    dataFuture = fetchFavorite();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: dataFuture
      builder: (context, snapshot){
        return SingleChildScrollView(
          ...
          onPressed: (){
            setState(() 
               setFavorite(e.nodeId);
               dataFuture = fetchFavorite(); // Update your list again here
            });
          })
        );
      }
    );
  }
}

【讨论】:

  • 这个方法我试过了,但是不行
  • 当你按下按钮时,它不会刷新你的列表?
  • 是的,即使数据已经更新
  • widget.favorites?.map((Favorite e) 这个你应该改变。不要使用父小部件,而是使用FutureBuilder 小部件的一种形式
  • 我有 1 个变量 bool 可以在 2 种显示类型之间进行更改,其余显示类型我使用 FutureBuilder 但仍然无法正常工作。嗯!
猜你喜欢
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 2022-12-22
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多