【问题标题】:List View Builder Flutter列表视图生成器颤振
【发布时间】:2020-11-18 23:40:13
【问题描述】:

我正在尝试从全局变量类中获取数据,然后在 ListView 构建器中显示它,但 ListView 从全局变量数组返回 null。但是当我热重新加载页面时,它会在小部件中显示数据,但不会以初始状态显示。尝试使用初始化状态,Future 构建器,但打印显示全局变量数组不为空,但 ListView 构建器将其视为空数组。我是新来的。理论上变量不是在第一次运行时存储来自全局变量的数据,但是当刷新页面或从任何其他页面返回时,它会显示数据,请帮助我。

import 'package:flutter/material.dart';
import 'package:food_express/classes/AllShefMold.dart';
import 'package:food_express/classes/TodaysLunch.dart';
import 'package:food_express/classes/menuClass.dart';
import 'package:food_express/constant/constant.dart';
import 'package:food_express/pages/restaurant/restaurant.dart';
import 'package:page_transition/page_transition.dart';
import '../../../constant/globals.dart' as global;

class FavouriteRestaurantsList extends StatefulWidget {
  FavouriteRestaurantsList({Key key}) : super(key: key);
  @override
  _FavouriteRestaurantsListState createState() =>
      _FavouriteRestaurantsListState();
}

class _FavouriteRestaurantsListState extends State<FavouriteRestaurantsList> {
  List<TodaysLunch> listDetails = [];
  var restaurantsList;
  @override
  initState() {
     restaurantsList = getItems();
    super.initState();
  }

 List<TodaysLunch> getItems() {
    List<TodaysLunch> listDetails = [];
    for (var shef in global.NearBy) {
      for (var lunch in shef.totalMenu) {
        if (lunch.type == "Todays Menu") {
          for (var item in lunch.menu) {
            TodaysLunch menu = TodaysLunch(shef, item.id, item.Category,
                item.Details, item.DishName, item.Price);
            listDetails.add(menu);
          }
        }
      }
    }
    return listDetails;
  }

  @override
  Widget build(BuildContext context) {
      double width = MediaQuery.of(context).size.width;
      return Column(
        children: [
          Padding(
            padding: EdgeInsets.all(fixPadding),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: <Widget>[
                Text(
                  'Todays Lunch',
                  style: headingStyle,
                ),
                InkWell(
                  onTap: () {
                    // Navigator.push(context, PageTransition(type: PageTransitionType.downToUp, child: MoreList()));
                  },
                  child: Text('View all', style: moreStyle),
                ),
              ],
            ),
          ),
          Container(
              width: width,
              height: 170.0,
              child: ListView.builder(
                        itemCount: restaurantsList.length,
                        scrollDirection: Axis.horizontal,
                        physics: BouncingScrollPhysics(),
                        itemBuilder: (context, index) {
                          final item = restaurantsList[index];
                          return InkWell(
                            onTap: () {
                              // Navigator.push(context, MaterialPageRoute(builder: (context)=>Restaurant(item)));
                              Navigator.push(
                                  context,
                                  PageTransition(
                                      type: PageTransitionType.fade,
                                      child: Restaurant(item.mold)));
                            },
                            child: Container(
                              width: 130.0,
                              decoration: BoxDecoration(
                                color: whiteColor,
                                borderRadius: BorderRadius.circular(5.0),
                              ),
                              margin: (index != (restaurantsList.length - 1))
                                  ? EdgeInsets.only(left: fixPadding)
                                  : EdgeInsets.only(
                                      left: fixPadding, right: fixPadding),
                              child: Column(
                                crossAxisAlignment: CrossAxisAlignment.center,
                                mainAxisAlignment: MainAxisAlignment.start,
                                children: <Widget>[
                                  Container(
                                    height: 110.0,
                                    width: 130.0,
                                    alignment: Alignment.topRight,
                                    padding: EdgeInsets.all(fixPadding),
                                    decoration: BoxDecoration(
                                      borderRadius: BorderRadius.vertical(
                                          top: Radius.circular(5.0)),
                                      image: DecorationImage(
                                        image: NetworkImage(
                                            item.mold.DisplayImage),
                                        fit: BoxFit.cover,
                                      ),
                                    ),
                                    child: InkWell(),
                                  ),
                                  Container(
                                    width: 130.0,
                                    height: 50.0,
                                    child: Column(
                                      mainAxisAlignment:
                                          MainAxisAlignment.center,
                                      crossAxisAlignment:
                                          CrossAxisAlignment.start,
                                      children: <Widget>[
                                        Padding(
                                          padding: EdgeInsets.all(5.0),
                                          child: Text(
                                            item.DishName,
                                            style: listItemTitleStyle,
                                            maxLines: 1,
                                            overflow: TextOverflow.ellipsis,
                                          ),
                                        ),
                                        Padding(
                                          padding: EdgeInsets.only(
                                              left: 5.0, right: 5.0),
                                          child: Text(
                                            item.Details,
                                            style: listItemSubTitleStyle,
                                            maxLines: 1,
                                            overflow: TextOverflow.ellipsis,
                                          ),
                                        ),
                                      ],
                                    ),
                                  ),
                                ],
                              ),
                            ),
                          );
                        },
                      ))]);
                    }



}

【问题讨论】:

    标签: flutter listview dart


    【解决方案1】:

    尝试使用初始化状态,Future 构建器,但打印显示全局变量数组不为空,但 ListView 构建器将其视为空数组。

    这种行为是正常的。即使您更新了变量(在这种情况下,restaurantsList 数组填充了数据),框架不会知道 restaurantsList 数组已更改;因此,它不会更新屏幕中的视图或小部件。这就是为什么在热重载时会填充列表视图的原因,在热重载期间框架会检查变量的状态,然后重建小部件。

    要触发ListView 的重建,您应该使用内置的setState 方法或遵循任何状态管理工具。

    @override
    initState() {
      getItems();
      super.initState();
    }
    
    Future<void> getItems() async {
    await Future.delayed(Duration(milliSeconds:500));
    List<TodaysLunch> listDetails = [];
    for (var shef in global.NearBy) {
      for (var lunch in shef.totalMenu) {
        if (lunch.type == "Todays Menu") {
          for (var item in lunch.menu) {
            TodaysLunch menu = TodaysLunch(shef, item.id, item.Category,
                item.Details, item.DishName, item.Price);
            listDetails.add(menu);
          }
        }
      }
    }
    
    setState(() {
        restaurantsList = listDetails;
    });
    
    } 
    

    【讨论】:

    • 感谢您的帮助,但我在加载小部件之前使用了延迟。由于数据加载正确,因此它是在数据之前呈现的小部件。顺便说一句,您的代码可以帮助我解决这个问题。
    • @MuhammadIbtihajNaeem 虽然延迟会起作用,但这并不是解决问题的好方法。有些手机速度非常慢,即使在延迟之后也无法填充列表。我建议使用 FutureBuilder 并学习如何进行状态管理而不是 setState() 来更新小部件。 medium.com/flutterworld/…youtube.com/watch?v=ek8ZPdWj4Qo 会帮助你
    猜你喜欢
    • 1970-01-01
    • 2020-06-19
    • 2018-04-26
    • 2019-04-25
    • 2018-12-06
    • 2018-10-26
    • 2020-11-15
    • 2021-06-06
    • 2021-09-28
    相关资源
    最近更新 更多