M lib/pages/group_list_page.dart => lib/pages/group_list_page.dart +3 -1
@@ 7,6 7,7 @@ import 'package:fluent_reader_lite/models/groups_model.dart';
import 'package:fluent_reader_lite/models/source.dart';
import 'package:fluent_reader_lite/models/sources_model.dart';
import 'package:fluent_reader_lite/utils/global.dart';
+import 'package:fluent_reader_lite/utils/utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
@@ 32,6 33,7 @@ class _GroupListPageState extends State<GroupListPage> {
automaticallyImplyLeading: false,
backgroundColor: Global.isTablet ? CupertinoColors.systemBackground : null,
leading: CupertinoButton(
+ minSize: 36,
padding: EdgeInsets.zero,
child: Text(S.of(context).cancel),
onPressed: () { Navigator.of(context).pop(); },
@@ 52,7 54,7 @@ class _GroupListPageState extends State<GroupListPage> {
final groupList = Consumer2<GroupsModel, SourcesModel>(
builder: (context, groupsModel, sourcesModel, child) {
final groupNames = groupsModel.groups.keys.toList();
- groupNames.sort();
+ groupNames.sort(Utils.localStringCompare);
return SliverList(
delegate: SliverChildBuilderDelegate((context, index) {
final groupName = groupNames[index];
M lib/pages/item_list_page.dart => lib/pages/item_list_page.dart +0 -1
@@ 342,7 342,6 @@ class _ItemListPageState extends State<ItemListPage> {
return SliverList(
delegate: SliverChildBuilderDelegate((content, index) {
return Selector2<ItemsModel, SourcesModel, Tuple2<RSSItem, RSSSource>>(
- key: Key(feed.iids[index]),
selector: (context, itemsModel, sourcesModel) {
var item = itemsModel.getItem(feed.iids[index]);
var source = sourcesModel.getSource(item.source);
M lib/pages/settings/sources_page.dart => lib/pages/settings/sources_page.dart +2 -0
@@ 4,6 4,7 @@ import 'package:fluent_reader_lite/components/my_list_tile.dart';
import 'package:fluent_reader_lite/generated/l10n.dart';
import 'package:fluent_reader_lite/models/sources_model.dart';
import 'package:fluent_reader_lite/utils/colors.dart';
+import 'package:fluent_reader_lite/utils/utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:provider/provider.dart';
@@ 19,6 20,7 @@ class SourcesPage extends StatelessWidget {
Consumer<SourcesModel>(
builder: (context, sourcesModel, child) {
var sources = sourcesModel.getSources().toList();
+ sources.sort((a, b) => Utils.localStringCompare(a.name, b.name));
return ListTileGroup(sources.map((s) => MyListTile(
title: Flexible(child: Text(s.name, overflow: TextOverflow.ellipsis)),
leading: Favicon(s, size: 20),
M lib/utils/utils.dart => lib/utils/utils.dart +13 -0
@@ 2,6 2,7 @@ import 'package:fluent_reader_lite/generated/l10n.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
+import 'package:lpinyin/lpinyin.dart';
import 'package:url_launcher/url_launcher.dart';
abstract class Utils {
@@ 65,4 66,16 @@ abstract class Utils {
),
);
}
+
+ static int localStringCompare(String a, String b) {
+ a = a.toLowerCase();
+ b = b.toLowerCase();
+ try {
+ String ap = PinyinHelper.getShortPinyin(a);
+ String bp = PinyinHelper.getShortPinyin(b);
+ return ap.compareTo(bp);
+ } catch(exp) {
+ return a.compareTo(b);
+ }
+ }
}=
\ No newline at end of file