首页 > 解决方案 > 完全初始化后刷新或重建颤振小部件

问题描述

我正在尝试使用 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,但没有取得多大成功,有人可以为我提供解决此问题的方法吗?

标签: androidflutterdart

解决方案


使用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 类的文档。


推荐阅读