NotifyListeners () не работают должным образом во Flutter - PullRequest
0 голосов
/ 28 мая 2020

На моем экране spla sh я вызываю метод из своего класса модели (получаю некоторые данные из API и помещаю их в список). Он работает и генерирует список. Но я не могу отправить этот список в свой виджет listview. Вот соответствующий код;

Часть SplashScreen, которая вызывает метод класса модели (getFixtures)

 class _SplashScreenState extends State<SplashScreen> {
  List<Fixture> fixtureList = List<Fixture>();
  FixtureData callFixtureData = FixtureData();

  @override
  void initState() {
    super.initState();
    SplashScreen.fixtureData = getFixture();
    Timer(
      Duration(seconds: 5),
      () => Navigator.of(context).pushReplacement(
        MaterialPageRoute(
          builder: (BuildContext context) => WelcomeScreen(),
        ),
      ),
    );
  }

  Future<List<Fixture>> getFixture() async {
    fixtureList = await callFixtureData.getFixtures();
    return fixtureList;
  }

Часть класса модели; Я вижу, что список не является нулевым и правильным

class FixtureData extends ChangeNotifier {

  List<Fixture> fixtures = List<Fixture>();
  List<Fixture> bets = List<Fixture>();

  //to show in FAB at HomeScreen
  int get betCount {
    return bets.length;
  }

  Future<List<Fixture>> getFixtures() async {
    fixtures = await FootballApi.getFixtureData();
    print(fixtures[0].homeTeam);
    notifyListeners();
    return fixtures;
  }

Часть ListView. Я вызываю список с помощью final fixture = fixtureData.fixtures [index]; Но ничего не происходит. Что мне не хватает?

class FixtureList extends StatelessWidget {
  final dateFormat = DateFormat('MMMd');
  final timeFormat = DateFormat('Hm');

  @override
  Widget build(BuildContext context) {
    return Consumer<FixtureData>(
      builder: (context, fixtureData, child) {
        return ListView.builder(
          itemBuilder: (context, index) {
            final fixture = fixtureData.fixtures[index];
            return FixtureTile(
              date: dateFormat.format(fixture.dateTime),
              time: timeFormat.format(fixture.dateTime),
              homeTeam: fixture.homeTeam,
              awayTeam: fixture.awayTeam,
              homeOdds: fixture.homeOdds,
              drawOdds: fixture.drawOdds,
              awayOdds: fixture.awayOdds,
              isHomeSelected: fixture.homeSelected,
              isDrawSelected: fixture.drawSelected,
              isAwaySelected: fixture.awaySelected,
              homeCallBack: () => fixtureData.updateSelection(fixture, 'home'),
              drawCallBack: () => fixtureData.updateSelection(fixture, 'draw'),
              awayCallBack: () => fixtureData.updateSelection(fixture, 'away'),
            );
          },
          itemCount: fixtureData.fixtures.length,
        );
      },
    );
  }
}

1 Ответ

1 голос
/ 28 мая 2020

вы должны сначала прочитать документацию Provider или sample , это так неправильно, вы никогда не устанавливали значение FixtureData.fixtures, но в ListView вы хотите использовать это !!

class _SplashScreenState extends State<SplashScreen> {
  List<Fixture> fixtureList = List<Fixture>();
  //FixtureData callFixtureData = FixtureData();

  @override
  void initState() {
    super.initState();
   // SplashScreen.fixtureData = getFixture();
   Provider.of<FixtureData>(context, listen: false).getFixtures();

    Timer(
      Duration(seconds: 5),
      () => Navigator.of(context).pushReplacement(
        MaterialPageRoute(
          builder: (BuildContext context) => WelcomeScreen(),
        ),
      ),
    );
  }

 // Future<List<Fixture>> getFixture() async {
 //   fixtureList = await callFixtureData.getFixtures();
 //   return fixtureList;
 // }

после этого вы можете использовать свой Consumer ...

также убедитесь, что ChangeNotifierProvider является предком этого виджета SplashScreen, например:


 MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => FixtureData()),
      ],
      child: SplashScreen(),
    ),


...