flutter SmartRefreshBloc頁面快速開發(fā)模板,支持列表,支持stateful

項目地址:https://github.com/yinlingchaoliu/SmartRefreshBloc

編寫項目的思路

flutter處處體現widget,我們開發(fā)過程中,核心放在的是業(yè)務層面邏輯,減少不必要的widget編寫,減少不必要重復勞動,減少不必要代碼層級,作為提高效率的切入點

  • 解決問題方式
1、用View與Logic解耦方式,增加代碼清晰度
2、用模板的方式,給提供統(tǒng)一開發(fā)規(guī)范方案(普通頁面和列表頁面)
3、用快捷鍵方式,一鍵式快速開發(fā)
1、先實現View與logic解耦
import 'package:flutter/material.dart';

/// Created by chentong
///
/// 相當于MVP
///
class BlocProvider<T extends BlocBase> extends StatefulWidget {
  BlocProvider({
    Key key,
    @required this.child, //View
    @required this.bloc, //logic
  }) : super(key: key);

  final T bloc;
  final Widget child;

  @override
  _BlocProviderState<T> createState() => _BlocProviderState<T>();
///核心代碼
  static T of<T extends BlocBase>(BuildContext context) {
    final type = _typeOf<BlocProvider<T>>();
    BlocProvider<T> provider = context.ancestorWidgetOfExactType(type);
    return provider.bloc;
  }

  static Type _typeOf<T>() => T;
}

class _BlocProviderState<T> extends State<BlocProvider<BlocBase>> {

  @override
  void initState() {
    super.initState();
    widget.bloc.initState();
  }

  @override
  Widget build(BuildContext context) {
    return widget.child;
  }

  @override
  void dispose() {
    widget.bloc.dispose();
    super.dispose();
  }
}

abstract class BlocBase {
  void initState();

  void dispose();
}

這個是核心模板,可以解耦當前flutter頁面中Widget與業(yè)務邏輯混合在一起的問題。

現在開發(fā)一個頁面范例,將邏輯層遷移到DefaultBloc當中,而DefaultPage 專注于寫widget,減少不必要的耦合。

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

import 'base_bloc.dart';

///@author: chentong
///2019-4-9
///視圖層
class DefaultPage extends StatefulWidget {
  ///路由跳轉
  static void pushDefaultPage(BuildContext context) {
    Navigator.push(
        context,
        new CupertinoPageRoute<void>(
            builder: (ctx) => new BlocProvider<DefaultBloc>(
                  child: new DefaultPage(),
                  bloc: new DefaultBloc(),
                )));
  }

  ///獲得當前頁面實例
  static StatefulWidget newInstance() {
    return new BlocProvider<DefaultBloc>(
      child: new DefaultPage(),
      bloc: new DefaultBloc(),
    );
  }

  @override
  _DefaultPageState createState() => new _DefaultPageState();
}

///
/// 頁面實現
///
class _DefaultPageState extends State<DefaultPage> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final DefaultBloc bloc = BlocProvider.of<DefaultBloc>(context);

    return new Scaffold(
      appBar: new AppBar(
        title: new Text('demo'),
        centerTitle: true,
      ),
    );
  }

  @override
  void dispose() {
    super.dispose();
  }
}

///
///邏輯層
///todo:此處邏輯建議遷移出去 分離開解耦
///
class DefaultBloc extends BlocBase {
  @override
  void initState() {}

  @override
  void dispose() {}
}

2、增加高頻適配模板

因為listview列表在APP中是高頻使用的存在,基于pull_to_refresh編寫列表頁面,便于快速開發(fā)

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';

import 'base_bloc.dart';

///
///list列表
///author:chentong
///
abstract class SmartRefreshBloc extends PullToRefreshBloc {
  RefreshController refreshController;
  ScrollController scrollController;

  ///初始化
  void initState() {
    scrollController = new ScrollController();
    refreshController = new RefreshController();
    SchedulerBinding.instance.addPostFrameCallback((_) {
      refreshController.requestRefresh(true);
    });
  }

  void scrollTop() {
    scrollController.animateTo(0.0,
        duration: new Duration(microseconds: 1000), curve: ElasticInCurve());
  }

  void onRefreshCallBack(bool up) {
    if (up) {
      onRefresh();
    } else {
      onLoadMore();
    }
  }

  ///默認方法
  void onOffsetCallback(bool isUp, double offset) {
    // if you want change some widgets state ,you should rewrite the callback
    if (isUp) {
    } else {}
  }

  ///請求
  void refreshRequest({bool up = true}) {
    refreshController.requestRefresh(up);
  }

  ///完成
  void refreshCompleted() {
    refreshController.sendBack(true, RefreshStatus.completed);
  }

  ///空閑
  void refreshIdle() {
    refreshController.sendBack(false, RefreshStatus.idle);
  }

  ///失敗
  void refreshFailed() {
    refreshController.sendBack(false, RefreshStatus.failed);
  }

  ///自定義頭部
  Widget headerCreate(BuildContext context, RefreshStatus mode) {
    return new ClassicIndicator(mode: mode);
  }

  ///自定義腳部
  Widget footerCreate(BuildContext context, RefreshStatus mode) {
    return new ClassicIndicator(mode: mode);
  }

  @override
  void dispose() {}
}

///下拉刷新Bloc
abstract class PullToRefreshBloc extends BlocBase {
  ///加載數據
  Future getData({String labelId, int page});

  ///刷新
  Future onRefresh({String labelId});

  ///更多
  Future onLoadMore({String labelId, int page});
}

3、快捷鍵一鍵式開發(fā)

導入livesettings.jar
地址:https://github.com/yinlingchaoliu/SmartRefreshBloc/blob/master/livesettings.jar

快捷命令
fstatefulmvp 快速構建stateful頁面
flistviewmvp 快速構建listview列表頁面

快速實現一鍵化開發(fā)

其中還有flutter其他快捷命令
均是f開頭,可以快捷名利可以快速喚起


項目中示例

核心模板代碼在此路徑
https://github.com/yinlingchaoliu/SmartRefreshBloc/tree/master/example/lib/base

///核心模板兩個文件
base_bloc.dart
pulltofresh_bloc.dart

///一鍵化生成代碼示例,幫助你快速開發(fā)
default_bloc.dart
default_list_bloc.dart

項目中重構實戰(zhàn)示例在
https://github.com/yinlingchaoliu/SmartRefreshBloc/tree/master/example/lib/ui

TestExample.dart
TestExample1.dart
TestExample2.dart
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容