首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有人能帮我实现默认颤动计数器应用的Sqflite吗?

Sqflite是一个在Flutter中使用SQLite数据库的插件。它提供了一种简单的方式来创建、读取、更新和删除数据库中的数据。

默认颤动计数器应用是一个简单的示例应用,用于展示如何使用Sqflite插件来实现一个计数器功能。以下是实现默认颤动计数器应用的步骤:

  1. 首先,确保已经在Flutter项目中添加了Sqflite插件的依赖。可以在项目的pubspec.yaml文件中添加以下依赖:
代码语言:txt
复制
dependencies:
  sqflite: ^x.x.x

请将^x.x.x替换为最新的Sqflite版本号。

  1. 在Flutter应用的代码中,导入Sqflite插件:
代码语言:txt
复制
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
  1. 创建一个数据库帮助类,用于管理数据库的创建和升级。可以创建一个名为DatabaseHelper的类,并添加以下代码:
代码语言:txt
复制
class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper.internal();
  factory DatabaseHelper() => _instance;

  static Database? _db;

  Future<Database?> get db async {
    if (_db != null) {
      return _db;
    }
    _db = await initDb();
    return _db;
  }

  DatabaseHelper.internal();

  Future<Database> initDb() async {
    String databasesPath = await getDatabasesPath();
    String path = join(databasesPath, 'counter.db');

    // 打开数据库
    return await openDatabase(path, version: 1, onCreate: _onCreate);
  }

  void _onCreate(Database db, int version) async {
    // 创建表
    await db.execute('''
      CREATE TABLE counter (
        id INTEGER PRIMARY KEY,
        count INTEGER
      )
    ''');

    // 插入默认数据
    await db.rawInsert('INSERT INTO counter (id, count) VALUES(1, 0)');
  }

  // 更新计数器
  Future<void> updateCounter(int count) async {
    Database? dbClient = await db;
    await dbClient?.update('counter', {'count': count}, where: 'id = ?', whereArgs: [1]);
  }

  // 获取计数器
  Future<int> getCounter() async {
    Database? dbClient = await db;
    List<Map<String, dynamic>> result = await dbClient?.query('counter', where: 'id = ?', whereArgs: [1]);
    return result.isNotEmpty ? result.first['count'] : 0;
  }
}
  1. 在Flutter应用的界面中,使用DatabaseHelper类来更新和获取计数器的值。例如,可以创建一个名为CounterPage的页面,并添加以下代码:
代码语言:txt
复制
import 'package:flutter/material.dart';

class CounterPage extends StatefulWidget {
  @override
  _CounterPageState createState() => _CounterPageState();
}

class _CounterPageState extends State<CounterPage> {
  int _counter = 0;
  DatabaseHelper _databaseHelper = DatabaseHelper();

  @override
  void initState() {
    super.initState();
    _loadCounter();
  }

  void _loadCounter() async {
    int counter = await _databaseHelper.getCounter();
    setState(() {
      _counter = counter;
    });
  }

  void _incrementCounter() async {
    setState(() {
      _counter++;
    });
    await _databaseHelper.updateCounter(_counter);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Counter App'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '$_counter',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _incrementCounter,
              child: Text('Increment'),
            ),
          ],
        ),
      ),
    );
  }
}
  1. 在应用的主界面中,导航到CounterPage页面。例如,可以在main.dart文件中的MaterialApphome属性中设置CounterPage作为初始页面。
代码语言:txt
复制
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CounterPage(),
    );
  }
}

通过以上步骤,你已经成功实现了默认颤动计数器应用的Sqflite版本。每次点击增加按钮时,计数器的值会增加,并且该值会保存在SQLite数据库中。

请注意,以上代码仅为示例,实际应用中可能需要根据具体需求进行适当修改和优化。

关于Sqflite插件的更多信息和使用方法,你可以参考腾讯云的文档和示例代码:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

FlutterUnit 桌面分支合并,一套代码 - 五端通行

打开数据库 由于 windows 和 linux 使用的是 sqflite_common_ffi 所以开启数据库的方式不同。...设置窗口大小 不同桌面默认的大小不同,可以使用 desktop_window 插件来控制桌面端窗口尺寸。...: image.png windows 的表现: image.png ---- 四、布局的适配 对于多态的布局适配来说,没有必要强求一个组件能在所有平台的能适配。...另外这样也更容易分工,现实中可以让桌面端的 UI 实现交给不同的人实现,毕竟要支持桌面端,就注定有人要多干活。 对于一些差别不太大的界面,可以在构件时进行适配。...目前 Flutter 对于桌面端,非常适合一些工具软件的开发,或者依赖于网络、数据库的展示类型的软件。 比如下面是我基于 AndroidStudio 界面使用 Flutter 打造的正则匹配应用。

1.6K20

Flutter中利用MapCache加sqflite实现一个伪LRU三级缓存

在做flutter应用的时候,遇到了一个问题,纯粹属于自己给自己加戏,问题是什么呢?...我的app首页是一个列表,目前每次进应用,都是通过网络拿到新的列表,所以,如果没有网络了,就看到了一个菊花,这样的用户体验可能并不怎么好吧,因此,这块的化,想给自己挖一个坑,让自己填一下,本来以为是一个非常简单的问题...那么简单模拟实现有没有,我想到了一个思路。 5、MapCache作为内存缓存,sqflite作为磁盘缓存,那么好,LRU怎么实现呢?...,主要是一些数据库的操作,以及偷懒的LRU实现: import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; ///...蓦然回首 当然,我在实现的时候,也了解到有人做了disk_lru_cache了,不过我还是没有使用这个,如果要替换也是相当简单的一件事,不过因为现在这个库测试覆盖不全,评分不是太高,所以暂且还是使用自己的实现

3.5K61
  • JVM(2)--一文读懂垃圾回收

    此时对于这个没有任何变量指向的对象,你觉得它还有用处吗? 显然,对于这种没有被变量指向的对象,它是一点卵用也没有的,它只能在堆随风漂流。...计数器就减1。...那么我们就可以判断,如果这个计数器为0的话,那它就是垃圾对象了,否则就是有用的对象。 对于这种方法,我们称之为引用计数法。 好吧,我们先来夸一夸引用计数法这种方法: 实现简单。...居然帮我们解决了我们必须夸一下它:不仅帮我们解决了问题,而且实现上也简单、运行也高效。 但是(凡事都有个但是的),它也是有缺点的,缺点很明显,发现了没有。...所以说,HotShot虚拟机是默认按8:1的比例来分配的。这样,就不会出现很多内存没用到的问题了。 可能有人会说,万一占比为1/9的内存不够用了怎么办?不就没地方存那些活的对象?

    33330

    Flutter 凉了吗?

    除非您使用像Flutter这样的SDK,这样您就将拥有一个能适配两个操作系统的代码库。不仅如此,你还可以完全原生地运行它们。这意味着诸如浏览页面和导航之类的东西,完美配合不同的操作系统。...这只是Flutter提供的小部件中的几个,除这些之外还有很多。使用这些小部件,我们可以构建一个非常简单的UI: Flutter像一个拥有各种各样道具的魔术师,使你能轻而易举地构建App的主题。...考虑到Dart和Flutter的大量可用的库,这根本不是问题。是否有兴趣在你的应用中投放广告?有这方面的库。想要新的小部件吗?有这方面的库。...例如,如果要添加sqflite库: 将它添加到文件后,运行flutter packages get,这样就好了。各种各样的库使开发Flutter应用程序变得轻而易举,并为开发过程节省了大量时间。...可以使用库,以便你使用所选择的数据库。使用sqflite库,我们可以非常快速地启动并运行SQLite数据库。

    3.1K20

    Spring源码剖析1:Spring概述

    可能有人说了,比如“抽象工厂、工厂方法设计模式”不也可以帮我们创建对象,“生成器模式”帮我们处理对象间的依赖关系,不也能完成这些功能吗?...而且不管是JAVA SE(C/S架构)应用程序还是JAVA EE(B/S架构)应用程序都可以使用这个平台进行开发。让我们来深入看一下Spring到底能帮我们做些什么?...所以,Spring能帮我们根据配置文件创建及组装对象之间的依赖关系。...所以,Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。 三、在传统应用程序当中,我们如何来完成数据库事务管理?...Spring能帮我们做这么多事情,提供这么多功能和与那么多主流技术整合,而且是帮我们做了开发中比较头疼和困难的事情,那可能有人会问,难道只有Spring这一个框架,没有其他选择?

    54610

    IT大咖撩段子

    不过还是有些常见的事会发生。相信大家也会遇到,希望能引起您的共鸣。 朋友用office时候,排版排不来就"XX ,你有时间吗?...我记得你是学计算机的吧,能不能帮我把这个word 排版改一下" 然后就成了自己慢慢百度学习office ,有人问office 就说你把文件发过来,我给你改好后给你。 有人安装应用,配不好环境时候。"...XX ,你是学计算机的吧,我这个应用怎么安装后不能用啊"。然后,还是默默百度教程,整理后发过去,或者直接teamview 。 有人电脑坏了,就"XX ,你是学计算机的吗?...我电脑这是怎么回事啊,你能帮我看看吗"。然后又恶补了修理知识。或许这也是为自己MacBook 被拆的一个个零件埋下伏笔吧。...当然这些很常见,还有一些回家后,有人喊着修电视,修手机,理由都是因为我学计算机的。嗯,快可以开个修理店了。 可是,我不是学软件的吗?我不应该敲代码吗?我是要面对一系列英阿中文啊! 唉,403教做人。

    95660

    Linux:进程间通信之system V

    第三步:通过地址空间的映射实现通信 然后我们就可以通过代码来让某些进程写,某些进程读,都通过他们的地址空间映射到该共享内存,从而实现了通信 第四步:通信结束后相关进程去关联 通信结束释放内存之前一定要去关联...问题:上述的操作都是由进程做的吗??...key 问题2 : 为什么key要由我们自己通过ftok指定,而不是由操作系统直接帮我们生成??...1.3 挂接共享内存——shmat 参数shmaddr:想让共享内存挂接到地址空间的什么位置,一般来说我们默认传null,这样就是由操作系统帮我们决定 参数shmflg:调整权限,比如说我们可以让该进程以只读的方式挂接...你妈就会骂他说:儿子都上大学了能一样么,你平时关心过他的学习过程吗??

    12910

    JAVA那点破事!并发、IO模型、集合、线程池、死锁、非阻塞、AQS....

    try-catch-finally,如catch中return了,还会执行finally吗? 答案:当然啦,会在return之前执行。 进程和线程的区别?...因为进程的创建、销毁、切换产生大量的时间和空间的开销,所以进程的数量不能太多 线程:是比进程更小的能独立运行的基本单位,他是进程的一个实体,可以减少程序并发执行时的时间和空间开销,使得操作系统具有更好的并发性...多个线程可以共享进程的系统资源。线程基本不拥有系统资源,只有一些运行时必不可少的资源,比如程序计数器、寄存器和栈,进程则占有堆。 synchronized 的内部原理?...默认是添加在列表的末尾,如果在位置 k 插入或删除一个元素,需要将k后面的元素后移或前移一位。...进程通过将一个或多个fd传递给select,阻塞在select操作上,select帮我们侦测多个fd是否准备就绪,当有fd准备就绪时,select返回数据可读状态,应用程序再调用recvfrom读取数据

    63130

    EonerCMS——做一个仿桌面系统的CMS(十-附最新源码)

    因为我每打开一个窗口,就绑定了一个永久性的dom元素,而dom元素的回收是靠计数器,计数器是会累加的,如果没有清零,即便删掉了节点,其实还是驻留在内存中。   ...既然大致明白了原理,处理起来就相对比较简单了,就一句话,首先先看下原先的关闭窗口的代码 //关闭 $('.task-window li[window="'+obj.attr('window')+'"...然后这次我还更新了事件绑定,因为窗口的创建、关闭、移动等事件,其实都是一样的,所以事件绑定我单独拎了出来,而非创建dom元素的时候进行绑定,这样只需注册一次,而且这样也能减少内存的占用吧,这个我没研究过...,希望有人能帮我解答下,事件越多是不是内存也会占用越多?   ...这次就更新了这些,写的比较少,因为代码修改没花太多时间,大部分都在学习和思考上,因为自己本身对js的生命周期、内存释放/泄漏不太了解,所以就花了点时间去了解,写的不对的地方,还希望大家指出。

    21420

    FL Studio水果20.9支持升级中文版

    FL Studio对电脑及相应配置要求不高,可以在不同设备中灵活应用。没有音乐类型限制,能支持制作各种音乐类型,让你的音乐突破想象力的限制。...其次提供了音效编辑器,音效编辑器可以编辑出各类声音针对在不同音乐中所要求的音效,例如,各类声音在特定音乐环境中所要展现出的高,低,长,短,延续,间断,颤动,爆发等特殊声效。...它的兼容性强,可以在不同的设备中灵活应用。当然,它也没有音乐类型限制,能支持制作各种音乐类型,让你的音乐突破想象力的限制。Mac支持FL Studio现在可用作64位本地macOS应用程序。...zoneid=41402FL Studio中文版常见问题答疑①中文版全部都是中文吗?不是,有些地方仍然是英文,因为一些词汇非通用词,还没有确切的翻译。②我能安装中文版的程序吗?...购买了中文版的用户才能激活和使用。③之前买的算是什么版本?是国际版。④国际版支持中文吗?支持,它是多语言的。⑤中文版的插件是中文的吗?不是,和程序一样,仍然有些是英文的,会逐步调整为中文。

    94000

    和学妹深入探讨CountDownLatch和CyclicBarrier的设计哲学

    最近监控发现对账系统最近越来越慢,领导急了,开始询问我能优化一下性能吗。...你发现,while循环每次都会创建新的线程,而创建线程是个性能开销很大的操作。最好能复用线程,所以想到使用线程池了吧!...在主线程,等待计数器0,这时说明这俩操作都执行完了。 而等待计数器0,就是一个条件变量,用管程实现就很简单。 还好JUC已经帮我们写好了这套逻辑:CountDownLatch。...// 等待两个查询操作结束(计数器 == 0) latch.await(); diff = check(pos, dos); save(diff); } 还能再优化吗?...这又该如何用代码实现呢? 你依然可以利用一个计数器解决刚才说的难点,计数器初始为2,t1、t2生产完一条数据都将计数器-1。

    58830

    (十六)STM32——尝试把窗口看门狗当成游戏中的困难模式来理解

    简介         窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。...如果在递减计数器达到窗口寄存器值之前刷新控制寄存器中的 7 位递减计数器值,也会产生 MCU 复位。这意味着必须在限定的时间窗口内刷新计数器。...相当于开了一个喂狗外挂,当它到0x40的时候,就会帮我们去喂狗,岂不妙哉!         ...配置步骤 使能 WWDG 时钟,这一步相当于我们买装备了,购买一个高精度的手表,帮助我们通关 设置窗口值和分频数,就是设置投喂窗口和时间范围 开启 WWDG 中断并分组,这个就相当于开外挂了,配置一个中断来帮我们喂狗...计数器的设置值,默认为最大.

    28310

    Blazor学习之旅(2)第一个Blazor应用

    本篇我们来构建第一个Blazor Web应用,这里我们选择Blazor Server类型,后面我们再学习Blazor WebAssembly类型。 话外音:有人问我西门子在用Blazor吗?...Blazor应用的结构 一个默认的Blazor应用的项目结构如下图所示: 其中: (1)Data文件夹主要存放Model和Service。 (2)Pages文件夹主要存放基于Razor的页面和组件。...(2)App.razor用于声明默认的Router。...Blazor应用初体验 这里,我们暂时啥也不改,Run起来看看效果: (1)首先是一段文字介绍: (2)点击Counter菜单,进入计数器页面: (3)点击Fetch data菜单,进入天气预报示例数据表格...: 计数器示例 在Pages/Counter.razor我们可以看到这个Counter组件的实现: @page "/counter" Counter <p role="status

    48120

    奇葩的能让程序员抓狂的一些问题

    你能教我写代码,并帮助我找工作吗: 对于那些想要学习新技能从而改善生活的人来说,这样的想法无可厚非,我也表示支持。但老实说,没有人有时间和耐心去免费教那些完全是一张白纸的人。...所以对于客户来说, 只管提出想法即可,不要轻易评估实现这个想法的难度,评估的工作还是交给我们专业的开发人员吧。 噢!你是程序员?你能帮我修一下打印机吗?: 请记住,程序员不是电子设备修理工!...二、 我的日常生活中充满了各种令人无语的话题,包括发生在普通人中的、父母亲人中的…… 情景1:不懂编程的普通人和程序员 普通人:我的系统扬声器出了点问题,有一侧的音频无法工作了。你能帮我修一下吗?...你能帮我修电脑吗? 程序员主要与计算机内部的软件打交道。对于 CPU、键盘和鼠标这样的外设,程序员并不熟悉,除非他有很强的硬件基础,当然,即使有硬件基础也不保证程序员会修电脑。...你能改一下这个背景吗?算了,别改了,我还是更喜欢上一个! 频繁改需求是让程序员最为头疼的问题之一。改变需求的人或许只是随口一说,但是对于程序员来说,为了实现这个改变可能需要变动大量的代码。

    62530

    深受程序员鄙视的外行语录,你被哪句话打击过?

    最近,有几位程序员朋友,向我吐槽,经常有人和他说一些让他恼怒的话,他听完都想打人啦。我听完之后也是哭笑不得,将这些程序员朋友的话给整理出来了,大家以后在程序员面前说话可得小心点。...我密码忘了,你帮我找回来。 你知道我开机密码/邮箱密码/QQ密码是多少吗? 我邮箱被盗了,你帮我盗回来。 我不小心删了xxxx,你帮我恢复回来吧。 你帮我看看这个手机/电脑,出什么毛病了?...手机进水/摔了,你能帮我修修吗? 听说那些程序猿,钱多话少死的早。 加班加到十点半,女朋友都存电脑。 机子蓝屏又死机,学电脑的来修好。 折腾半天弄不对,大学都学啥去了(liao)。...手机应用挺赚钱,周末上线早不早? 你这敲的啥玩意,一行能值几个钱。 账号密码帮我盗,游戏外挂少不了。 工资不如拿期权,不为钱财为理想。 到底是吃青春饭,不如跟我卖保险。卖!保!险! ?...公司妹子一副(老娘就是不给你钱还要找你帮忙)的样子:你就帮我改一下嘛,很简单的。 就从静态页面改成动态。一天能好不? 能骂人吗?不能?那没什么好说的! ?

    54510

    并发编程面试必备:AQS 原理以及 AQS 同步组件总结

    用过Semaphore吗?...enter image description here AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore...自定义同步器在实现时只需要实现共享资源 state 的获取与释放方式即可,至于具体线程等待队列的维护(如获取资源失败入队/唤醒出队等),AQS已经在上层已经帮我们实现好了。...默认情况下,每个方法都抛出 UnsupportedOperationException。 这些方法的实现必须是内部线程安全的,并且通常应该简短而不是阻塞。...一个典型应用场景就是启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。 ②实现多个线程开始执行任务的最大并行性。注意是并行性,不是并发,强调的是多个线程在某一时刻同时开始执行。

    68921

    要想精通java,你必须得知道java的内存模型,不忽悠

    那么,我们今天就来学习下JVM的内存模型 01 为什么要学习JVM内存模型 我们知道在开发中我们很少关注程序对象的内存管理,只是一味的去写程序然后运行程序,对于内存的分配和回收都是依靠默认的JVM去帮我们管理...如果,我们能更好的掌握JVM的这些策略,了解它的内存区域划分的话,我们就会很好的去避免故障的频繁发生,同时还可以针对我们的系统对其进行相应的优化。...也就是说,你知道咱们写的java类被加载到JVM哪里吗,写的那些方法又存在哪吗,还有方法里面的那些变量也需要内存去存放吧。...所以当JVM加载信息到内存之后,实际就会使用自己的字节码执行引擎,去执行我们编译出来的那些代码指令,那么在执行字节码指令的时候,JVM里就需要一块很小的内存空间,即为“程序计数器” 为什么需要程序计数器内...5 本地方法栈 本地方法栈和java虚拟机栈功能类似,java虚拟机栈用来管理java函数的调用,而本地方法栈是用来管理本地方法的,但是本地方法并不是java语言实现的,而是C语言实现的。

    50130

    【十问十答】对话Go语言开发团队

    有人说,Go为云而生,也正是由于其拥有并发性的操作系统以及完美的架构,使其备受开发者的青睐。   ...接下来,人们会不会尝试使用Go来进行桌面和嵌入式应用的编写? Dave Cheney:我乐于看到Go能在小的ARM处理器上有所表现。我们需要让编译器能针对不同的ARM生成相应的代码,这还比较简单。...另外,垃圾回收语言需要更多内存,但这也是可以解决的问题。 Brad Fitzpatrick:已经有人用Go编写GUI库了。 Q4:Go语言在对Android支持方面有什么新进展吗?...Dave Cheney:在今年的GopherCon 会议上,有一种强烈的感觉,设计即使崩溃也能安全恢复的健壮应用是程序员的天职。指望系统层面花费投入精力就能坐收百分百可靠性,是靠不住的。...Andrew Gerrand: 我觉得你应该反过来想想,即使Go语言把这些都实现了又能怎么样呢?整个进程崩溃,清理处理器没法调用时,你还不是得自己处理? Q8:堆压缩在路线图上吗?

    1.4K60

    JIT优化之道

    碎碎念 《JIT优化之道》是去年在公司的一次分享,对于公司组织分享我是赞同又不赞同,怎么讲呢? 技术分享当然是好的,这是一个双赢,分享者教学相长,而收听者也能更快的了解进步。...但以前在原先的公司也做过些类事情,但没有想象的好,大家对分享主题的探索也只限于在分享时间段内,过后很少有人,几乎没人去做进一步的探索。填鸭式的学习效果甚微。...当然,收益的变化还是依赖于编译器性能如何,哪些优化生效了或者被实现了,还有就是对于目标执行平台来说应用程序设计的有多好。后者是Java开发人员从来不需要担心的。...方法调用计数器 client默认1500次, server默认10000次, -XX:CompileThreshold 方法调用计数器并不是统计方法调用绝对次数,而是一个相对执行频率, 超过一定时间,...其中OnStackReplacePercentage默认值为140,InterpreterProfilePercentage默认值为33, 如果都取默认值,那Server模式虚拟机回边计数器的阈值为10700

    1K20

    JUC系列(七)| JUC三大常用工具类CountDownLatch、CyclicBarrier、Semaphore

    CountDownLatch是一个同步辅助类,允许一个或多个线程等待,一直到其他线程执行的操作完成后再执行。 CountDownLatch是通过一个计数器来实现的,计数器的初始值是线程的数量。...非常适用于在多线程环境下同步协调分阶段计算任务(Fork/Join框架中的子任务之间需同步时,优先使用Phaser) //默认的构造方法,初始化注册的线程数量为0,可以动态注册 Phaser(); //...* 所有人都到达了网吧,准备开始开黑!!! * 小李上着上着饿了,说去次烧烤吗? * 小明上着上着饿了,说去次烧烤吗? * 小王上着上着饿了,说去次烧烤吗?...Exchanger可以认为是 SynchronousQueue 的双向形式,在运用到遗传算法和管道设计的应用中比较有用。 这个的使用我在Dubbo中的总体架构图中看到了它的身影。...你好,我是博主宁在春,Java学习路上的一颗小小的种子,也希望有一天能扎根长成苍天大树。 希望与君共勉 待我们,别时相见时,都已有所成。

    85921
    领券