Flutter 颤振:有可能在构建方法完成之前获得未来的数据吗? 导入“包装:颤振/材料.省道”; 导入“package:hello_world/ui/food_show_case.dart”; 导入“自定义appbar.dart”; 类RestaurantsMenu扩展StatefulWidget{ var结果; RestaurantsMenu({this.result}); @凌驾 _RestaurantsMenuState createState()=>\u RestaurantsMenuState(结果); } 类_restaurantsmenstate扩展状态{ var结果; var identifier=newmap(); Future getData()异步{ 等待结果。然后((代表){ 标识符=代表; }); } @凌驾 void initState(){ super.initState(); getData(); } _RestaurantsMenuState(此结果); @凌驾 小部件构建(构建上下文){ 返回脚手架( 正文:安全区( 子:容器( 子:ListView( 儿童:[ CustomAppBar(), 选项卡(标识符、标识符、键、长度), ], ), ), )); } 小部件选项卡(地图,int longueur){ 返回SingleChildScrollView( 子:容器( 身高:560, 宽度:double.infinity, 子级:DefaultTabController( 初始索引:0, 长度:朗古尔, 孩子:脚手架( appBar:appBar( 标高:0.0, 背景颜色:颜色。透明, 底部:首选尺寸( 首选尺寸:尺寸。从高度(65), 子:容器( 颜色:颜色。透明, 儿童:安全区( 子:列( mainAxisAlignment:mainAxisAlignment.center, 儿童:[ 塔巴( isScrollable:是的, 标签填充:仅限边缘集(顶部:15), 指示颜色:颜色。透明, labelColor:Colors.black, 标签样式:文本样式( 尺寸:25, fontWeight:fontWeight.w800, fontFamily:“斯拉博”, ), 未选择的标签颜色:Colors.black 26, 未选择的标签样式:TextStyle( 尺寸:25, fontWeight:fontWeight.w800, fontFamily:“斯拉博”, ), 选项卡:[ for(映射键中的变量元素) 容器( 填充:仅限边缘设置(左:40), 子:文本(元素), ), ], ), ], ), ), ), ), ), 正文:选项卡视图( 儿童:[ for(map.keys中的变量tabu) 食品展示箱( 映射:标识符, 禁忌:禁忌, ), ], ), ), ), ), ); } }
以下是错误: 引发了另一个异常:“package:flatter/src/material/tab_controller.dart”:失败的断言:第316行位置15:“initialIndex>=0&&initialIndexFlutter 颤振:有可能在构建方法完成之前获得未来的数据吗? 导入“包装:颤振/材料.省道”; 导入“package:hello_world/ui/food_show_case.dart”; 导入“自定义appbar.dart”; 类RestaurantsMenu扩展StatefulWidget{ var结果; RestaurantsMenu({this.result}); @凌驾 _RestaurantsMenuState createState()=>\u RestaurantsMenuState(结果); } 类_restaurantsmenstate扩展状态{ var结果; var identifier=newmap(); Future getData()异步{ 等待结果。然后((代表){ 标识符=代表; }); } @凌驾 void initState(){ super.initState(); getData(); } _RestaurantsMenuState(此结果); @凌驾 小部件构建(构建上下文){ 返回脚手架( 正文:安全区( 子:容器( 子:ListView( 儿童:[ CustomAppBar(), 选项卡(标识符、标识符、键、长度), ], ), ), )); } 小部件选项卡(地图,int longueur){ 返回SingleChildScrollView( 子:容器( 身高:560, 宽度:double.infinity, 子级:DefaultTabController( 初始索引:0, 长度:朗古尔, 孩子:脚手架( appBar:appBar( 标高:0.0, 背景颜色:颜色。透明, 底部:首选尺寸( 首选尺寸:尺寸。从高度(65), 子:容器( 颜色:颜色。透明, 儿童:安全区( 子:列( mainAxisAlignment:mainAxisAlignment.center, 儿童:[ 塔巴( isScrollable:是的, 标签填充:仅限边缘集(顶部:15), 指示颜色:颜色。透明, labelColor:Colors.black, 标签样式:文本样式( 尺寸:25, fontWeight:fontWeight.w800, fontFamily:“斯拉博”, ), 未选择的标签颜色:Colors.black 26, 未选择的标签样式:TextStyle( 尺寸:25, fontWeight:fontWeight.w800, fontFamily:“斯拉博”, ), 选项卡:[ for(映射键中的变量元素) 容器( 填充:仅限边缘设置(左:40), 子:文本(元素), ), ], ), ], ), ), ), ), ), 正文:选项卡视图( 儿童:[ for(map.keys中的变量tabu) 食品展示箱( 映射:标识符, 禁忌:禁忌, ), ], ), ), ), ), ); } },flutter,dart,Flutter,Dart,以下是错误: 引发了另一个异常:“package:flatter/src/material/tab_controller.dart”:失败的断言:第316行位置15:“initialIndex>=0&&initialIndex
如果我没有弄错的话,问题是Flatter正试图使用未来数据的长度(这些数据是我从Firebase检索到的一组信息)构建一个选项卡控制器,但构建方法已经超过了它(当我在获得此错误数秒后执行热重新加载时,一切正常,错误消失)而且它不能被构建,我可以停止或暂停它一小会儿,直到需要的数据到达,然后再继续吗?。谁能帮帮我吗?!谢谢您可以创建一个名为
\u loaded
的布尔值,并在init状态下将其设置为false。然后在设置identifier=rep
您可以设置\u loaded=true
并调用setState((){})代码>。最后,在构建方法中,是否将选项卡(identifier、identifier.keys.length)替换为?选项卡(标识符、标识符.键.长度):CircularProgressIndicator(),
,这意味着它将显示一个加载循环,直到收到数据。使用FutureBuilder实现您想要的。以下是文档的详细信息。
import 'package:flutter/material.dart';
import 'package:hello_world/ui/food_show_case.dart';
import 'custom_appbar.dart';
class RestaurantsMenu extends StatefulWidget {
var result;
RestaurantsMenu({this.result});
@override
_RestaurantsMenuState createState() => _RestaurantsMenuState(result);
}
class _RestaurantsMenuState extends State<RestaurantsMenu> {
var result;
var identifier = new Map();
Future getData() async {
await result.then((rep) {
identifier = rep;
});
}
@override
void initState() {
super.initState();
getData();
}
_RestaurantsMenuState(this.result);
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Container(
child: ListView(
children: <Widget>[
CustomAppBar(),
tab(identifier, identifier.keys.length),
],
),
),
));
}
Widget tab(Map map, int longueur) {
return SingleChildScrollView(
child: Container(
height: 560,
width: double.infinity,
child: DefaultTabController(
initialIndex: 0,
length: longueur,
child: Scaffold(
appBar: AppBar(
elevation: 0.0,
backgroundColor: Colors.transparent,
bottom: PreferredSize(
preferredSize: Size.fromHeight(65),
child: Container(
color: Colors.transparent,
child: SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TabBar(
isScrollable: true,
labelPadding: EdgeInsets.only(top: 15),
indicatorColor: Colors.transparent,
labelColor: Colors.black,
labelStyle: TextStyle(
fontSize: 25,
fontWeight: FontWeight.w800,
fontFamily: 'slabo',
),
unselectedLabelColor: Colors.black26,
unselectedLabelStyle: TextStyle(
fontSize: 25,
fontWeight: FontWeight.w800,
fontFamily: 'slabo',
),
tabs: <Widget>[
for (var elem in map.keys)
Container(
padding: EdgeInsets.only(left: 40),
child: Text(elem),
),
],
),
],
),
),
),
),
),
body: TabBarView(
children: <Widget>[
for (var tabu in map.keys)
FoodShowCase(
map: identifier,
tabofnow: tabu,
),
],
),
),
),
),
);
}
}