Lenox Xian

Everything negative-pressure,challenges-is all an opportunity for me to rise

Timeconsuming_page_builder

02 September 2020

无论使用哪种操作系统,无论使用哪种UI工具包,对于耗时加载的页面的处理,我们通常分为以下几种情况:

其中,有效数据空数据都处于加载成功阶段的两个分支,具体的分支流向可根据不同的业务逻辑独立实现。 在整个加载过程中,如果异常发生,可选的向用户说明异常原因,另外一个好的用户体验是,提供给用户重新加载的机会。

timeconsuming_page_builder

这是一个Flutter Package,支持Flutter(ANDROID/IOS/WEB),极大的降低了耗时页面中代码逻辑的复杂度,提高代码的可读性。为了方便使用者测试(当然,如果不介意,也可以用于生产环境中),该库也提供了额外三个Widget

TimeConsumingPageBuilder

这是耗时页面的核心Widget,它包含四个标记了@requiredNamed Parameters

代码实例

这是一个使用dartrofit作为网络引擎从服务端请求markdown资源并使用Flutter Markdown将其显示在Flutter Widget上的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import 'package:timeconsuming_page_builder/timeconsuming_page_builder.dart';

@override  
Widget build(BuildContext context) {  
  final post = ModalRoute.of(context).settings.arguments as Post;  
  return Scaffold(  
    appBar: AppBar(...),
    body: TimeConsumingPageBuilder<ResponseBody>(  
        futureBuilder: () => Api(dartrofit).getContent(post.path),
        waitingWidgetBuilder: (BuildContext context) => ...,
        errorWidgetBuilder: (BuildContext context, RetryCaller caller) => ...,
        dataWidgetBuilder: (BuildContext context, ResponseBody body) {  
          if (body.string.orEmpty().isEmpty) {  
            return BuiltInEmptyWidget();
          }  
          return SafeArea(child: Markdown(controller: controller,
                      selectable: true,
                      data: body.string)
          );
        }
    ),
  ); 
}

Github

Pub.dev

— Lenox Xian