flutter:带有后备文本的 CircleAvatar

2023-12-27

我正在学习 Flutter,想做一个Widget就像内置的一样CircleAvatar。但是,我希望这种行为是

  • 指定图像 (NetworkImage)和缩写(即 BB)
  • 当图像未加载时,显示缩写
  • 如果图像加载,则显示图像并删除缩写

下面的代码可以工作,但是当在聊天演示中使用时,它会随着添加多个我的头像而崩溃。 initState 上的断点表明它总是使用输入的第一个消息文本来调用 - 这不是我所期望的。 当图像“重新加载”时它也会闪烁。看来这些小部件正在以我不理解的方式被重用。

class MyAvatar extends StatefulWidget {                     
  NetworkImage image;
  MyAvatar({this.text}) {
    debugPrint("MyAvatar " + this.text);
    if (text.contains('fun')) {
      this.image = new NetworkImage("https://cdn3.iconfinder.com/data/icons/minicons-for-web-sites/24/minicons2-14-512.png");
    }
  }
  final String text;
  @override                                                        
  MyAvatarState createState() {
    return new MyAvatarState();
  }                    
}

class MyAvatarState extends State<MyAvatar> {
  bool showImage = false;
  @override
  initState() {
    super.initState();
    if (widget.image != null) {
      var completer = widget.image.load(widget.image);
      completer.addListener((info, sync) {
        setState(() {
          showImage = true;
        });
      });
    }
  }

  @override 
  Widget build(BuildContext context) {
    return !showImage ? new CircleAvatar(radius: 40.0, child: new Text(widget.text[0]))
        : new CircleAvatar(radius: 40.0, backgroundImage: widget.image);
  }
}

我仍然遇到问题 - 完整代码

import 'package:flutter/material.dart';
// Modify the ChatScreen class definition to extend StatefulWidget.

class ChatScreen extends StatefulWidget {                     //modified
  ChatScreen() {
    debugPrint("ChatScreen - called on hot reload");
  }
  @override                                                        //new
  State createState() {
    debugPrint("NOT on hot reload");
    return new ChatScreenState();
  }                    //new
}

// Add the ChatScreenState class definition in main.dart.

class ChatScreenState extends State<ChatScreen> {
  final List<ChatMessage> _messages = <ChatMessage>[];
  final TextEditingController _textController = new TextEditingController(); //new
  ChatScreenState() {
    debugPrint("ChatScreenState - not called on hot reload");
  }

  @override //new
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(title: new Text("Friendlychat")),
      body: new Column(                                        //modified
          children: <Widget>[                                         //new
            new Flexible(                                               //new
                child: new ListView.builder(                              //new
                  padding: new EdgeInsets.all(8.0),                       //new
                  reverse: true,                                          //new
                  itemBuilder: (_, int index) => _messages[index],        //new
                  itemCount: _messages.length,                            //new
                )                                                         //new
            ),                                                          //new
            new Divider(height: 1.0),                                   //new
            new Container(                                              //new
              decoration: new BoxDecoration(
                  color: Theme.of(context).cardColor),                   //new
              child: _buildTextComposer(),                         //modified
            ),                                                          //new
          ]                                                            //new
      ),                                                             //new
    );
  }

  Widget _buildTextComposer() {

    return new IconTheme(
        data: new IconThemeData(color: Theme
            .of(context)
            .accentColor),
        child:
        new Container(
            margin: const EdgeInsets.symmetric(horizontal: 8.0),
            child: new Row(
                children: <Widget>[
                  new Container( //new
                    margin: new EdgeInsets.symmetric(horizontal: 4.0), //new
                    child: new IconButton( //new
                        icon: new Icon(Icons.send),
                        onPressed: () =>
                            _handleSubmitted(_textController.text)), //new
                  ),
                  new Flexible(
                      child: new TextField(
                        controller: _textController,
                        onSubmitted: _handleSubmitted,
                        decoration: new InputDecoration.collapsed(
                            hintText: "Send a message"),
                      )
                  ),
                ])
        )
    );
  }

  void _handleSubmitted(String text) {


    _textController.clear();
    ChatMessage message = new ChatMessage(text: text);
    setState(() {
      _messages.insert(0, message);
    });
  }
}

const String _name = "Hardcoded Name";

class ChatMessage extends StatelessWidget {
  ChatMessage({this.text, this.image, this.useImage});
  final String text;
  final NetworkImage image;
  final Map useImage;
  @override
  Widget build(BuildContext context) {
    var use = true; //useImage != null && useImage['use'];

    var image = new NetworkImage("https://cdn3.iconfinder.com/data/icons/minicons-for-web-sites/24/minicons2-14-512.png");
    if (text.contains('bad')) {
      image = new NetworkImage("https://cdn3.iconfinder.com/data/icons/minicons-for-web-sites/24/minicons2-14-512.pngz");
    }
    return new Container(
      margin: const EdgeInsets.symmetric(vertical: 10.0),
      child: new Row(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          new Container(
            margin: const EdgeInsets.only(right: 16.0),
            child : new CustomCircleAvatar(initials: text[0], myImage: image)
          ),
          new Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              new Text(_name, style: Theme.of(context).textTheme.subhead),
              new Container(
                margin: const EdgeInsets.only(top: 5.0),
                child: new Text(text),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

class CustomCircleAvatar extends StatefulWidget {
  NetworkImage myImage;

  String initials;


  CustomCircleAvatar({this.myImage, this.initials}) {
    debugPrint(initials);
  }

  @override
  _CustomCircleAvatarState createState() => new _CustomCircleAvatarState();
}

class _CustomCircleAvatarState extends State<CustomCircleAvatar>{

  bool _checkLoading = true;

  @override
  void initState() {
    if (widget.myImage != null) {
      widget.myImage.resolve(new ImageConfiguration()).addListener((image, sync) {
        if (mounted && image != null) {
          setState(() {
            _checkLoading = false;
          });
        }
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return _checkLoading == true ? new CircleAvatar(child: new Text(widget.initials))
        : new CircleAvatar(backgroundImage: widget.myImage);
  }
}

输入“fun”作为消息,然后输入“bad”作为第二条消息 -image https://i.stack.imgur.com/f1Oj6.png这个想法是,根据您输入的内容,可能会加载(或不加载)不同的图像。在“加载失败”的情况下,应保留缩写。


您可以通过添加监听器来实现此功能ImageStream您可以从ImageConfiguration,

在这里,我将相同的数据提供给我的ListView你当然可以通过添加一个来自定义它List图像和缩写作为任何类中的字段并使用ListView.builder相反,能够通过索引循环它们。

class CustomCircleAvatar extends StatefulWidget {
  NetworkImage myImage;

  String initials;


  CustomCircleAvatar({this.myImage, this.initials});

  @override
  _CustomCircleAvatarState createState() => new _CustomCircleAvatarState();
}

class _CustomCircleAvatarState extends State<CustomCircleAvatar>{

  bool _checkLoading = true;

  @override
  void initState() {
    widget.myImage.resolve(new ImageConfiguration()).addListener((_, __) {
      if (mounted) {
        setState(() {
          _checkLoading = false;
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return _checkLoading == true ? new CircleAvatar(
        child: new Text(widget.initials)) : new CircleAvatar(
      backgroundImage: widget.myImage,);
  }
}

现在你可以像这样使用它:

void main() {
  runApp(new MaterialApp (home: new MyApp()));
}

    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => new _MyAppState();
    }

    class _MyAppState extends State<MyApp> {
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(title: new Text("Custom Circle Avatar"),),
          body: new ListView(children: new List.generate(20, (int index) {
            return new Container(
              height: 100.0,
              width: 100.0,
              child: new CustomCircleAvatar(myImage: new NetworkImage(
                  "https://www.doginni.cz/front_path/images/dog_circle.png"),
                initials: "Dog",
              ),
            );
          }),),
        );
      }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flutter:带有后备文本的 CircleAvatar 的相关文章

  • Flutter - 构建失败并出现异常

    当我启动我的应用程序时 我收到此错误消息 自上次运行以来我没有进行任何更改 当时一切都很好 有人知道如何解决这个问题吗 谢谢 FAILURE Build failed with an exception 什么地方出了错 无法确定任务 app
  • Flutter编译错误:必须返回非空值,因为返回类型“String”不允许为空 - displayString

    我的测试无法在我的 Flutter 项目引用的仅 Dart 项目中编译和运行 我收到以下错误消息 Failed to precompile test test pub cache hosted pub dartlang org analyz
  • Flutter Spotify Api 身份验证

    我需要在使用 Spotify api 的 Flutter 应用程序中对用户进行身份验证 我使用 flutter web auth 打开 WebView 并让用户在那里登录 我无法返回应用程序 在 Spotify 仪表板中 我将回调 Uri
  • 自定义卡片形状 Flutter SDK

    我在 Flutter 上使用 GridView 开发了一个应用程序 GridView 项目是卡片 默认卡片形状是半径为 4 的矩形 我知道 Card Widget 有 shape 属性 并且它需要 ShapeBorder 类 但我无法找到如
  • 扑。应用程序不会崩溃并发送崩溃报告

    我已经集成了Firebase Crashlytics在我的应用程序中 我正在测试 Android 应用程序 我强迫崩溃来检查它 if true List arr throw arr 1 2 我的问题是应用程序不会崩溃 我只是在日志中得到这个
  • Flutter Firestore - 如何从文档字段中的文档引用获取数据?

    我正在构建一个具有不同问题类型的自学应用程序 现在 其中一个问题有一个包含文档参考列表的字段 在 Flutter 中 我有以下代码 Query
  • 已发布的 Flutter 应用程序在启动时崩溃

    编辑 此问题的解决方案是将您的 flutter 版本升级到较新的 dev 版本 then 1 7 0 您还可以上传单独的 APK 版本 但我个人不喜欢这个选项 请确保您没有从 flutter github 开发存储库下载 错误的构建 因为那
  • 如何在 flutter 中仅显示列表中的 5 项

    我想在 flutter 中显示一个列表 我正在使用listView 问题是我只想显示 5 个项目 我的意思是当用户向下滚动时我想从开始索引中删除并将另一个小部件添加到包含我的小部件的列表的末尾 但是当我这样做时ScrollView 不会停留
  • 用颤动画布在形状上切一个洞

    如何使用颤动画布在形状上 切一个洞 我有一组相当复杂的形状 看起来像现实世界的物体 该物体上有一个圆角矩形形状的孔 我真的很想从形状中减去 RRect 但我找不到任何有关如何执行此操作的信息 canvas clipRRect myRRect
  • SocketException:主机查找失败:“...com”(操作系统错误:未提供节点名或服务名,或未知,errno = 8)

    我们面临的情况是 生产应用程序面临以下套接字异常 并且在此之后无法执行任何其他网络操作 DioError DioErrorType DEFAULT SocketException Failed host lookup xyz abc com
  • 如何在 Flutter 中恢复上次路由

    我正在开发 Flutter 应用程序 但遇到了问题 在我的 main dart 中 我设置了一个名为 FirstScreen 的主路由 然后用户可以转到 LoginScreen 登录帐户 因此 如果我按主页按钮 然后尝试重新打开应用程序 出
  • 如何实现类似预编译指令的功能

    我正在开发一个 Angular 应用程序 建议对生产中运行的许多东西使用生成的代码 即模板缓存 表达式缓存和静态 DI 注入器 目前没有在不同构建配置之间切换的好方法 因此我使用推荐的模式here https github com angu
  • Flutter 深度链接

    据Flutter官方介绍深层链接页面 https flutter dev docs development ui navigation deep linking 我们不需要任何插件或本机 Android iOS 代码来处理深层链接 但它并没
  • 防止纸张对话框自动关闭

    Hello 我有一个paper dialog页面中的元素
  • Cloud Functions,删除Firestore SubCollections,是否需要AdminToken?

    我正在尝试构建可调用的云函数 当用户删除帖子时 它也会尝试删除评论 这是帖子的子集合 所以我看到了这个例子并像文档示例一样实现 const admin require firebase admin const firebase tools
  • 滑动返回手势颤动

    如何在颤振中实现从左侧滑动返回的手势 不确定它是否已经在 iOS 上自动实现 但我也希望在 Android 上也能实现 因为事情正在变得基于手势 Use CupertinoPageRoute使其在 Android 上运行 import pa
  • 查找文本的确切边界

    我需要知道一段文本的确切边界 相当于获取文本边界 https developer android com reference android graphics Paint html对于安卓 我意识到这在某种程度上与 Flutter 的设计背
  • 尝试在模拟器上安装第二个 flutter 应用程序时出错

    我创建了一个简单的 flutter 应用程序并在 android 模拟器上运行它 效果还不错 现在我创建了另一个 当我尝试在模拟器上运行它时 我得到 Error ADB exited with exit code 1 adb failed
  • dart json.encode(data) 不能接受其他语言

    我目前正在使用 Dart 进行 Web 开发 使用mockclient实现服务 但是 出现以下错误 下面的实现代码是一个继承mockClient的内存web api服务 调用client send 并返回结果的代码 test value是j
  • 如何在 TextField 中垂直居中不同大小的hintText?

    我有一个TextField像这样 输入文本和提示文本的大小不同 TextField style Theme of context textTheme subhead copyWith fontSize 70 0 decoration Inp

随机推荐

  • Git 日志:致命对象 [sha1] 已损坏

    有什么方法可以修复我的存储库并保持提交历史记录完好无损 git log fatal object 01aeb2bf2e93b238f0e0422816b3e55518321ae7 is corrupted 从阅读下面的链接来看 我似乎要删除
  • Asp.net Mvc3 webgrid 和分页

    我正在尝试学习Asp net mvc 我知道它与形式不同 我可能需要改变我的思维方式 我的问题是关于 webgrid 的 当我将 webgrid 添加到我的页面并使用 Post 按下搜索按钮时 它会使用寻呼机等呈现表格 但是寻呼机上的链接不
  • Linux 内核中 IRQ 和中断向量之间的区别

    当涉及到内核 API 的工作时 我对 IRQ 和向量有点困惑 我想使用向量 0xfa 进行一些由可编程 lapic 生成的中断处理 我查看了 API 例如request irq and set intr gate also alloc in
  • 结合 Git Bash 并在 CMDER 中的当前文件夹中打开

    请描述我 谁有这样的经验 如何正确设置CMDER的选项以在当前文件夹中使用Git Bash打开新控制台 例如在此处打开CMDER 该字符串不起作用 C Program Files x86 Git bin sh exe login i new
  • 使用来自存储 C#.Net CNG 的密钥进行 ECDSA 签名文件

    我正在尝试使用 CNG API 和 Microsoft 证书存储中的证书通过 ECDSA 签署文件 我已经阅读了大量文档并且即将完成 但我对从证书导入私钥感到困惑 我已经用 RSA 做了同样的事情 但它的做法似乎非常不同 这是我到目前为止的
  • bash 中的 for 循环只是打印 n 次命令而不是重复

    我有一个包含 6000 多行的 input txt 文件 如果一行 a 包含超过 10 个单词 那么我希望将其拆分 但不是在第 10 个单词处 而是在第一个逗号字符出现的位置处 并且 如果新行也有超过10个单词 那么它也应该被拆分 并不断重
  • 堆叠特征中 super 的含义取决于调用站点?

    我无法用语言对此进行很好的描述 所以 请看这个例子 trait Base def foo Base trait One extends Base override def foo One lt super foo trait Two ext
  • Emacs 中的缓冲区切换

    我想模拟 Alt Tab 因为它适用于 GTK 上的各个窗口 但在 emacs 中的缓冲区内使用 Ctrl Tab 因此 举例来说 如果我在 emacs 中打开了 10 个缓冲区 而我目前正在处理两个缓冲区 例如 Buffer1 和 Buf
  • 企业库错误

    我收到有关我们的生活环境中罕见的间歇性错误的报告 我试图重现它但没有成功 而且这个错误本身有点神秘 除此之外 它似乎涉及企业库跟踪 我们使用的是 5 0 版本 总而言之 有点痛苦 这发生在 Windows Sever 2008 上 应用程序
  • Windows 8 应用程序本地存储

    我正在尝试使用 C 开发 Windows 8 应用程序 我需要在本地设置中存储两个列表 字符串和日期时间 List
  • HTTP/2 中是否有必要缓存bust?

    在 HTTP 1 中 为了避免额外的网络请求来确定资源是否应该保留缓存 我们将设置一个高值max age or Expires静态资产的值 并为每个修订版提供唯一的 URL 但在 HTTP 2 中 请求很便宜 所以我们可以在不清除缓存的情况
  • 有没有一种简单的方法可以从两个整数复合键创建唯一的整数键?

    由于与问题不太相关的各种原因 我有一个表 其中包含由两个整数组成的复合键 我想从这两个数字中创建一个唯一的键 我最初的想法是连接它们 但当我意识到 51 1 的复合键会产生与 5 11 相同的唯一键 即 511 时 我很快遇到了问题 有没有
  • 以编程方式访问 Excel 自定义文档属性

    我正在尝试将自定义属性添加到以编程方式创建的工作簿中 我有一个用于获取和设置属性的方法 但问题是工作簿为 CustomDocumentProperties 属性返回 null 我无法弄清楚如何初始化此属性 以便我可以从工作簿中添加和检索属性
  • PHP - 使用 GZIP 压缩静态 css 文件

    所以我有一个CSS文件 style css 在同一目录中我有 images 文件夹 如何制作一个压缩 style css 的脚本 但来自另一个文件夹 现在我有这个
  • 更新数百万个文档的嵌套字段

    我使用脚本进行批量更新来更新嵌套字段 但这非常慢 POST index type bulk update id 1 script inline ctx source nestedfield add params nestedfield pa
  • Agda 函数、类型匹配函数

    我想创建一个辅助函数 它将从索引或参数化类型中获取术语并返回该类型参数 showLen len A Set gt Vec A len gt showLen len showType len A Set gt Vec A len gt Set
  • 测试点是否在匹配的引号之间 (emacs lisp)

    我们如何检查是否 point 在匹配的 引号 内 示例 1 point 但不在范围之内 示例 2 此处引用 point 那里引用 在 Emacs Lisp 中 您正在寻找的是syntax ppss 定义于syntax el 它返回 10 个
  • 如何在Python中捕获自定义异常[重复]

    这个问题在这里已经有答案了 我正在使用一个 python 库 其中在某一时刻定义了一个异常 如下所示 raise Exception Key empty 我现在希望能够捕获该特定异常 但我不知道该怎么做 我尝试了以下方法 try raise
  • C++ 中的比较性能( foo >= 0 与 foo != 0 )

    我最近一直在写一段代码 其中性能非常重要 基本上我有以下情况 int len some very big number int counter some rather small number for int i len i gt 0 i
  • flutter:带有后备文本的 CircleAvatar

    我正在学习 Flutter 想做一个Widget就像内置的一样CircleAvatar 但是 我希望这种行为是 指定图像 NetworkImage 和缩写 即 BB 当图像未加载时 显示缩写 如果图像加载 则显示图像并删除缩写 下面的代码可