繁体   English   中英

在完全初始化后刷新或重建颤动小部件

[英]Refreshing or rebuilding flutter widget after it has been fully initialised

我正在尝试使用 tdlib flutter 端口为 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 类的文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM