Flutter NotifyListeners()don';在颤振中适当地工作

Flutter NotifyListeners()don';在颤振中适当地工作,flutter,dart,provider,Flutter,Dart,Provider,在我的启动屏幕中,我从我的模型类调用一个方法(从API获取一些数据并将它们放入列表)。它工作并生成列表。但我无法将此列表发送到我的listview小部件。这是相关代码 正在调用模型类方法(getFixtures)的SplashScreen部分 class\u屏幕状态扩展状态{ List fixtureList=List(); FixtureData调用FixtureData=FixtureData(); @凌驾 void initState(){ super.initState(); Splas

在我的启动屏幕中,我从我的模型类调用一个方法(从API获取一些数据并将它们放入列表)。它工作并生成列表。但我无法将此列表发送到我的listview小部件。这是相关代码

正在调用模型类方法(getFixtures)的SplashScreen部分

class\u屏幕状态扩展状态{
List fixtureList=List();
FixtureData调用FixtureData=FixtureData();
@凌驾
void initState(){
super.initState();
SplashScreen.fixtureData=getFixture();
计时器(
持续时间(秒:5),
()=>Navigator.of(context.pushReplacement)(
材料路线(
生成器:(BuildContext上下文)=>WelcomeScreen(),
),
),
);
}
Future getFixture()异步{
fixtureList=等待调用FixtureData.getFixtures();
返回固定列表;
}
模型类部分;我看到列表不是空的且正确的

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;
  }
class FixtureData扩展了ChangeNotifier{
List fixtures=List();
列表下注=列表();
//在主屏幕上的FAB中显示
int得到betCount{
返回赌注。长度;
}
Future getFixtures()异步{
fixtures=wait FootballApi.getFixtureData();
打印(装置[0]。homeTeam);
notifyListeners();
返回装置;
}
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,
        );
      },
    );
  }
}
class FixtureList扩展了无状态小部件{
最终日期格式=日期格式(“MMMd”);
最终时间格式=日期格式(“Hm”);
@凌驾
小部件构建(构建上下文){
退货消费者(
生成器:(上下文、fixtureData、子级){
返回ListView.builder(
itemBuilder:(上下文,索引){
最终夹具=夹具数据。夹具[索引];
返回固定块(
日期:dateFormat.format(fixture.dateTime),
时间:timeFormat.format(fixture.dateTime),
主队:fixture.homeTeam,
awayTeam:fixture.awayTeam,
homeOdds:fixture.homeOdds,
抽签赔率:fixture.抽签赔率,
awayods:fixture.awayods,
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,
);
},
);
}
}
您应该先阅读Provider或,这是非常错误的,您从未将值设置为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;
 // }


您正在使用一种黑客方法来正确地使用
Future
sw,这是什么意思?
getFixture
是一种
Future
,您可以在不等待
SplashScreen.fixtureData=getFixture()的情况下进行此操作
然后使用
计时器来推动替换,并给
未来的
时间来完成它。谢谢,这对我来说很有效。我将再次阅读文档。感谢链接。我是新手,提供商是迄今为止最难理解的部分。我必须多加练习。
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;
 // }


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