Skip to content

Commit

Permalink
搜索优化
Browse files Browse the repository at this point in the history
  • Loading branch information
toly1994328 committed Apr 13, 2022
1 parent 703b57d commit b087382
Show file tree
Hide file tree
Showing 18 changed files with 242 additions and 177 deletions.
2 changes: 1 addition & 1 deletion lib/app/router/unit_router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class UnitRouter {
child: WidgetDetailPage(model: settings.arguments as WidgetModel));

case search:
return Right2LeftRouter(child: const SearchPage());
return Right2LeftRouter(child: const SearchPageProvider());
case collect:
return Right2LeftRouter(child: const CollectPage());

Expand Down
2 changes: 0 additions & 2 deletions lib/app/views/navigation/bloc_wrapper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,6 @@ class _BlocWrapperState extends State<BlocWrapper> {
BlocProvider<AuthenticBloc>(create: (_) => authBloc),
BlocProvider<CategoryWidgetBloc>(
create: (_) => CategoryWidgetBloc(categoryBloc: categoryBloc)),
BlocProvider<SearchBloc>(
create: (_) => SearchBloc(repository: repository)),
BlocProvider<PointBloc>(create: (_) => PointBloc()),
BlocProvider<UpdateBloc>(create: (_) => UpdateBloc()),
BlocProvider<GalleryUnitBloc>(create: (_) => GalleryUnitBloc()..loadGalleryInfo()),
Expand Down
4 changes: 2 additions & 2 deletions lib/app/views/navigation/unit_navigation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,8 @@ class _UnitNavigationState extends State<UnitNavigation> {

// 点击底部按钮事件,切换页面
void _onTapBottomNav(int index) {
_controller.animateToPage(index, duration: const Duration(milliseconds: 200), curve: Curves.linear);
// _controller.animateToPage(index, duration: const Duration(milliseconds: 200), curve: Curves.linear);
_controller.jumpToPage(index);

if(!isDark){
late Color color;
Expand All @@ -120,7 +121,6 @@ class _UnitNavigationState extends State<UnitNavigation> {
context.read<ColorChangeCubit>().change(color);
}


if (index == 2) {
BlocProvider.of<LikeWidgetBloc>(context).add(const EventLoadLikeData());
}
Expand Down
38 changes: 0 additions & 38 deletions lib/widget_system/blocs/search_bloc/search_bloc.dart

This file was deleted.

12 changes: 0 additions & 12 deletions lib/widget_system/blocs/search_bloc/search_event.dart

This file was deleted.

19 changes: 0 additions & 19 deletions lib/widget_system/blocs/search_bloc/search_state.dart

This file was deleted.

4 changes: 0 additions & 4 deletions lib/widget_system/blocs/widget_system_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,3 @@ export './liked_widget_bloc/liked_widget_bloc.dart';
export './liked_widget_bloc/liked_widget_event.dart';
export './liked_widget_bloc/liked_widget_state.dart';


export './search_bloc/search_bloc.dart';
export './search_bloc/search_event.dart';
export './search_bloc/search_state.dart';
26 changes: 23 additions & 3 deletions lib/widget_system/blocs/widgets_bloc/widgets_bloc.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import 'dart:async';

import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_unit/widget_system/repositories/model/widget_filter.dart';
import 'package:flutter_unit/widget_system/repositories/model/widget_model.dart';
import 'package:flutter_unit/widget_system/repositories/repositories.dart';

Expand All @@ -16,16 +19,33 @@ class WidgetsBloc extends Bloc<WidgetsEvent, WidgetsState> {

WidgetsBloc({required this.repository}):super(const WidgetsLoading()){
on<EventTabTap>(_onEventTabTap);
on<EventSearchWidget>(_onEventSearchWidget);
}

void _onEventTabTap(EventTabTap event, Emitter<WidgetsState> emit) async{
emit( const WidgetsLoading());
WidgetFilter filter = WidgetFilter.family(event.family);
try {
final List<WidgetModel> widgets = await repository.searchWidgets(
filter
);
emit( WidgetsLoaded(widgets: widgets,filter: filter));
} catch (err) {
print(err);
emit(WidgetsLoadFailed(err.toString(),filter: filter));
}
}

void _onEventSearchWidget(EventSearchWidget event, Emitter<WidgetsState> emit) async{
emit( const WidgetsLoading());
try {
final List<WidgetModel> widgets = await repository.loadWidgets(event.family);
emit( WidgetsLoaded(widgets: widgets));
final List<WidgetModel> widgets = await repository.searchWidgets(
event.filter
);
emit( WidgetsLoaded(widgets: widgets,filter: event.filter));
} catch (err) {
print(err);
emit(WidgetsLoadFailed(event.family,err.toString()));
emit(WidgetsLoadFailed(err.toString(),filter: event.filter));
}
}
}
5 changes: 5 additions & 0 deletions lib/widget_system/blocs/widgets_bloc/widgets_event.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:equatable/equatable.dart';
import 'package:flutter_unit/widget_system/repositories/model/enums.dart';
import 'package:flutter_unit/widget_system/repositories/model/widget_filter.dart';


/// create by 张风捷特烈 on 2020-03-03
Expand All @@ -21,4 +22,8 @@ class EventTabTap extends WidgetsEvent {
List<Object> get props => [family];
}

class EventSearchWidget extends WidgetsEvent {
final WidgetFilter filter;//参数
const EventSearchWidget({required this.filter});
}

13 changes: 7 additions & 6 deletions lib/widget_system/blocs/widgets_bloc/widgets_state.dart
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
import 'package:equatable/equatable.dart';
import 'package:flutter_unit/widget_system/repositories/model/enums.dart';
import 'package:flutter_unit/widget_system/repositories/model/widget_filter.dart';
import 'package:flutter_unit/widget_system/repositories/model/widget_model.dart';

/// create by 张风捷特烈 on 2020-03-03
/// contact me by email 1981462002@qq.com
/// 说明: 主页 Widget 列表 状态类
abstract class WidgetsState extends Equatable {

const WidgetsState();
final WidgetFilter filter;
const WidgetsState({required this.filter});

@override
List<Object> get props => [];
}

class WidgetsLoading extends WidgetsState {
const WidgetsLoading() ;

const WidgetsLoading({ WidgetFilter filter=const WidgetFilter()}) : super(filter:filter) ;
}

class WidgetsLoaded extends WidgetsState {
final List<WidgetModel> widgets;

const WidgetsLoaded( {this.widgets = const []});
const WidgetsLoaded( {this.widgets = const [],required WidgetFilter filter}): super(filter:filter);

@override
List<Object> get props => [widgets];
Expand All @@ -36,7 +36,8 @@ class WidgetsLoaded extends WidgetsState {
class WidgetsLoadFailed extends WidgetsState {
final String error;

const WidgetsLoadFailed(WidgetFamily activeFamily, this.error);
const WidgetsLoadFailed(this.error,
{required WidgetFilter filter}): super(filter:filter);

@override
List<Object> get props => [error];
Expand Down
36 changes: 23 additions & 13 deletions lib/widget_system/repositories/dao/widget_dao.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@

import 'package:flutter_unit/widget_system/repositories/model/enums.dart';
import 'package:flutter_unit/widget_system/repositories/model/widget_filter.dart';
import 'package:sqflite/sqflite.dart';
import '../bean/widget_po.dart';

Expand All @@ -16,7 +17,7 @@ class WidgetDao {
"INSERT INTO "
"widget(id,name,nameCN,deprecated,family,lever,linkWidget,info) "
"VALUES (?,?,?,?,?,?,?,?);";
return await db.transaction((tran) async => await tran.rawInsert(addSql, [
return db.transaction((tran) async => await tran.rawInsert(addSql, [
widget.id,
widget.name,
widget.nameCN,
Expand All @@ -29,11 +30,11 @@ class WidgetDao {
}

Future<List<Map<String, dynamic>>> queryAll() async {
return await db.rawQuery("SELECT * FROM widget");
return db.rawQuery("SELECT * FROM widget");
}

Future<List<Map<String, dynamic>>> queryByFamily(WidgetFamily family) async {
return await db.rawQuery(
return db.rawQuery(
"SELECT * "
"FROM widget WHERE family = ? ORDER BY lever DESC",
[family.index]);
Expand All @@ -46,20 +47,29 @@ class WidgetDao {
String sql = "SELECT * "
"FROM widget WHERE id in (${'?,' * (ids.length - 1)}?) ";

return await db.rawQuery(sql, [...ids]);
return db.rawQuery(sql, [...ids]);
}

Future<List<Map<String, dynamic>>> search(SearchArgs arguments) async {
return await db.rawQuery(
Future<List<Map<String, dynamic>>> search(WidgetFilter arguments) async {
// 保证 name 参数为空时,不进行搜索
if(arguments.name.isEmpty){
return [];
}

bool hasFamily = arguments.family != null;
String familySql = hasFamily?' AND family = ?':'';
List<int> familyArg = hasFamily?[arguments.family!.index]:[];
List<int> starArg = arguments.stars;
// 保证在星级参数是 [-1,-1,-1,-1,-1] 时,搜索全星级
if(arguments.stars.reduce((a, b) => a+b)==-5){
starArg = [1,2,3,4,5];
}

return db.rawQuery(
"SELECT * "
"FROM widget WHERE name like ? AND lever IN(?,?,?,?,?) ORDER BY lever DESC",
["%${arguments.name}%", ...arguments.stars]);
"FROM widget WHERE name like ?$familySql AND lever IN(?,?,?,?,?) ORDER BY lever DESC",
["%${arguments.name}%",...familyArg,...starArg]);
}
}

class SearchArgs {
final String name;
final List<int> stars;

const SearchArgs({this.name = '', this.stars = const [-1, -1, -1, -1, -1]});
}
36 changes: 36 additions & 0 deletions lib/widget_system/repositories/model/widget_filter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import 'package:flutter_unit/widget_system/repositories/model/enums.dart';

class WidgetFilter {
final String name;
final WidgetFamily? family;
final List<int> stars;

const WidgetFilter({
this.name = '',
this.family,
this.stars = const [-1, -1, -1, -1, -1],
});

WidgetFilter.family(
this.family, {
this.name = '',
this.stars = const [1, 2, 3, 4, 5],
});

WidgetFilter copyWith({
String? name,
WidgetFamily? family,
List<int>? stars,
}) {
return WidgetFilter(
name: name ?? this.name,
family: family ?? this.family,
stars: stars ?? this.stars,
);
}

@override
String toString() {
return 'WidgetFilter{name: $name, family: $family, stars: $stars}';
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'package:flutter_unit/widget_system/repositories/model/widget_filter.dart';

import '../../bean/widget_po.dart';
import '../../dao/like_dao.dart';
import '../../local_db.dart';
Expand All @@ -21,13 +23,6 @@ class WidgetDbRepository implements WidgetRepository {
NodeDao get _nodeDao => LocalDb.instance.nodeDao;
LikeDao get _likeDao => LocalDb.instance.likeDao;

@override
Future<List<WidgetModel>> loadWidgets(WidgetFamily family) async {
List<Map<String, dynamic>> data = await _widgetDao.queryByFamily(family);
List<WidgetPo> widgets = data.map((e) => WidgetPo.fromJson(e)).toList();
return widgets.map(WidgetModel.fromPo).toList();
}

@override
Future<List<WidgetModel>> loadLikeWidgets() async {
List<int> likeIds = await _likeDao.likeWidgetIds();
Expand All @@ -37,7 +32,7 @@ class WidgetDbRepository implements WidgetRepository {
}

@override
Future<List<WidgetModel>> searchWidgets(SearchArgs args) async {
Future<List<WidgetModel>> searchWidgets(WidgetFilter args) async {
List<Map<String, dynamic>> data = await _widgetDao.search(args);
List<WidgetPo> widgets = data.map((e) => WidgetPo.fromJson(e)).toList();
return widgets.map(WidgetModel.fromPo).toList();
Expand Down
5 changes: 3 additions & 2 deletions lib/widget_system/repositories/rep/widget_repository.dart
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import 'package:flutter_unit/widget_system/repositories/model/enums.dart';
import 'package:flutter_unit/widget_system/repositories/model/node_model.dart';
import 'package:flutter_unit/widget_system/repositories/model/widget_filter.dart';
import 'package:flutter_unit/widget_system/repositories/model/widget_model.dart';
import '../dao/widget_dao.dart';

/// create by 张风捷特烈 on 2020-03-03
/// contact me by email 1981462002@qq.com
abstract class WidgetRepository {
Future<List<WidgetModel>> loadWidgets(WidgetFamily family);
// Future<List<WidgetModel>> loadWidgets(WidgetFamily family);

Future<List<WidgetModel>> loadWidget(List<int> ids);

Future<List<WidgetModel>> searchWidgets(SearchArgs args);
Future<List<WidgetModel>> searchWidgets(WidgetFilter args);

Future<List<NodeModel>> loadNode(WidgetModel widgetModel);

Expand Down
Loading

0 comments on commit b087382

Please sign in to comment.