Flutter 在构建小部件后获取数据

Flutter 在构建小部件后获取数据,flutter,Flutter,我试图从数据库中获取数据,但我的小部件是在我获取数据之前构建的 class CategoriesWidget extends StatefulWidget { @override _CategoriesWidgetState createState() => _CategoriesWidgetState(); } class _CategoriesWidgetState extends State<CategoriesWidget> { SharedPrefere

我试图从数据库中获取数据,但我的小部件是在我获取数据之前构建的

class CategoriesWidget extends StatefulWidget {
  @override
  _CategoriesWidgetState createState() => _CategoriesWidgetState();
}

class _CategoriesWidgetState extends State<CategoriesWidget> {
  SharedPreferences prefs;
  String token;
  var _isInit = false;
  @override
  void initState() {
    if (!_isInit) {
      super.initState();
      fetchCat();
      _isInit = true;
    }
  }

  var categories = {};
  fetchCat() async {
    final prefs = await SharedPreferences.getInstance();
    setState(() {
      token = prefs.getString('api_token');
    });
    await fetchCategories(token).then((result) {
      categories = result[1];
      print(categories);
      print(result[1]);
    });
  }

  @override
  Widget build(BuildContext context) {
    final deviceSize = MediaQuery.of(context).size;
    print('2');
    return Column(
     // code here
    );
  }
}
class CategoriesWidget扩展了StatefulWidget{
@凌驾
_CategoriesWidgetState createState()=>\u CategoriesWidgetState();
}
类_CategoriesWidgetState扩展状态{
共享引用优先权;
字符串标记;
var _isInit=假;
@凌驾
void initState(){
如果(!\u isInit){
super.initState();
fetchCat();
_isInit=true;
}
}
变量类别={};
fetchCat()异步{
final prefs=wait SharedPreferences.getInstance();
设置状态(){
token=prefs.getString('api_token');
});
等待获取类别(令牌)。然后((结果){
类别=结果[1];
印刷品(类别);
打印(结果[1]);
});
}
@凌驾
小部件构建(构建上下文){
final deviceSize=MediaQuery.of(context).size;
印刷品(‘2’);
返回列(
//代码在这里
);
}
}

您可以看到,我打印1和2以查看哪一个是第一个,我得到的结果是2,然后是1。

您应该使用
FutureBuilder

@覆盖
小部件构建(构建上下文){
回归未来建设者(
未来:_fetchCat(),
生成器:(上下文,快照)=>snapshot.hasData
?MyWidget(数据:snapshot.data)
:Text('正在加载…'),
);
}
使用FutureBuilder,您的小部件可能会保持无状态

下面是一个简单的工作示例:

完整源代码:
导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“StackOverflow答案”,
主页:主页(),
);
}
}
类主页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
主体:中心(子:CategoriesWidget()),
);
}
}
类CategoriesWidget扩展StatefulWidget{
@凌驾
_CategoriesWidgetState createState()=>\u CategoriesWidgetState();
}
类_CategoriesWidgetState扩展状态{
Future\u fetchCat()异步{
等待未来。延迟(持续时间(秒:2));
返回“类别”;
}
@凌驾
小部件构建(构建上下文){
回归未来建设者(
未来:_fetchCat(),
生成器:(上下文,快照)=>文本(
snapshot.hasData?snapshot.data???‘无类别’:‘正在加载…’),
);
}
}

在获取或使用数据之前,您可以显示加载程序futurebuilder@ShubhamNarkhede我应该如何使用它?您想先获取数据,然后正确显示UI?很抱歉问这个问题,但我不明白我应该如何在小部件中使用它..:3
Text
是一个小部件。没有为类型“\u CategoriesWidgetState”定义方法“MyWidget”。尝试将名称更正为现有方法的名称,或定义名为“MyWidget”的方法。它给了我这个,我使用了set state,这样我可以在索引等于1时构建它。我的小部件开始运行,当它不同时,它向我显示circularprogress什么是[我的小部件]?我想这应该是取代MyWidget的东西。你在说什么[索引]?