android - 完全初始化后刷新或重建颤振小部件
问题描述
我正在尝试使用 tdlib 颤振端口为 android 制作 Telegram 客户端。我目前正在尝试通过从电报请求并制作文本按钮的列表视图来制作各种联系人列表。
唯一的问题是,由于库是异步的,所以我在布局初始化后得到了联系人列表。是否有可能以某种方式重建布局或更新它以使列表正确加载。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:fima/services/telegram_service.dart';
import 'package:tdlib/td_api.dart' show TdError;
import 'package:provider/provider.dart';
import 'package:tdlib/td_api.dart' as TdApi;
class ContactListScreen extends StatefulWidget {
@override
_ContactListScreenState createState() => _ContactListScreenState();
}
class _ContactListScreenState extends State<ContactListScreen> {
final String title = 'Contact list';
bool _loadingStep = false;
String _Error;
String route = "initRoute";
List<TextButton> contacts = [];
@override
void initState() {
super.initState();
_getContacts(onError: _handelError,);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(title),
backgroundColor: Color(0xD3232323),
),
body: Container(
child:
ListView (
children: contacts,
),
),
);
}
Future _getContacts(
{
void Function(TdError) onError,
}) async {
final result = await context.read<TelegramService>().send(
TdApi.GetContacts(
),
);
if (result is TdError && onError != null) {
onError(result);
}
TdApi.Users users = result;
for (var i = 0; i < users.totalCount; i++) {
final result = await context.read<TelegramService>().send(
TdApi.GetUser(userId: users.userIds[i]),
);
TdApi.User user = result;
print(user.firstName + " " + user.lastName);
final contact = TextButton(
onPressed: () {
print("Test");
},
child: Text(user.firstName + " " + user.lastName),
);
setState(() {
contacts.add(contact);
});
}
}
void _handelError(TdError error) async {
setState(() {
_loadingStep = false;
_Error = error.message;
});
}
}
我曾尝试使用 setState,但没有取得多大成功,有人可以为我提供解决此问题的方法吗?
解决方案
使用FutureBuilder
可能会有所帮助。它是一个基于与 Future 交互的最新快照构建自身的小部件。
您可以修改您的构建以返回一个 FutureBuilder,如下所示:
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _getContacts,
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
if (snapshot.hasData) {
//Use snapshot data to build by returning your Container with List
}
else{
//Return a CircularProgressIndicator
}
}
}
请参阅此处有关 FutureBuilder 类的文档。
推荐阅读
- javascript - 如果是 Web,则从一个库导出,如果是 React Native 中的本地库,则从另一个库导出
- c++ - 看起来 is_nothrow_constructible_v() 在 MSVC 中被破坏了,我错了吗?
- python - Python setuptools LINK:致命错误 LNK1181:无法打开输入文件“C:\Program.obj”
- android - GetCurrentLocation 在调试中工作,但在 Android 的发布 apk 中不起作用
- python - 如何将csv文件复制到字典中?
- javascript - 在 React JS 中使用动态数字键循环
- ignite - 禁用缓存的持久性
- assembly - 为什么写入可写 .data 部分时出现段错误?使用 Ubuntu、x86、nasm、gdb、readelf
- python - 根据分隔符拆分列值(熊猫)
- python - 如何对包含嵌套列表的列表进行排序,该列表还包含字典。目的是按字典 VALUE 对主列表进行排序