Flutter NotifyListeners()don';在颤振中适当地工作
在我的启动屏幕中,我从我的模型类调用一个方法(从API获取一些数据并将它们放入列表)。它工作并生成列表。但我无法将此列表发送到我的listview小部件。这是相关代码 正在调用模型类方法(getFixtures)的SplashScreen部分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
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(),
),