首页 > 解决方案 > 将项目添加到列表后,Flutter 提供程序返回空列表

问题描述

我有一个带有 Provider 的 Flutter 项目。
我在main.dart中设置了一个 MultiProvider

void main() {
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (_) => VehiclesProvider(),
        ),
      ],
      child: MyApp(),
    ),
  );
}

这是我的车辆提供商

class VehiclesProvider with ChangeNotifier, DiagnosticableTreeMixin {
  List<Vehicle> _vehicles = [];
  late VehicleDataModel _selectedVehicle;

  VehicleService _vehicleService = VehicleService();

  UnmodifiableListView get vehicles => UnmodifiableListView(_vehicles);

  dynamic get selectedVehicle => _selectedVehicle;

  void getData() async {
    final all = await _vehicleService.getAllVehicles();
    _vehicles.addAll(all.response);
    notifyListeners();

    final selected =
        await _vehicleService.getSelectedVehicleData(all.response.first.id);
    _selectedVehicle = selected;
    notifyListeners();
  }
}

如您所见,这个想法是存储车辆(来自 API),然后用户可以选择车辆(默认情况下是第一个)。我跟着getData()断点,一切似乎都在工作。

当我尝试访问数据时......并且我正在尝试多种方式,我就是做不到。我只得到这个:[]

我试图用一个按钮的 onclick 函数来获取它们,如下所示:

  getSelectedCar() {
    final p = Provider.of<VehiclesProvider>(context, listen: false);
    print('p.vehicles');
    print(p.vehicles);
    print(context.read<VehiclesProvider>().vehicles);
  }

在这样的布局中:

Text(jsonEncode(Provider.of<VehiclesProvider>(context).vehicles),),

每种方式我唯一得到的是空数组。当来自 API 的数据在这里时,我会显示一条 toast 消息,然后我才导航到我想要访问它的屏幕,并尝试按下按钮来获取它,但似乎没有任何帮助。

标签: flutterdartprovider

解决方案


将其更改为:

 final p = Provider.of<VehiclesProvider>(context, listen: true); // make listen : true.

因此,当列表被填充时,您会得到更新,换句话说,当您notifyListeners().


推荐阅读