poem_search_page.dart 3.01 KB
import 'package:flutter/material.dart';
import 'package:Parlando/mvp/base_page.dart';
import 'package:Parlando/mvp/power_presenter.dart';
import 'package:Parlando/poem/iview/poem_search_iview.dart';
import 'package:Parlando/poem/models/search_entity.dart';
import 'package:Parlando/poem/presenter/poem_search_presenter.dart';
import 'package:Parlando/poem/provider/base_list_provider.dart';
import 'package:Parlando/widgets/my_refresh_list.dart';
import 'package:Parlando/widgets/search_bar.dart';
import 'package:Parlando/widgets/state_layout.dart';
import 'package:provider/provider.dart';

import 'package:Parlando/extension/int_extension.dart';

class PoemSearchPage extends StatefulWidget {
  const PoemSearchPage({Key? key}) : super(key: key);

  @override
  _PoemSearchPageState createState() => _PoemSearchPageState();
}

class _PoemSearchPageState extends State<PoemSearchPage>
    with BasePageMixin<PoemSearchPage, PowerPresenter>
    implements PoemSearchIMvpView {
  @override
  BaseListProvider<SearchItems> provider = BaseListProvider<SearchItems>();

  late String _keyword;
  int _page = 1;

  @override
  void initState() {
    provider.stateType = StateType.empty;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<BaseListProvider<SearchItems>>(
      create: (_) => provider,
      child: Scaffold(
        appBar: SearchBar(
          hintText: '请输入要查询的内容',
          onPressed: (text) {
            if (text.isEmpty) {
              showToast('搜索关键字不能为空!');
              return;
            }
            _keyword = text;
            provider.setStateType(StateType.loading);
            _page = 1;
            _poemSearchPresenter.search(_keyword, _page, true);
          },
        ),
        body:
            Consumer<BaseListProvider<SearchItems>>(builder: (_, provider, __) {
          return DeerListView(
            key: const Key('poem_search_list'),
            itemCount: provider.list.length,
            stateType: provider.stateType,
            onRefresh: _onRefresh,
            loadMore: _loadMore,
            itemExtent: 50.0,
            hasMore: provider.hasMore,
            itemBuilder: (_, index) {
              return Container(
                padding:  EdgeInsets.symmetric(horizontal: 16.px),
                alignment: Alignment.centerLeft,
                child: Text(provider.list[index].name!),
              );
            },
          );
        }),
      ),
    );
  }

  Future<void> _onRefresh() async {
    _page = 1;
    await _poemSearchPresenter.search(_keyword, _page, false);
  }

  Future<void> _loadMore() async {
    _page++;
    await _poemSearchPresenter.search(_keyword, _page, false);
  }

  late PoemSearchPresenter _poemSearchPresenter;
  @override
  PowerPresenter createPresenter() {
    final PowerPresenter powerPresenter = PowerPresenter<dynamic>(this);
    _poemSearchPresenter = PoemSearchPresenter();
    powerPresenter.requestPresenter([_poemSearchPresenter]);
    return powerPresenter;
  }
}