Weekly #2: "Success" is not "forever"

Hi ~ This is liuyuxin, and this is my second weekly report. This week, I mainly focused on updating MeRead, and spent a lot of time over the weekend helping my girlfriend organize materials for her graduate school application.

My weekly report will be updated every Monday morning through WeChat official account and personal blog. Please search for "刘玉新" on WeChat official account, and the blog address is: The blog supports RSS subscription:

Here is the main content.

Development: MeRead welcomes a major update#

The main development work this week focused on the iteration of MeRead, and version 0.6.0 was released on Thursday afternoon. The main updates are as follows:

  • Optimization: Migrated the database from Sqflite to Isar
  • Optimization: Used FlutterToast instead of SnackBar
  • Feature: Read articles grouped by subscription source
  • Feature: Remember the expanded state of the sidebar subscription source list
  • Feature: Batch delete subscription sources
  • Feature: Added a "Get Original Article" button on the reading page
  • Feature: Copy the subscription source address by clicking on it on the subscription source editing page
  • Fix: Unable to import files with the extension .opml
  • Fix: Error when returning from a network link on the reading page
  • Fix: Page state not updated in a timely manner when setting global zoom
  • Other: Updated some UI interfaces

Please go to Github to download the update (don't forget to star 😊): Releases · gvenusleo/MeRead

Here are a few issues I encountered during the development process.

Why migrate the database#

From the first version of MeRead in November last year to version 0.5.0 two weeks ago, it has always used SQLite as the database with the help of Sqflite. As one of the most popular databases on pub, Sqflite does provide a good development experience. However, after encountering the Isar database, which is described as "a super-fast cross-platform database specifically designed for Flutter," I decided to migrate the database.

According to the official website, Isar supports all platforms, including mobile (iOS, Android), desktop (Windows, MacOS, Linux), and web. I have considered expanding MeRead to the desktop, so migrating the database earlier will save a lot of trouble in the future. In addition to the necessary functions such as CRUD, indexing, associations, and full-text search, Isar also attracted me with the following three points:

  • True cross-platform: Unlike Sqflite, which only supports mobile and MacOS, Isar supports all platforms. This is important for me because I plan to expand MeRead to the desktop in the future.
  • More data type support: Sqflite only supports four data types: int, num, String, and Uint8List, while Isar also supports bool, float, DateTime, List, as well as nested objects and enums.
  • Intuitive and useful debugging tool: Isar comes with a debugging tool called "Isar Inspector," which allows visual operations on the database.

Isar Inspector

In conclusion, I highly recommend using the Isar database for Flutter development. Once you've used it, it's hard to go back to Sqflite...

Giving up on using SnackBar#

I have never liked the SnackBar component. I think it is one of the ugliest components in the Material You design guidelines. In addition, there were user feedback that SnackBar does not automatically disappear after 2 seconds as intended on Android-like native systems (this issue also occurred on my own moto X30), which further strengthened my determination to replace the SnackBar component. Of course, before replacing it, I wanted to find out the cause of the bug. After flipping through the official documentation, it clearly states:

A SnackBar with an action will not time out when TalkBack or VoiceOver are enabled. This is controlled by AccessibilityFeatures.accessibleNavigation.
Perhaps different Android systems handle SnackBar differently. So I decided to switch to FlutterToast, which also reduces the amount of code.

My code is not wrong!#

Another interesting bug I fixed was that MeRead couldn't import files with the extension .opml. Since my own OPML files have the extension .xml, I didn't notice this problem until a user reported it. I looked at my source code, and the relevant code was written like this:

final result = await FilePicker.platform.pickFiles(
  type: FileType.custom,
  allowedExtensions: ['opml', 'xml'],

I was confused. Doesn't it clearly state that files with the extensions .opml and .xml are supported? Why does .xml work but not .opml?

So I went to the flutter_file_picker documentation and issues to find out. Finally, based on issues#1148 and related wiki, I came to the conclusion that this is an issue with the Android file system and has nothing to do with my code 😌

My final solution was: since I couldn't specify the allowed file extensions, I decided to allow any file to be selected and then check if the file extension is correct.

Working overtime for a release#

On Monday, I received feedback from a user that their OPML file couldn't be imported. Since MeRead imports OPML files silently in the background, and the user's OPML file was relatively large, I didn't pay much attention at the time and told them it might be due to poor network conditions, and they should wait a bit longer. On Saturday, I saw that the user's problem was still unresolved, and they even sent me their OPML file. I tested it and indeed couldn't import it. When I returned to the dormitory in the evening, I immediately started debugging on my computer and quickly found the cause: OPML files from different sources have some differences in format, which caused MeRead to occasionally encounter null safety errors when parsing the file. After finding the problem, I fixed it in two minutes. I immediately released a new version that night.

So now the latest version of MeRead is 0.6.1. In addition to fixing the OPML import issue, there are two other updates:

  • New feature: Ability to select all and deselect all when deleting subscription sources
  • Optimization: Optimized the way links are opened within the app

Reading: "Success" is not "forever"#

On Friday, I came across the following post on Jike:

Life is not about tasks

It immediately reminded me of another tweet I saw on Twitter a long time ago:

I think a lot about how we as a culture have turned "forever" into the only acceptable definition of success.
Like... if you open a coffee shop and run it for a while and it makes you happy but then stuff gets too expensive and stressful and you want to do something else so you close it, it's a "failed" business. If you write a book or two,then decide that you don't actually want to keep doing that, you're a "failed" writer. If you marry someone, and that marriage is good for a while,and then stops working and you get divorced, it's a "failed" marriage.
The only acceptable "win condition" is "you keep doing that thing forever". A friendship that lasts for a few years but then its time is done and you move on is considered less valuable or not a "real" friendship. A hobby that you do for a while and then are done with is a "phase" - or, alternatively, a "pity" that you don't do that thing any more. A fandom is "dying" because people have had a lot of fun with it but are now moving on to other things.
I just think that something can be good, and also end,and that thing was still good. And it's okay to be sad that it ended, too. But the idea that anything that ends is automatically less than this hypothetical eternal state of success... I don't think that's doing us any good at all.

I agree with the viewpoint expressed in it, the idea that "life is a process, not a result." Some things can be beautiful, even if they are abandoned. "Forever" should not be synonymous with success, and life should not be confined to a specific outcome.

Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.