【Flutter】Dialog组件PageView组件

news2025/3/19 5:19:31

🔥 本文由 程序喵正在路上 原创,CSDN首发!
💖 系列专栏:Flutter学习
🌠 首发时间:2024年5月27日
🦋 欢迎关注🖱点赞👍收藏🌟留言🐾

目录

  • Dialog组件
    • AlertDialog和SimpleDialog
    • 底部弹出框showModalBottomSheet
    • Fluttertoast
    • 自定义Dailog
  • PageView组件
    • PageView的使用
    • PageView.builder
    • PageView上拉无限加载的实现思路
    • PageView实现无限轮播图
    • 定时器
    • 定时器加PageController实现动态轮播图

Dialog组件

AlertDialog和SimpleDialog

AlertDialogSimpleDialog 都必须在 showDialog 组件中使用,而且 SimpleDialog 中的选项需要使用 SimpleDialogOption 组件来定义。

我们新建一个页面 dialog.dart 专门来演示与弹出框有关的组件,其内容如下,记得将其添加到路由中:

import 'package:flutter/material.dart';

class DialogPage extends StatefulWidget {
  const DialogPage({super.key});

  
  State<DialogPage> createState() => _DialogPageState();
}

class _DialogPageState extends State<DialogPage> {
  void _alertDialog() async {
    var result = await showDialog(
        barrierDismissible: false, //表示点击灰色背景的时候是否消失弹出框
        context: context,
        builder: (context) {
          return AlertDialog(
            title: const Text("提示信息!"),
            content: const Text("您确定要删除吗"),
            actions: [
              TextButton(
                  onPressed: () {
                    Navigator.of(context)
                        .pop("确定"); //点击按钮让AlertDialog消失, 同时返回“确定”
                  },
                  child: const Text("确定")),
              TextButton(
                  onPressed: () {
                    Navigator.of(context).pop("取消");
                  },
                  child: const Text("取消"))
            ],
          );
        });

    print(result);
  }

  void _simpleDialog() async {
    var result = await showDialog(
        barrierDismissible: false, //表示点击灰色背景的时候是否消失弹出框
        context: context,
        builder: (context) {
          return SimpleDialog(
            title: const Text("请选择语言"),
            children: [
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, "汉语");
                },
                child: const Text("汉语"),
              ),
              const Divider(),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, "英语");
                },
                child: const Text("英语"),
              ),
              const Divider(),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, "日语");
                },
                child: const Text("日语"),
              ),
              const Divider(),
            ],
          );
        });

    print(result);
  }

  void _modelBottomSheet() async {}

  void _toast() {}

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Dialog"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: _alertDialog,
              child: const Text('alert弹出框-AlertDialog '),
            ),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: _simpleDialog,
              child: const Text('select弹出框-SimpleDialog'),
            ),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: _modelBottomSheet,
              child: const Text('ActionSheet底部弹出框'),
            ),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: _toast,
              child: const Text('Toast'),
            ),
            // fluttertoast
          ],
        ),
      ),
    );
  }
}

由于 showDialog 的返回类型为 Future,为了接收弹出框的返回信息,我们需要在函数后面加上 async,在 前面加上 await,并用一个变量 result 来接收。

顺便说一下 showDialog 中的 barrierDismissible 参数,所谓的灰色背景指的是屏幕中除了弹出框以外的地方。

home.dart 中,我们简单写了一个按钮,可以让页面跳转到 dialog.dart

import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            onPressed: () {
              Navigator.pushNamed(context, "/dialog");
            },
            child: const Text("Dialog测试"),
          ),
        ],
      ),
    );
  }
}

效果:

在这里插入图片描述

在这里插入图片描述

底部弹出框showModalBottomSheet

为了减小代码篇幅,下面只给出缺少的函数。

如果你想修改底部弹出框的高度,建议在其外部套上一个 Container 或者 SizedBox

void _modelBottomSheet() async {
  var result = await showModalBottomSheet(
      context: context,
      builder: (context) {
        return SizedBox(
          height: 240,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              ListTile(
                title: const Text("分享"),
                onTap: () {
                  Navigator.of(context).pop("分享");
                },
              ),
              const Divider(),
              ListTile(
                title: const Text("收藏"),
                onTap: () {
                  Navigator.of(context).pop("收藏");
                },
              ),
              const Divider(),
              ListTile(
                title: const Text("取消"),
                onTap: () {
                  Navigator.of(context).pop("取消");
                },
              ),
              const Divider(),
            ],
          ),
        );
      });

  print(result);
}

效果:

在这里插入图片描述

Fluttertoast

如果你想实现屏幕上弹出一个提示信息,然后几秒后自动消失的效果,Flutter 中并没有这样的内置组件。这个时候我们可以使用一个第三方插件 —— Fluttertoast。

https://pub-web.flutter-io.cn/ 中搜索 fluttertoast 即可找到它,按照其使用手册即可轻松上手。

在这里插入图片描述

Readme 页面下滑,即可看到使用教程,非常简单,我们只要会复制粘贴即可:

在这里插入图片描述

记得引入 fluttertoast

void _toast() {
  Fluttertoast.showToast(
    msg: "提示信息",
    toastLength: Toast.LENGTH_LONG, //提示时间,只对android生效
    gravity: ToastGravity.CENTER, //出现位置
    timeInSecForIosWeb: 1, //提示时间,只对ios和web生效
    backgroundColor: Colors.black,
    textColor: Colors.white,
    fontSize: 16,
  );
}

在引入第三方插件后,记得重启项目,不能热加载,效果:

在这里插入图片描述

自定义Dailog

自定义 Dialog 对象,需要继承 Dialog 类,尽管 Dialog 提供了 child 参数可以用来写视图界面,但是往往会达不到我们想要的效果,因为默认的 Dialog 背景框是满屏的,不符合弹出框的特点。如果我们想完全定义界面,就需要重写 build 函数。

  1. 新建自定义组件 myDialog.dart

    InkWell 组件是 Flutter 中的一个特殊的交互式组件,它提供了水波纹效果和触摸事件处理能力。当用户点击 InkWell 组件时,它会显示一个水波纹动画效果,以指示用户的交互。除了点击事件外,InkWell 组件还可以处理其他手势事件,如长按、双击等。InkWell 通常用于包装其他可点击的组件,如按钮或列表项,以增强用户交互体验。

    import 'package:flutter/material.dart';
    
    class MyDialog extends Dialog {
      final String title; //标题
      final String content; //内容
      final Function()? onTap; //方便我们在外部获取其返回值
      const MyDialog(
          {super.key,
          required this.title,
          required this.content,
          required this.onTap});
      
      Widget build(BuildContext context) {
        return Material(
          type: MaterialType.transparency, //设置背景透明
          child: Center(
            //包裹在Center组件中,不然会全屏
            child: Container(
              height: 240,
              width: 240,
              color: Colors.white,
              child: Column(
                children: [
                  Padding(
                    padding: const EdgeInsets.all(5),
                    child: Stack(
                      children: [
                        Align(
                          alignment: Alignment.centerLeft,
                          child: Text(
                            title,
                            style: const TextStyle(fontSize: 18),
                          ),
                        ),
                        Align(
                          alignment: Alignment.centerRight,
                          child: InkWell(
                            onTap: onTap,
                            child: const Icon(Icons.close),
                          ),
                        )
                      ],
                    ),
                  ),
                  const Divider(),
                  Container(
                    padding: const EdgeInsets.all(10),
                    width: double.infinity,
                    child: Text(content, style: const TextStyle(fontSize: 14)),
                  )
                ],
              ),
            ),
          ),
        );
      }
    }
    
  2. 定义一个按钮,调用 MyDialog

    void _myDialog() async {
      var result = await showDialog(
          context: context,
          builder: (context) {
            return MyDialog(
              title: "提示!",
              content: "我是一个内容",
              onTap: () {
                Navigator.of(context).pop("自定义Dialog关闭");
              },
            );
          });
      print(result);
    }
    
  3. 效果

    在这里插入图片描述

PageView组件

Flutter 中的轮动图以及抖音上下滑页切换视频功能等等,这些都可以通过 PageView 轻松实现。

PageView 常见属性:

属性描述
scrollDirection默认为 Axis.horizontal:水平方法;Axis.vertical:垂直方向
children配置子元素
allowImplicitScrolling缓存当前页面的前后两页
onPageChangedpage改变的时候触发

PageView的使用

写一个 pageView.dart

import 'package:flutter/material.dart';

class PageViewPage extends StatefulWidget {
  const PageViewPage({super.key});

  
  State<PageViewPage> createState() => _PageViewPageState();
}

class _PageViewPageState extends State<PageViewPage> {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("PageView"),
      ),
      body: PageView(
        scrollDirection: Axis.vertical,
        children: [
          Center(
            child:
                Text("第1屏", style: Theme.of(context).textTheme.headlineLarge),
          ),
          Center(
            child:
                Text("第2屏", style: Theme.of(context).textTheme.headlineLarge),
          ),
          Center(
            child:
                Text("第3屏", style: Theme.of(context).textTheme.headlineLarge),
          ),
          Center(
            child:
                Text("第4屏", style: Theme.of(context).textTheme.headlineLarge),
          ),
          Center(
            child:
                Text("第5屏", style: Theme.of(context).textTheme.headlineLarge),
          ),
        ],
      ),
    );
  }
}

然后将其写在路由中,再在 home.dart 添加一个按钮用来跳转,效果就是可以上下滑动切换页面:

在这里插入图片描述

在这里插入图片描述

PageView.builder

PageView.builder 同理

import 'package:flutter/material.dart';

class PageViewBuilderPage extends StatefulWidget {
  const PageViewBuilderPage({super.key});

  
  State<PageViewBuilderPage> createState() => _PageViewBuilderPageState();
}

class _PageViewBuilderPageState extends State<PageViewBuilderPage> {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("pageViewBuilder"),
      ),
      body: PageView.builder(
          scrollDirection: Axis.vertical,
          itemCount: 6, //页数
          itemBuilder: (context, index) {
            return Center(
                child: Text("第$index屏",
                    style: Theme.of(context).textTheme.headlineLarge));
          }),
    );
  }
}

在这里插入图片描述

PageView上拉无限加载的实现思路

新建 pageViewFullPage.dart

import 'package:flutter/material.dart';

class PageViewFullPage extends StatefulWidget {
  const PageViewFullPage({super.key});

  
  State<PageViewFullPage> createState() => _PageViewFullPageState();
}

class _PageViewFullPageState extends State<PageViewFullPage> {
  final List<Widget> _list = [];

  
  void initState() {
    super.initState();
    for (var i = 0; i < 10; i++) {
      _list.add(MyPage(text: "第${i + 1}屏"));
    }
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text("pageview无限加载"),
        ),
        body: PageView(
          scrollDirection: Axis.vertical, // 滑动方向为垂直方向
          onPageChanged: (index) {
            //当页面快加载完时, 继续添加页面
            if (index + 2 == _list.length) {
              setState(() {
                for (var i = 0; i < 10; i++) {
                  _list.add(MyPage(text: "第${i + 1}屏"));
                }
              });
            }
          },
          children: _list,
        ));
  }
}

class MyPage extends StatefulWidget {
  final String text;
  const MyPage({super.key, required this.text});
  
  State<MyPage> createState() => _MyPageState();
}

class _MyPageState extends State<MyPage> {
  
  Widget build(BuildContext context) {
    return Center(
      child:
          Text(widget.text, style: Theme.of(context).textTheme.headlineLarge),
    );
  }
}

无限加载的效果就是,当我们上滑到第10屏后,再下滑就会回到第1屏

PageView实现无限轮播图

实现如下效果,有三张图片可以左右一直滑动,同时图片下方有圆点跟随移动:

在这里插入图片描述

新建 pageViewSwiper.dart

import 'package:flutter/material.dart';

class PageViewSwiperPage extends StatefulWidget {
  const PageViewSwiperPage({super.key});

  
  State<PageViewSwiperPage> createState() => _PageViewSwiperPageState();
}

class _PageViewSwiperPageState extends State<PageViewSwiperPage> {
  List<Widget> list = [];
  int _currentIndex = 0;

  
  void initState() {
    super.initState();
    list = const [
      ImagePage(
          src: "https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/1.jpg"),
      ImagePage(
          src: "https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/2.jpg"),
      ImagePage(
          src: "https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/3.jpg"),
    ];
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('PageView无限轮播图'),
      ),
      body: Stack(
        children: [
          SizedBox(
            height: 200,
            child: PageView.builder(
                onPageChanged: (index) {
                  setState(() {
                    _currentIndex = index % list.length;
                  });
                },
                itemCount: 1000,
                itemBuilder: (context, index) {
                  return list[index % list.length];
                }),
          ),
          Positioned(
            left: 0,
            right: 0, //设置left:0,right:0就会占满整行
            bottom: 2,
            child: Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: List.generate(list.length, (index) {
                return Container(
                  margin: const EdgeInsets.all(5),
                  width: 10,
                  height: 10,
                  decoration: BoxDecoration(
                      //图标下标和圆点下标一致时,圆点显示为蓝色; 否则为灰色
                      color: _currentIndex == index ? Colors.blue : Colors.grey,
                      shape: BoxShape.circle //圆
                      ),
                );
              }).toList(),
            ),
          )
        ],
      ),
    );
  }
}

class ImagePage extends StatefulWidget {
  final double height; //图片高度
  final double width; //图片宽度
  final String src; //图片地址
  const ImagePage(
      {super.key,
      this.height = 200,
      this.width = double.infinity,
      required this.src});

  
  State<ImagePage> createState() => _ImagePageState();
}

class _ImagePageState extends State<ImagePage> {
  
  Widget build(BuildContext context) {
    return SizedBox(
      height: widget.height,
      width: widget.width,
      child: Image.network(widget.src),
    );
  }
}

定时器

我们可以使用 Timer.periodic() 来创建定时器,需要导包:

import 'dart:async';
//创建定时器, 3秒
var timer = Timer.periodic(const Duration(seconds: 3), (t) {
  print('afterTimer=' + DateTime.now().toString());
});

组件销毁的时候取消定时器:

void dispose() {
  super.dispose();
  timer.cancel();
}

定时器加PageController实现动态轮播图

我们将前面实现的轮播图抽离出来,方便我们实现轮播图,同时加上定时器,让其定时切换页面,实现动态轮播图的效果。

抽离为 swiper.dart

import 'dart:async';
import 'package:flutter/material.dart';

class Swiper extends StatefulWidget {
  final double width;
  final double height;
  final List<String> list; //页面信息列表
  const Swiper(
      {super.key,
      this.height = 200,
      this.width = double.infinity,
      required this.list});

  
  State<Swiper> createState() => _SwiperState();
}

class _SwiperState extends State<Swiper> {
  int _currentIndex = 0;
  List<Widget> pageList = []; //页面列表
  late PageController _pageController;
  late Timer timer;

  
  void initState() {
    super.initState();
    //数据
    for (var i = 0; i < widget.list.length; i++) {
      pageList.add(ImagePage(
          width: widget.width, height: widget.height, src: widget.list[i]));
    }
    //PageController, 默认显示第一页
    _pageController = PageController(initialPage: 0);

    //定时器
    timer = Timer.periodic(const Duration(seconds: 3), (t) {
      //进行页面切换
      _pageController.animateToPage((_currentIndex + 1) % pageList.length,
          duration: const Duration(milliseconds: 300), curve: Curves.linear);
    });
  }

  
  void dispose() {
    super.dispose();
    timer.cancel();
    _pageController.dispose();
  }

  
  Widget build(BuildContext context) {
    return Stack(
      children: [
        SizedBox(
          height: 200,
          child: PageView.builder(
              controller: _pageController,
              onPageChanged: (index) {
                setState(() {
                  _currentIndex = index % pageList.length;
                });
              },
              itemCount: 1000,
              itemBuilder: (context, index) {
                return pageList[index % pageList.length];
              }),
        ),
        Positioned(
            left: 0,
            right: 0,
            bottom: 2,
            child: Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: List.generate(pageList.length, (index) {
                return Container(
                  margin: const EdgeInsets.all(5),
                  width: 10,
                  height: 10,
                  decoration: BoxDecoration(
                      color: _currentIndex == index ? Colors.blue : Colors.grey,
                      shape: BoxShape.circle //圆
                      ),
                );
              }).toList(),
            ))
      ],
    );
  }
}

class ImagePage extends StatelessWidget {
  final double width;
  final double height;
  final String src;
  const ImagePage(
      {super.key,
      this.width = double.infinity,
      this.height = 200,
      required this.src});

  
  Widget build(BuildContext context) {
    return SizedBox(
      width: width,
      height: height,
      child: Image.network(
        src,
        fit: BoxFit.cover,
      ),
    );
  }
}

pageViewSwiper.dart

import 'package:flutter/material.dart';
import '../widget/swiper.dart';

class PageViewSwiperPage extends StatefulWidget {
  const PageViewSwiperPage({super.key});

  
  State<PageViewSwiperPage> createState() => _PageViewSwiperPageState();
}

class _PageViewSwiperPageState extends State<PageViewSwiperPage> {
  List<String> list = [];

  
  void initState() {
    super.initState();
    list = [
      "https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/1.jpg",
      "https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/2.jpg",
      "https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/3.jpg",
      "https://xixi-web-tlias.oss-cn-guangzhou.aliyuncs.com/4.jpg",
    ];
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('PageViewSwiper'),
        ),
        body: ListView(
          children: [
            Swiper(list: list),
          ],
        ));
  }
}

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1701511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重生之while在鸣潮学习HTML

个人主页&#xff1a;终端 今天是开荒的第五天&#xff0c;数据坞都刷了吗&#xff0c;没刷就过来学html&#xff01; 目录 JavaWeb学习路线 1.HTML入门 1.1什么是HTML 1.2HTML&CSS&JavaScript的作用 1.3什么是超文本 1.4什么是标记语言 1.5HTML基础结构 1.6HTML的…

图形学初识--双线性插值算法

文章目录 为什么需要双线性插值算法&#xff1f;双线性插值算法是什么&#xff1f;如何双线性插值&#xff1f;结尾&#xff1a;喜欢的小伙伴可以点点关注赞哦 为什么需要双线性插值算法&#xff1f; ChatGP回答&#xff1a; 双线性插值&#xff08;bilinear interpolation&am…

【UE5.1 角色练习】08-传送技能

前言 在上一篇&#xff08;【UE5.1 角色练习】07-AOE技能&#xff09;基础上继续实现人物通过鼠标点击然后传送技能的功能。 效果 步骤 1. 首先需要显示鼠标光标&#xff0c;我们可以在玩家控制器中勾选“显示鼠标光标” 2. 在项目设置中添加一个操作映射&#xff0c;设置按…

助力企业标准化搭建--图框模板的创建

古有秦皇书同文、车同轨&#xff0c;今各行各业都有国际标准、国家标准&#xff0c;其目的就是为了标准化、统一化&#xff0c;由此可见标准化的重要性&#xff1b;一个企业若是想规范员工的操作&#xff0c;推行标准化也很重要&#xff1b;因此对于需要绘制电气图纸的行业来说…

路由器交换机直连方案(RM50+RTL8367N)

不经过网口和变压器&#xff0c;实现板级网口扩展。 通过网口&#xff0c;网线连接 板级芯片直接连接&#xff0c;验证OK 激光导航控制板通过路由器上网成功

linux定时任务管理操作

1、Crontab命令格式 crontab [-u username] [-l|-e|-r] 参数&#xff1a; -u: 只有root才能进行这个任务&#xff0c;也即帮其他用户新建/删除crontab工作调度; -e: 编辑crontab 的工作内容; -l: 查阅crontab的工作内容; -r: 删除所有的crontab的工作内容&#xff0c;若仅…

LangChain 0.2 - 对话式RAG

文章目录 一、项目说明二、设置1、引入依赖2、LangSmith 三、Chains1、添加聊天记录Contextualizing the question聊天记录状态管理 2、合并 四、Agents1、检索工具2、代理建造者3、合并 五、下一步 本文翻译整理自&#xff1a;Conversational RAG https://python.langchain.co…

【电控实物-PMSM】

遗留问题 电流环闭环 电流环频率会受到编码器回传频率影响&#xff1f; Ld&Lq辨识 L观测器设计验证 滑膜观测器/高频注入 前馈&#xff08;加大负载&#xff09; 各种电流控制模式&#xff1a; 参数辨识 Ld&Lq

Latex:newcommand

参考文献&#xff1a; latex中自定义的命令———\newcommand-CSDN博客LaTeX技巧924&#xff1a;详解newcommand的参数和默认值 - LaTeX工作室 (latexstudio.net) 文章目录 (re)newcommand自定义的一些命令 (re)newcommand ”定义命令“ 的定义&#xff1a; \newcommand{<…

Oladance、韶音、南卡开放式耳机选哪个?2024年主流产品硬核测评!

近期&#xff0c;不少朋友向我咨询关于挑选开放式耳机的建议&#xff0c;希望找到既适合自己又具有高品质的选项。鉴于市场上开放式耳机品牌繁多&#xff0c;每款产品在音质、佩戴感受及整体性能上的表现各有千秋&#xff0c;正确选择一款耳机成为了音乐爱好者们关注的焦点。错…

147.栈与队列:滑动窗口最大值(力扣)

代码解决 class Solution { private:class MyQueue{public:deque<int> que;// 删除队列中的元素&#xff0c;如果该元素等于队列的front// 这是为了保持队列中元素的正确性void pop(int val){if(!que.empty() && val que.front()){que.pop_front();}}// 添加元素…

ABeam 德硕 Team Building | SDC Green Day——环保公益行动

山野好拾光 春日公益行 继上年度大连办公室Green Day活动的顺利举办&#xff0c;环保的理念更加深入到ABeam每一位员工的心中。春日天气晴好&#xff0c;西安办公室的小伙伴们也迫不及待来上一场说走就走的Green Day Outing活动。 本次环保公益行动主题为「夏日Go Green畅享山…

AI预测体彩排3采取888=3策略+和值012路一缩定乾坤测试5月27日预测第3弹

今天继续基于8883的大底进行测试&#xff0c;今天继续测试&#xff0c;好了&#xff0c;直接上结果吧~ 首先&#xff0c;888定位如下&#xff1a; 百位&#xff1a;7,6,8,5,9,2,0,1 十位&#xff1a;1,2,4,3,6,7,8,9 个位&#xff1a;2,1,0,3,4,5,6,7 …

amis 文件上传 大文件分块上传

amis 图片/文件上传组件 receiver&#xff1a;参数配置为上传接口。 {"type": "input-image", // "type": "input-file","label": "照片","name": "url", "imageClassName": &qu…

德勤:中国、印度等对ChatGPT等生成式AI应用,处领先地位

全球四大会计事务所之一的德勤&#xff08;Deloitte&#xff09;在官网发布了一份&#xff0c;名为《Generative AI in Asia Pacific: Young employees lead as employers play catch-up》的深度调查报告。 主要查看中国、澳大利亚、印度、日本、新加坡、韩国、中国台湾等亚太…

RocketMq源码解析三:路由管理

Nameserver的主要作用是为消息的生产者和消息消费者提供关于主题Topic的路由信息&#xff0c;那么Nameserver需要存储路由的基础信息&#xff0c;还要管理Broker节点&#xff0c;包括路由注册、路由删除等。 一、路由元数据 路由元数据主要保存了topic信息&#xff0c;broker信…

蓝卓入选工信部2023年度“揭榜挂帅”项目

蓝卓“面向多元异构和应用快速开发演化的智能工厂操作系统解决方案”&#xff0c;凭借行业领先的平台技术能力以及数智赋能的硬核实力成功揭榜挂帅。 本次入选不仅代表了蓝卓又一次获得工信部权威专家及国家认可&#xff0c;更是“工厂操作系统”首次在国家层面获得表彰。 智能…

海外网红营销新趋势:“快闪式”营销如何迅速提升品牌曝光度

在当今数字化时代&#xff0c;海外网红营销已成为品牌迅速触达全球消费者、提升品牌曝光度和刺激销售的重要手段。其中&#xff0c;“快闪式”营销以其独特的时效性、创意性和互动性&#xff0c;成为品牌与海外网红合作的新趋势。本文Nox聚星将和大家探讨如何利用海外网红的影响…

【Go专家编程——内存管理——逃逸分析】

逃逸分析 逃逸分析&#xff08;Escape Analysis&#xff09;是指由编译器决定内存分配的位置&#xff0c;不需要程序员决定。 在函数中申请一个新的对象 如果分配在栈上&#xff0c;则函数执行结束后可自动将内存回收如果分配在堆上&#xff0c;则函数执行结束后可交给GC&…