項目地址: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