From 1f832c8ac3765d4fe855571a36689895660807b1 Mon Sep 17 00:00:00 2001 From: nb312 Date: Fri, 14 Jun 2019 00:25:07 +0800 Subject: [PATCH] add the StreamBuilder widget to build a list. --- lib/const/page_item_const.dart | 5 ++ lib/const/page_name_const.dart | 1 + lib/main.dart | 1 + lib/page/async/FuturePage.dart | 5 +- lib/page/async/StreamBuilderPage.dart | 81 +++++++++++++++++++++++++++ lib/page/async/_async.dart | 1 + 6 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 lib/page/async/StreamBuilderPage.dart diff --git a/lib/const/page_item_const.dart b/lib/const/page_item_const.dart index 0f0bcd7..61597b7 100644 --- a/lib/const/page_item_const.dart +++ b/lib/const/page_item_const.dart @@ -277,4 +277,9 @@ const PAGE_ITEMS = [ "img": PageImage.FLUTTER_OPEN, "click": PageName.ASYNC_FUTURE, }, + { + "title": PageName.ASYNC_STREAM_BUILDER, + "img": PageImage.FLUTTER_OPEN, + "click": PageName.ASYNC_STREAM_BUILDER, + }, ]; diff --git a/lib/const/page_name_const.dart b/lib/const/page_name_const.dart index fa4d777..1f9f4c8 100644 --- a/lib/const/page_name_const.dart +++ b/lib/const/page_name_const.dart @@ -61,4 +61,5 @@ class PageName { static const INTER_POINTER = "AbsorbPointer"; static const INTER_SCROLLABLE = "Scrollable"; static const ASYNC_FUTURE = "FutureBuilder"; + static const ASYNC_STREAM_BUILDER = "StreamBuilder"; } diff --git a/lib/main.dart b/lib/main.dart index 8fa000f..fffbea0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -74,6 +74,7 @@ class FlutterOpenApp extends StatelessWidget { PageName.INTER_DISMISSIBLE: (context) => DismissiblePage(), PageName.INTER_POINTER: (context) => PointerPage(), PageName.ASYNC_FUTURE: (context) => FuturePage(), + PageName.ASYNC_STREAM_BUILDER: (context) => StreamBuilderPage(), }, ); } diff --git a/lib/page/async/FuturePage.dart b/lib/page/async/FuturePage.dart index 2d3451e..f8f3044 100644 --- a/lib/page/async/FuturePage.dart +++ b/lib/page/async/FuturePage.dart @@ -20,7 +20,7 @@ class _FutureState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text("Hello world"), + title: Text(PageName.ASYNC_FUTURE), ), body: Container( child: FutureBuilder( @@ -36,8 +36,7 @@ class _FutureState extends State { if (snapshot.hasError) return Text('Error: ${snapshot.error}'); return Text('Result: ${snapshot.data}'); } - return RefreshIndicator( - child: null, onRefresh: null); // unreachable + return null; // unreachable }, ), ), diff --git a/lib/page/async/StreamBuilderPage.dart b/lib/page/async/StreamBuilderPage.dart new file mode 100644 index 0000000..4d3aedb --- /dev/null +++ b/lib/page/async/StreamBuilderPage.dart @@ -0,0 +1,81 @@ +/// +/// Created by NieBin on 2019/6/13 +/// Github: https://github.com/nb312 +/// Email: niebin312@gmail.com +import "package:flutter/material.dart"; +import 'package:flutter_widgets/const/_const.dart'; + +class StreamBuilderPage extends StatefulWidget { + @override + _StreamBuilderState createState() => _StreamBuilderState(); +} + +class _StreamBuilderState extends State { + Stream> _stream() => + Stream>.fromFuture(_futureList()); + + Future> _futureList() async { + return _listData; + } + + List _listData = [ + "Hello", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + "World", + ]; + + Widget _streamBuildList() => StreamBuilder( + builder: (BuildContext context, AsyncSnapshot> snapshot) { + switch (snapshot.connectionState) { + case ConnectionState.none: + return Text('Press button to start.'); + case ConnectionState.active: + case ConnectionState.waiting: + return Text('Awaiting result...'); + case ConnectionState.done: + if (snapshot.hasError) return Text('Error: ${snapshot.error}'); + return ListView.builder( + itemCount: snapshot.data.length, + itemBuilder: (context, index) => Container( + constraints: BoxConstraints.expand(height: 100), + color: index % 2 == 0 ? RED_LIGHT : PURPLE, + child: Text( + snapshot.data[index], + style: TextStyle(color: TEXT_BLACK, fontSize: 20), + ), + )); + } + return null; // unreachable + }, + stream: _stream(), + ); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(PageName.ASYNC_STREAM_BUILDER), + ), + body: _streamBuildList(), + ); + } +} diff --git a/lib/page/async/_async.dart b/lib/page/async/_async.dart index 9e07bcd..b596c00 100644 --- a/lib/page/async/_async.dart +++ b/lib/page/async/_async.dart @@ -4,3 +4,4 @@ /// Email: niebin312@gmail.com /// export "FuturePage.dart"; +export 'StreamBuilderPage.dart';