Skip to content

Commit

Permalink
Merge pull request #293 from vkmaxcooldude/feature/add_search_bar
Browse files Browse the repository at this point in the history
#282 Add Search Bar in Example Gallery App
  • Loading branch information
divyanshub024 authored Apr 2, 2024
2 parents 7f41709 + cf9bf3c commit a8255db
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 27 deletions.
32 changes: 6 additions & 26 deletions examples/mirai_gallery/assets/json/home_screen.json
Original file line number Diff line number Diff line change
@@ -1,26 +1,4 @@
{
"type": "scaffold",
"appBar": {
"type": "appBar",
"title": {
"type": "text",
"data": "Mirai Gallery"
},
"elevation": 0
},
"body": {
"type": "padding",
"padding": {
"bottom": 24
},
"child": {
"type": "listView",
"shrinkWrap": true,
"separator": {
"type": "container",
"height": 10
},
"children": [
[
{
"type": "listTile",
"leading": {
Expand Down Expand Up @@ -1244,8 +1222,10 @@
"assetPath": "assets/json/filled_button_example.json"
}
}
},
{
"type": "sizedBox",
"height": 24.0
}
]
}
}
}

72 changes: 72 additions & 0 deletions examples/mirai_gallery/lib/app/home/cubit/home_cubit.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

part 'home_state.dart';

class HomeBloc extends Cubit<HomeState> {
HomeBloc() : super(const HomeLoading()) {
controller = TextEditingController()
..addListener(_textEditingControllerListener);
_initialize();
}

late final TextEditingController controller;

final List<Map<String, dynamic>> _allItems = [];

void _initialize() async {
final items = await _loadAndParseJsonFromAsset();
if (items.isNotEmpty) {
_allItems.addAll(items);
}
emit(HomeLoaded(items: items));
}

void _onUserInput({required String keyword}) {
if (keyword.isNotEmpty) {
List<Map<String, dynamic>> matchedItems = [];

keyword = keyword.toLowerCase();
for (final Map<String, dynamic> item in _allItems) {
var text = item["title"]?["data"];
if (text != null && text is String) {
if (text.toLowerCase().contains(keyword)) {
matchedItems.add(item);
}
}
}
emit(HomeLoaded(items: matchedItems));
} else {
emit(HomeLoaded(items: _allItems));
}
}

Future<List<Map<String, dynamic>>> _loadAndParseJsonFromAsset() async {
try {
final String json =
await rootBundle.loadString("assets/json/home_screen.json");
final List<dynamic> decodedJson = jsonDecode(json);
final List<Map<String, dynamic>> castedJson =
decodedJson.cast<Map<String, dynamic>>();
return castedJson;
} catch (_) {
return const [];
}
}

// Listen to text editing controller for the latest keyword
void _textEditingControllerListener() {
_onUserInput(keyword: controller.text);
}

@override
Future<void> close() {
controller
..removeListener(_textEditingControllerListener)
..dispose();
return super.close();
}
}
16 changes: 16 additions & 0 deletions examples/mirai_gallery/lib/app/home/cubit/home_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
part of 'home_cubit.dart';

@immutable
sealed class HomeState {
final List<Map<String, dynamic>> items;

const HomeState({required this.items});
}

class HomeLoading extends HomeState {
const HomeLoading({super.items = const []});
}

class HomeLoaded extends HomeState {
const HomeLoaded({required super.items});
}
58 changes: 57 additions & 1 deletion examples/mirai_gallery/lib/app/home/home_screen.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,67 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:mirai/mirai.dart';

import 'cubit/home_cubit.dart';

class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});

@override
Widget build(BuildContext context) {
return Mirai.fromAssets('assets/json/home_screen.json') ?? const SizedBox();
return BlocProvider<HomeBloc>(
create: (context) => HomeBloc(),
child: Builder(
builder: (context) {
return Scaffold(
appBar: AppBar(
title: const Text("Mirai Gallery"),
),
body: Column(
children: [
TextField(
controller: BlocProvider.of<HomeBloc>(context).controller,
decoration: InputDecoration(
hintText: "Search",
prefixIcon: const Icon(Icons.search),
suffixIcon: IconButton(
onPressed:
BlocProvider.of<HomeBloc>(context).controller.clear,
icon: const Icon(Icons.clear),
),
),
),
const SizedBox(height: 10.0),
Expanded(
child: BlocBuilder<HomeBloc, HomeState>(
builder: (context, state) {
if (state is HomeLoaded) {
return Mirai.fromJson(
{
"type": "listView",
"shrinkWrap": false,
"separator": {
"type": "container",
"height": 10
},
"children": state.items,
},
context,
) ??
const SizedBox();
}
if (state is HomeLoading) {
return const CircularProgressIndicator();
}
return const SizedBox();
},
),
),
],
),
);
},
),
);
}
}

0 comments on commit a8255db

Please sign in to comment.