From 5ad926d4b3525cd4838588a488eb19453d815dbe Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 28 Aug 2020 09:45:17 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E6=B7=BB=E5=8A=A0NotificationList?= =?UTF-8?q?ener=E3=80=81PageStorage=E3=80=81WidgetInspector=E3=80=81Cupert?= =?UTF-8?q?inoSlidingSegmentedControl=E3=80=81WidgetsApp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/flutter.db | Bin 782336 -> 819200 bytes lib/blocs/github_authentic/bloc.dart | 73 ---------- lib/blocs/github_authentic/event.dart | 26 ---- lib/blocs/github_authentic/state.dart | 25 ---- lib/blocs/github_login/api.dart | 19 --- lib/blocs/github_login/bloc.dart | 51 ------- lib/blocs/github_login/event.dart | 21 --- lib/blocs/github_login/state.dart | 24 ---- lib/blocs/issues/event.dart | 41 ------ lib/blocs/issues/state.dart | 48 ------- .../github_authentic_repository.dart | 28 ---- lib/repositories/github_user_repository.dart | 54 -------- lib/storage/app_storage.dart | 24 +++- .../DecoratedBox/node6_flutterLogo.dart | 7 +- .../AnimatedCrossFade/node1_base.dart | 4 +- .../AnimatedCrossFade/node2_curve.dart | 5 +- .../CupertinoSegmentedControl/node1_base.dart | 4 +- .../node1_base.dart | 55 ++++++++ .../MaterialApp/node1_base.dart | 115 ++++++++++++++-- .../StatefulWidget/Overlay/node1_base.dart | 109 ++++++++------- .../WidgetInspector/node1_base.dart | 60 ++++++++ .../StatefulWidget/WidgetsApp/node1_base.dart | 128 ++++++++++++++++++ .../StatelessWidget/Banner/node1_base.dart | 2 +- .../FlutterLogo/node1_base.dart | 2 +- .../GestureDetector/node1_base.dart | 4 +- .../GestureDetector/node2_tap.dart | 6 +- .../GestureDetector/node3_pan.dart | 10 +- .../StatelessWidget/ListView/node1_base.dart | 2 +- .../NotificationListener/node1_base.dart | 65 +++++++++ .../NotificationListener/node2_update.dart | 87 ++++++++++++ .../PageStorage/node1_base.dart | 115 ++++++++++++++++ .../SingleChildScrollView/node1_base.dart | 2 +- .../Text/node5_textDirection.dart | 2 +- .../UserAccountsDrawerHeader/node2_pro.dart | 2 +- lib/views/widgets/exp/stateful_unit.dart | 3 + lib/views/widgets/exp/stateless_unit.dart | 4 + lib/views/widgets/widgets_map.dart | 24 +++- 37 files changed, 743 insertions(+), 508 deletions(-) delete mode 100644 lib/blocs/github_authentic/bloc.dart delete mode 100644 lib/blocs/github_authentic/event.dart delete mode 100644 lib/blocs/github_authentic/state.dart delete mode 100644 lib/blocs/github_login/api.dart delete mode 100644 lib/blocs/github_login/bloc.dart delete mode 100644 lib/blocs/github_login/event.dart delete mode 100644 lib/blocs/github_login/state.dart delete mode 100644 lib/blocs/issues/event.dart delete mode 100644 lib/blocs/issues/state.dart delete mode 100644 lib/repositories/github_authentic_repository.dart delete mode 100644 lib/repositories/github_user_repository.dart create mode 100644 lib/views/widgets/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart create mode 100644 lib/views/widgets/StatefulWidget/WidgetInspector/node1_base.dart create mode 100644 lib/views/widgets/StatefulWidget/WidgetsApp/node1_base.dart create mode 100644 lib/views/widgets/StatelessWidget/NotificationListener/node1_base.dart create mode 100644 lib/views/widgets/StatelessWidget/NotificationListener/node2_update.dart create mode 100644 lib/views/widgets/StatelessWidget/PageStorage/node1_base.dart diff --git a/assets/flutter.db b/assets/flutter.db index adc85eaa53179d588e9c441f7098a8e1464ec7bf..d4a4de456d41b2a1b33256e99a019c372af90afc 100644 GIT binary patch delta 17076 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 { - final GithubAuthenticRepository authenticationRepository; - final GithubUserRepository userRepository; - - GithubAuthenticBloc( - {@required this.authenticationRepository, - @required this.userRepository}) - : assert(authenticationRepository != null); - - @override - AuthenticState get initialState => AuthInitial(); - - String get token => authenticationRepository.token; - - GithubUser get user { - if (state is AuthSuccess) { - return (state as AuthSuccess).user; - } - return null; - } - - @override - Stream mapEventToState( - GithubAuthEvent event, - ) async* { - if (event is CheckGithubAuth) { - final bool hasToken = await authenticationRepository.hasToken(); -// await LocalDao.dao.initLocalStorage(); - if (hasToken) { - var user = await userRepository.getLocalUser(); - yield AuthSuccess(token: authenticationRepository.token,user: user); - } else { - yield AuthFailure(); - } - } - - if (event is LoginOver) { - yield AuthLoading(); - await authenticationRepository.persistToken(event.result.msg); - yield AuthSuccess(user: event.result.data,token: event.result.msg); - } - - if (event is LoggedOut) { - yield AuthLoading(); - await userRepository.deleteLocalUser(); - await authenticationRepository.deleteToken(); - yield AuthFailure(); - } - } -} diff --git a/lib/blocs/github_authentic/event.dart b/lib/blocs/github_authentic/event.dart deleted file mode 100644 index 15b2705..0000000 --- a/lib/blocs/github_authentic/event.dart +++ /dev/null @@ -1,26 +0,0 @@ - -part of 'bloc.dart'; - -///********************************验证行为******************************** - -abstract class GithubAuthEvent extends Equatable { - const GithubAuthEvent(); - - @override - List get props => []; -} - -class CheckGithubAuth extends GithubAuthEvent {} - -class LoginOver extends GithubAuthEvent { - final RepResult result; - const LoginOver({this.result}); - - @override - List get props => [result]; - - @override - String toString() => 'LoggedIn { token: $result }'; -} - -class LoggedOut extends GithubAuthEvent {} \ No newline at end of file diff --git a/lib/blocs/github_authentic/state.dart b/lib/blocs/github_authentic/state.dart deleted file mode 100644 index 9550c34..0000000 --- a/lib/blocs/github_authentic/state.dart +++ /dev/null @@ -1,25 +0,0 @@ - - -part of 'bloc.dart'; - -///********************************校验状态******************************** -// -abstract class AuthenticState extends Equatable { - const AuthenticState(); - - @override - List get props => []; -} - - -class AuthInitial extends AuthenticState {} - -class AuthSuccess extends AuthenticState { - final String token; - final GithubUser user; - const AuthSuccess({this.token,this.user}); -} - -class AuthFailure extends AuthenticState {} - -class AuthLoading extends AuthenticState {} \ No newline at end of file diff --git a/lib/blocs/github_login/api.dart b/lib/blocs/github_login/api.dart deleted file mode 100644 index f299e68..0000000 --- a/lib/blocs/github_login/api.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'dart:convert'; - -import 'package:flutter_unit/app/utils/http/http_util.dart'; -import 'package:flutter_unit/repositories/github_user_repository.dart'; - -/// create by 张风捷特烈 on 2020/6/17 -/// contact me by email 1981462002@qq.com -/// 说明: - -main() async { - - var username ="toly1994328"; - var password ="@#1994328zfjtl"; - - var repository = GithubUserRepository(); - var result = await repository.authenticate(username: username, password: password); - - print(result); -} \ No newline at end of file diff --git a/lib/blocs/github_login/bloc.dart b/lib/blocs/github_login/bloc.dart deleted file mode 100644 index d9918bf..0000000 --- a/lib/blocs/github_login/bloc.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:bloc/bloc.dart'; -import 'package:flutter_unit/repositories/github_user_repository.dart'; -import '../github_authentic/bloc.dart'; - -import 'package:meta/meta.dart'; -import 'package:equatable/equatable.dart'; - -part 'event.dart'; - -part 'state.dart'; - -class LoginBloc extends Bloc { - final GithubAuthenticBloc authenticationBloc; - - LoginBloc({ - @required this.authenticationBloc, - }):assert(authenticationBloc != null); - - @override - LoginState get initialState => LoginInitial(); - - GithubUserRepository get userRepository => authenticationBloc.userRepository; - - @override - Stream mapEventToState( - LoginEvent event, - ) async* { - if (event is EventLogin) { - yield LoginLoading(); - try { - final result = await userRepository.authenticate( - username: event.username, - password: event.password, - ); - if (result.status) { - authenticationBloc.add(LoginOver(result: result)); - // 本地存储用户信息 -// userRepository.setLocalUser(result.user); - }else{ - yield LoginFailure(error: result.msg); - } - yield LoginInitial(); - } catch (error) { - yield LoginFailure(error: error.toString()); - } - } - } -} diff --git a/lib/blocs/github_login/event.dart b/lib/blocs/github_login/event.dart deleted file mode 100644 index 2b7996c..0000000 --- a/lib/blocs/github_login/event.dart +++ /dev/null @@ -1,21 +0,0 @@ -part of 'bloc.dart'; - -abstract class LoginEvent extends Equatable { - const LoginEvent(); -} - -class EventLogin extends LoginEvent { - final String username; - final String password; - - const EventLogin({ - @required this.username, - @required this.password - }); - - @override - List get props => [username, password]; - - @override - String toString() => 'EventLogin { username: $username, password: $password }'; -} diff --git a/lib/blocs/github_login/state.dart b/lib/blocs/github_login/state.dart deleted file mode 100644 index f242b6e..0000000 --- a/lib/blocs/github_login/state.dart +++ /dev/null @@ -1,24 +0,0 @@ -part of 'bloc.dart'; - -abstract class LoginState extends Equatable { - const LoginState(); - - @override - List get props => []; -} - -class LoginInitial extends LoginState {} - -class LoginLoading extends LoginState {} - -class LoginFailure extends LoginState { - final String error; - - const LoginFailure({@required this.error}); - - @override - List get props => [error]; - - @override - String toString() => ' LoginFailure { error: $error }'; -} diff --git a/lib/blocs/issues/event.dart b/lib/blocs/issues/event.dart deleted file mode 100644 index 59dee6b..0000000 --- a/lib/blocs/issues/event.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/6/17 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class IssuesEvent extends Equatable {} - -class LoadIssues extends IssuesEvent { - final String username; - final String repository; - final String sort; - - final String direction; - final int page; - final int pageSize; - - final String state; - - final String labels; - - LoadIssues( - {@required this.username, - @required this.repository, - this.sort, - this.direction, - this.page, - this.pageSize, - this.state, - this.labels}); - - @override - List get props => - [username, repository, sort, direction, page, pageSize, state, labels]; - - @override - String toString() { - return 'LoadIssues{username: $username, repository: $repository, sort: $sort, direction: $direction, page: $page, pageSize: $pageSize, state: $state, labels: $labels}'; - } -} diff --git a/lib/blocs/issues/state.dart b/lib/blocs/issues/state.dart deleted file mode 100644 index f11e510..0000000 --- a/lib/blocs/issues/state.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter_unit/model/github/issue.dart'; - -/// create by 张风捷特烈 on 2020/6/17 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class IssuesState extends Equatable{ - -} - -class IssuesLoading extends IssuesState{ - @override - List get props =>[]; - - @override - String toString() { - return 'IssuesLoading{}'; - } -} - -class IssuesLoaded extends IssuesState{ - final List issues; - - IssuesLoaded(this.issues); - - @override - List get props => [issues]; - - @override - String toString() { - return 'IssuesLoaded{issues: $issues}'; - } -} - -class IssuesLoadFailure extends IssuesState{ - final String error; - - IssuesLoadFailure(this.error); - - @override - List get props => [error]; - - @override - String toString() { - return 'IssuesLoadFailure{error: $error}'; - } -} \ No newline at end of file diff --git a/lib/repositories/github_authentic_repository.dart b/lib/repositories/github_authentic_repository.dart deleted file mode 100644 index f03a312..0000000 --- a/lib/repositories/github_authentic_repository.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'dart:async'; - -import 'package:flutter_unit/storage/dao/local_storage.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -class GithubAuthenticRepository { - String _token; - - String get token => _token; - - //删除token - Future deleteToken() async { - var success = await LocalStorage.remove(LocalStorage.tokenKey); - return success; - } - - //固化token - Future persistToken(String token) async { - var success = await LocalStorage.save(LocalStorage.tokenKey,token); - return success; - } - - //检查是否有token - Future hasToken() async { - var token = await LocalStorage.get(LocalStorage.tokenKey); - return token == null; - } -} diff --git a/lib/repositories/github_user_repository.dart b/lib/repositories/github_user_repository.dart deleted file mode 100644 index 6e212c1..0000000 --- a/lib/repositories/github_user_repository.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'dart:convert'; -import 'package:flutter_unit/app/utils/http/rep_result.dart'; -import 'package:flutter_unit/model/github/github_user.dart'; - - -/// create by 张风捷特烈 on 2020/6/1 -/// contact me by email 1981462002@qq.com -/// 说明: - -class GithubUserRepository { - Future getLocalUser() async { -// return await LocalDao.dao.queryUser(); - } - - Future setLocalUser(GithubUser userBean) async { -// await LocalDao.dao.insert(userBean); - } - - Future authenticate({ - String username, - String password, - }) async { - String type = username + ":" + password; - var bytes = utf8.encode(type); - var base64Str = base64.encode(bytes); - -// var result = await GithubApi.authorizations(base64: base64Str); - -// result.msg = result.data["token"]; - -// return result; - -// // var result = await Api.login(username,password); -// // 通过result获取token和用户信息 -// await Future.delayed(Duration(seconds: 1));//模拟登陆请求耗时 -// if(username=='toly'&& password =='111111'){ -// return LoginResult( -// status: true, -// msg: '你获得的token值', -// user: UserBean(name: 'toly'), -// ); -// }else{ -// return LoginResult( -// status: false, -// msg: '用户名密码错误', -// user: null, -// ); -// } - } - - Future deleteLocalUser() async { -// return await LocalDao.dao.remove(); - } -} diff --git a/lib/storage/app_storage.dart b/lib/storage/app_storage.dart index 3aaa742..972aaaf 100644 --- a/lib/storage/app_storage.dart +++ b/lib/storage/app_storage.dart @@ -1,4 +1,3 @@ - import 'dart:io'; import 'dart:typed_data'; @@ -9,6 +8,7 @@ import 'package:flutter_unit/blocs/global/global_state.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart' as path; + /// create by 张风捷特烈 on 2020-03-04 /// contact me by email 1981462002@qq.com /// 说明: @@ -50,15 +50,25 @@ class AppStorage { var databasesPath = await getDatabasesPath(); var dbPath = path.join(databasesPath, "flutter.db"); var exists = await databaseExists(dbPath); - if (!exists) { - try { + const isPro = bool.fromEnvironment('dart.vm.product'); //是否release模式 + + if (!isPro) { + if(!exists){ await Directory(path.dirname(dbPath)).create(recursive: true); - print("========= assets ======拷贝完成===="); - } catch (_) {} + } ByteData data = await rootBundle.load(path.join("assets", "flutter.db")); - List bytes = - data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + List bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); await File(dbPath).writeAsBytes(bytes, flush: true); + print("==== debug ===== assets ======拷贝完成===="); + return await openDatabase(dbPath, readOnly: false); + } + + if (!exists) { + await Directory(path.dirname(dbPath)).create(recursive: true); + ByteData data = await rootBundle.load(path.join("assets", "flutter.db")); + List bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + await File(dbPath).writeAsBytes(bytes, flush: true); + print("==== release ===== assets ======拷贝完成===="); } else { print("========= 数据库 ======已存在===="); } diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart index 573856c..f0799a4 100644 --- a/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart +++ b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: +/// 说明: // { // "widgetId": 70, // "name": 'FlutterLogoDecoration装饰', @@ -15,8 +15,9 @@ class FlutterLogoDecorationDemo extends StatelessWidget { Widget build(BuildContext context) { return DecoratedBox( decoration: FlutterLogoDecoration( - darkColor: Colors.orange, - lightColor: Colors.deepPurpleAccent, +// darkColor: Colors.orange, +// lightColor: Colors.deepPurpleAccent, + margin: EdgeInsets.all(8), style: FlutterLogoStyle.stacked), child: SizedBox( width: 100, diff --git a/lib/views/widgets/StatefulWidget/AnimatedCrossFade/node1_base.dart b/lib/views/widgets/StatefulWidget/AnimatedCrossFade/node1_base.dart index 5083040..cc72e64 100644 --- a/lib/views/widgets/StatefulWidget/AnimatedCrossFade/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/AnimatedCrossFade/node1_base.dart @@ -37,7 +37,7 @@ class _CustomAnimatedCrossFadeState extends State { width: 200, height: 150, color: Colors.orange, - child: FlutterLogo(colors: Colors.blue, size: 100,), + child: FlutterLogo(textColor: Colors.blue, size: 100,), ), secondChild: Container( width: 200, @@ -46,7 +46,7 @@ class _CustomAnimatedCrossFadeState extends State { color: Colors.blue, child: FlutterLogo( textColor: Colors.white, - colors: Colors.orange, +// colors: Colors.orange, size: 100, style: FlutterLogoStyle.stacked,), ), diff --git a/lib/views/widgets/StatefulWidget/AnimatedCrossFade/node2_curve.dart b/lib/views/widgets/StatefulWidget/AnimatedCrossFade/node2_curve.dart index 7522f70..e4ac90f 100644 --- a/lib/views/widgets/StatefulWidget/AnimatedCrossFade/node2_curve.dart +++ b/lib/views/widgets/StatefulWidget/AnimatedCrossFade/node2_curve.dart @@ -37,7 +37,7 @@ class _CurveAnimatedCrossFadeState extends State { width: 200, height: 80, color: Colors.orange , - child: FlutterLogo(colors: Colors.blue,size: 50,), + child: FlutterLogo(textColor: Colors.blue,size: 50,), ), secondChild: Container( width: 200, @@ -46,7 +46,8 @@ class _CurveAnimatedCrossFadeState extends State { color: Colors.blue, child: FlutterLogo( textColor: Colors.white, - colors: Colors.orange,size: 100,style: FlutterLogoStyle.stacked,), +// colors: Colors.orange, + size: 100,style: FlutterLogoStyle.stacked,), ), duration: Duration(milliseconds: 1000), crossFadeState: _crossFadeState, diff --git a/lib/views/widgets/StatefulWidget/CupertinoSegmentedControl/node1_base.dart b/lib/views/widgets/StatefulWidget/CupertinoSegmentedControl/node1_base.dart index 49bc1b2..59ef2c9 100644 --- a/lib/views/widgets/StatefulWidget/CupertinoSegmentedControl/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/CupertinoSegmentedControl/node1_base.dart @@ -7,11 +7,11 @@ import 'package:flutter/material.dart'; /// // { // "widgetId": 262, -// "name": '基本使用', +// "name": 'iOS页签基本使用', // "priority": 1, // "subtitle": // "【children】 : 组件Map 【Map】\n" -// "【onValueChanged】 : 最小值 【ValueChanged】\n" +// "【onValueChanged】 : 值改变回调 【ValueChanged】\n" // "【groupValue】 : 选中值 【T】\n" // "【padding】 : 内边距 【EdgeInsetsGeometry】", // } diff --git a/lib/views/widgets/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart b/lib/views/widgets/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart new file mode 100644 index 0000000..24a542b --- /dev/null +++ b/lib/views/widgets/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart @@ -0,0 +1,55 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com +/// 说明: 256 CupertinoSlidingSegmentedControl iOS滑动页签 iOS风格的滑动页签,支持点击、滑动切换。可指定页签颜色、背景色、边距等属性。 +// { +// "widgetId": 256, +// "name": 'iOS滑动页签基本使用', +// "priority": 1, +// "subtitle": +// "【children】 : 组件Map 【Map】\n" +// "【onValueChanged】 : 值改变回调 【ValueChanged】\n" +// "【groupValue】 : 选中值 【T】\n" +// "【thumbColor】 : 选中色 【Color】\n" +// "【backgroundColor】 : 背景色 【Color】\n" +// "【padding】 : 内边距 【EdgeInsetsGeometry】", +// } +class CupertinoSlidingSegmentedControlDemo extends StatefulWidget { + @override + _CupertinoSlidingSegmentedControlDemoState createState() => + _CupertinoSlidingSegmentedControlDemoState(); +} + +class _CupertinoSlidingSegmentedControlDemoState + extends State { + var _value = 1; + + @override + Widget build(BuildContext context) { + return Container( + child: CupertinoSlidingSegmentedControl( + groupValue: _value, + onValueChanged: _onValueChanged, + thumbColor: Colors.amberAccent, + backgroundColor: Colors.green.withAlpha(99), + padding: EdgeInsets.all(5), + children: { + 1: Padding( + padding: EdgeInsets.only(left: 20, right: 20), + child: Text("混沌战士"), + ), + 2: Text("青眼白龙"), + 3: Text("黑魔导"), + }, + ), + ); + } + + void _onValueChanged(int value) { + setState(() { + _value=value; + }); + } +} diff --git a/lib/views/widgets/StatefulWidget/MaterialApp/node1_base.dart b/lib/views/widgets/StatefulWidget/MaterialApp/node1_base.dart index cfb7494..796db6a 100644 --- a/lib/views/widgets/StatefulWidget/MaterialApp/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/MaterialApp/node1_base.dart @@ -13,22 +13,117 @@ import '../../StatefulWidget/Scaffold/node1_base.dart'; // "subtitle": // "【theme】 : 主题 【ThemeData】\n" // "【title】 : 任务栏标题 【String】\n" +// "【debugShowCheckedModeBanner】 : 开启角标 【bool】\n" +// "【showPerformanceOverlay】 : 开启性能浮层 【bool】\n" +// "【debugShowMaterialGrid】 : 开启网格 【bool】\n" // "【onGenerateRoute】 : 路由生成器 【RouteFactory】\n" // "【home】 : 主页 【Widget】", // } -class CustomMaterialApp extends StatelessWidget { +class MaterialAppDemo extends StatefulWidget { + @override + _WidgetsAppDemoState createState() => _WidgetsAppDemoState(); +} + +class _WidgetsAppDemoState extends State { + var _debugShowCheckedModeBanner = false; + var _showPerformanceOverlay = false; + var _debugShowMaterialGrid = false; + @override Widget build(BuildContext context) { - return Container( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height - 200, - child: MaterialApp( - title: 'Flutter Demo', - onGenerateRoute: Router.generateRoute, - theme: ThemeData( - primarySwatch: Colors.blue, + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildSwitchers(), + Container( + height: 250, + child: MaterialApp( + debugShowCheckedModeBanner: _debugShowCheckedModeBanner, + showPerformanceOverlay: _showPerformanceOverlay, + debugShowMaterialGrid: _debugShowMaterialGrid, + home: HomePage(), + ), ), - home: CustomScaffold(), + ], + ); + } + + Widget _buildSwitchers() { + return DefaultTextStyle( + style: TextStyle(color: Colors.blue), + child: Wrap( + spacing: 10, + children: [ + Column( + children: [ + Switch( + value: _showPerformanceOverlay, + onChanged: (v) { + setState(() { + _showPerformanceOverlay = v; + }); + }, + ), + Text('性能浮层') + ], + ), + Column( + children: [ + Switch( + value: _debugShowCheckedModeBanner, + onChanged: (v) { + setState(() { + _debugShowCheckedModeBanner = v; + }); + }, + ), + Text('开启角标') + ], + ), + Column( + children: [ + Switch( + value: _debugShowMaterialGrid, + onChanged: (v) { + setState(() { + _debugShowMaterialGrid = v; + }); + }, + ), + Text('开启网格') + ], + ) + ], + ), + ); + } +} + +class HomePage extends StatefulWidget { + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + var _count = 0; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + alignment: Alignment(0, 0.7), + child: Text( + '你点击了$_count次', + style: TextStyle(fontSize: 18, color: Colors.blue), + ), + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.add), + onPressed: () { + setState(() { + _count++; + }); + }, ), ); } diff --git a/lib/views/widgets/StatefulWidget/Overlay/node1_base.dart b/lib/views/widgets/StatefulWidget/Overlay/node1_base.dart index 5de2b41..556cfe1 100644 --- a/lib/views/widgets/StatefulWidget/Overlay/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/Overlay/node1_base.dart @@ -11,61 +11,6 @@ import 'package:flutter/material.dart'; // " Overlay.of(context).insert插入全局组件", // } - -bool show = false; -Offset offset = Offset(200, 200); - -final double radius = 60; -var entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - left: offset.dx, - top: offset.dy, - child: _buildFloating(), - ), - ], - )); - -///绘制悬浮控件 -_buildFloating() => GestureDetector( - onPanDown: (details) { - offset = details.globalPosition - Offset(radius / 2, radius / 2); - entry.markNeedsBuild(); - }, - onPanUpdate: (DragUpdateDetails details) { - offset = offset + details.delta; - entry.markNeedsBuild(); - }, - onLongPress: hideFloating, - child: Material( - color: Colors.transparent, - child: Container( - height: radius, - width: radius, - alignment: Alignment.center, - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - image: AssetImage('assets/images/icon_head.png')), - ), - ), - )); - -showFloating(BuildContext context) { - if (!show) { - Overlay.of(context).insert(entry); - show = true; - } -} - -hideFloating() { - if (show) { - entry.remove(); - show = false; - } -} - class CustomOverlay extends StatelessWidget { @override Widget build(BuildContext context) { @@ -103,3 +48,57 @@ class CustomOverlay extends StatelessWidget { ); } } + +bool show = false; +Offset offset = Offset(200, 200); + +final double radius = 60; +var entry = OverlayEntry( + builder: (context) => Stack( + children: [ + Positioned( + left: offset.dx, + top: offset.dy, + child: _buildFloating(), + ), + ], + )); + +///绘制悬浮控件 +_buildFloating() => GestureDetector( + onPanDown: (details) { + offset = details.globalPosition - Offset(radius / 2, radius / 2); + entry.markNeedsBuild(); + }, + onPanUpdate: (DragUpdateDetails details) { + offset = offset + details.delta; + entry.markNeedsBuild(); + }, + onLongPress: hideFloating, + child: Material( + color: Colors.transparent, + child: Container( + height: radius, + width: radius, + alignment: Alignment.center, + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + image: AssetImage('assets/images/icon_head.png')), + ), + ), + )); + +showFloating(BuildContext context) { + if (!show) { + Overlay.of(context).insert(entry); + show = true; + } +} + +hideFloating() { + if (show) { + entry.remove(); + show = false; + } +} diff --git a/lib/views/widgets/StatefulWidget/WidgetInspector/node1_base.dart b/lib/views/widgets/StatefulWidget/WidgetInspector/node1_base.dart new file mode 100644 index 0000000..100a495 --- /dev/null +++ b/lib/views/widgets/StatefulWidget/WidgetInspector/node1_base.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/8/16 +/// contact me by email 1981462002@qq.com +/// 说明: 234 WidgetInspector 该组件可以让你很方便地查看子组件层级结构,是Flutter Inspector插件的功能之一。 +// { +// "widgetId": 234, +// "name": "WidgetInspector基本使用", +// "priority": 1, +// "subtitle": "【child】 : 子组件 【Widget】\n" +// "【selectButtonBuilder】: *选择按钮构造器 【InspectorSelectButtonBuilder】", +// } +class WidgetInspectorDemo extends StatelessWidget { + + @override + Widget build(BuildContext context) { + return Container( + height: 200, + child: WidgetInspector( + child: HomePage(), + selectButtonBuilder: _selectButtonBuilder, + ), + ); + } + + Widget _selectButtonBuilder(BuildContext context, onPressed) { + onPressed(); + return Container(); + } +} + +class HomePage extends StatefulWidget { + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + var _count = 0; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + alignment: Alignment(0, 0.7), + child: Text( + '你点击了$_count次', + style: TextStyle(fontSize: 18, color: Colors.blue), + ), + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.add), + onPressed: () { + setState(() { + _count++; + }); + }, + ), + ); + } +} diff --git a/lib/views/widgets/StatefulWidget/WidgetsApp/node1_base.dart b/lib/views/widgets/StatefulWidget/WidgetsApp/node1_base.dart new file mode 100644 index 0000000..3dee921 --- /dev/null +++ b/lib/views/widgets/StatefulWidget/WidgetsApp/node1_base.dart @@ -0,0 +1,128 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/8/16 +/// contact me by email 1981462002@qq.com +/// 说明: 236 WidgetsApp 集合一个应用程序需要的部件,如路由、语言、一些调试开关等。也是实现MaterialApp和CupertinoApp的核心组件。 +// { +// "widgetId": 236, +// "name": "WidgetsApp基本使用", +// "priority": 1, +// "subtitle": "【pageRouteBuilder】 : *路由构造器 【PageRouteFactory】\n" +// "【color】: *颜色 【Color】\n" +// "【debugShowWidgetInspector】: 是否显示z组件查看器 【bool】\n" +// "其他属性基本上同MaterialApp,详见之。", +// } +class WidgetsAppDemo extends StatefulWidget { + @override + _WidgetsAppDemoState createState() => _WidgetsAppDemoState(); +} + +class _WidgetsAppDemoState extends State { + var _debugShowCheckedModeBanner = false; + var _debugShowWidgetInspector = false; + var _showPerformanceOverlay = false; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildSwitchers(), + Container( + height: 250, + child: WidgetsApp( + color: Colors.blue, + debugShowCheckedModeBanner: _debugShowCheckedModeBanner, + showPerformanceOverlay: _showPerformanceOverlay, + debugShowWidgetInspector: _debugShowWidgetInspector, + pageRouteBuilder: + (RouteSettings settings, WidgetBuilder builder) { + return MaterialPageRoute(settings: settings, builder: builder); + }, + home: HomePage(), + ), + ), + ], + ); + } + + Widget _buildSwitchers() { + return DefaultTextStyle( + style: TextStyle(color: Colors.blue), + child: Wrap( + spacing: 10, + children: [ + Column( + children: [ + Switch( + value: _showPerformanceOverlay, + onChanged: (v) { + setState(() { + _showPerformanceOverlay = v; + }); + }, + ), + Text('性能浮层') + ], + ), + Column( + children: [ + Switch( + value: _debugShowCheckedModeBanner, + onChanged: (v) { + setState(() { + _debugShowCheckedModeBanner = v; + }); + }, + ), + Text('开启角标') + ], + ), + Column( + children: [ + Switch( + value: _debugShowWidgetInspector, + onChanged: (v) { + setState(() { + _debugShowWidgetInspector = v; + }); + }, + ), + Text('检查器') + ], + ) + ], + ), + ); + } +} + +class HomePage extends StatefulWidget { + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + var _count = 0; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + alignment: Alignment(0, 0.7), + child: Text( + '你点击了$_count次', + style: TextStyle(fontSize: 18, color: Colors.blue), + ), + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.add), + onPressed: () { + setState(() { + _count++; + }); + }, + ), + ); + } +} diff --git a/lib/views/widgets/StatelessWidget/Banner/node1_base.dart b/lib/views/widgets/StatelessWidget/Banner/node1_base.dart index 4b7e3a0..5fff743 100644 --- a/lib/views/widgets/StatelessWidget/Banner/node1_base.dart +++ b/lib/views/widgets/StatelessWidget/Banner/node1_base.dart @@ -38,7 +38,7 @@ class CustomBanner extends StatelessWidget { color: data[e], child: Padding( padding: EdgeInsets.all(20), - child: FlutterLogo(colors: Colors.blue, + child: FlutterLogo(textColor: Colors.blue, style: FlutterLogoStyle.horizontal,)), ), )).toList()); diff --git a/lib/views/widgets/StatelessWidget/FlutterLogo/node1_base.dart b/lib/views/widgets/StatelessWidget/FlutterLogo/node1_base.dart index fae2963..fe426b7 100644 --- a/lib/views/widgets/StatelessWidget/FlutterLogo/node1_base.dart +++ b/lib/views/widgets/StatelessWidget/FlutterLogo/node1_base.dart @@ -26,7 +26,7 @@ class CustomFlutterLogo extends StatelessWidget { children: data.keys .map((e) => FlutterLogo( size: data[e], - colors: e, + textColor: e, )) .toList(), ); diff --git a/lib/views/widgets/StatelessWidget/GestureDetector/node1_base.dart b/lib/views/widgets/StatelessWidget/GestureDetector/node1_base.dart index e9f2dfc..040abfd 100644 --- a/lib/views/widgets/StatelessWidget/GestureDetector/node1_base.dart +++ b/lib/views/widgets/StatelessWidget/GestureDetector/node1_base.dart @@ -15,8 +15,8 @@ import 'package:flutter/material.dart'; // "subtitle": // "【child】 : 子组件 【Widget】\n" // "【onTap】 : 点击事件 【Function()】\n" -// "【onDoubleTap】 : 双击事件 【Function()】\n" -// "【onLongPress】 : 长按事件 【Function()】", +// "【onDoubleTap】 : 双击事件 【GestureTapCallback】\n" +// "【onLongPress】 : 长按事件 【GestureLongPressCallback】", // } class CustomGestureDetector extends StatefulWidget { diff --git a/lib/views/widgets/StatelessWidget/GestureDetector/node2_tap.dart b/lib/views/widgets/StatelessWidget/GestureDetector/node2_tap.dart index b2e6242..2d36002 100644 --- a/lib/views/widgets/StatelessWidget/GestureDetector/node2_tap.dart +++ b/lib/views/widgets/StatelessWidget/GestureDetector/node2_tap.dart @@ -9,9 +9,9 @@ import 'package:flutter/material.dart'; // "name": 'GestureDetector详情信息', // "priority": 2, // "subtitle": -// "【onTapDown】 : 按下回调 【Function(TapDownDetails)】\n" -// "【onTapUp】 : 子组件 【Function(TapUpDetails)】\n" -// "【onTapCancel】 : 点击取消 【Function()】", +// "【onTapDown】 : 按下回调 【GestureTapDownCallback】\n" +// "【onTapUp】 : 点击抬起回调 【GestureTapUpCallback】\n" +// "【onTapCancel】 : 点击取消 【GestureTapCancelCallback】", // } class TapGestureDetector extends StatefulWidget { @override diff --git a/lib/views/widgets/StatelessWidget/GestureDetector/node3_pan.dart b/lib/views/widgets/StatelessWidget/GestureDetector/node3_pan.dart index ab62bfe..d4989fa 100644 --- a/lib/views/widgets/StatelessWidget/GestureDetector/node3_pan.dart +++ b/lib/views/widgets/StatelessWidget/GestureDetector/node3_pan.dart @@ -9,11 +9,11 @@ import 'package:flutter/material.dart'; // "name": 'GestureDetector的Pan事件', // "priority": 3, // "subtitle": -// "【onPanDown】 : 按下回调 【Function(DragDownDetails)】\n" -// "【onPanEnd】 : 拖动结束 【Function(DragEndDetails)】\n" -// "【onPanStart】 : 开始拖动 【Function(DragStartDetails)】\n" -// "【onPanUpdate】 : 拖动更新 【Function(TapUpDetails)】\n" -// "【onPanCancel】 : 拖动取消 【Function()】", +// "【onPanDown】 : 按下回调 【GestureDragDownCallback】\n" +// "【onPanEnd】 : 拖动结束 【GestureDragEndCallback】\n" +// "【onPanStart】 : 开始拖动 【GestureDragStartCallback】\n" +// "【onPanUpdate】 : 拖动更新 【GestureDragUpdateCallback】\n" +// "【onPanCancel】 : 拖动取消 【GestureDragCancelCallback】", // } class PanGestureDetector extends StatefulWidget { @override diff --git a/lib/views/widgets/StatelessWidget/ListView/node1_base.dart b/lib/views/widgets/StatelessWidget/ListView/node1_base.dart index 457db7a..0d417a6 100644 --- a/lib/views/widgets/StatelessWidget/ListView/node1_base.dart +++ b/lib/views/widgets/StatelessWidget/ListView/node1_base.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; // "priority": 1, // "subtitle": // "【children】 : 子组件列表 【List】\n" -// "【padding】 : 点击事件 【EdgeInsetsGeometry】", +// "【padding】 : 内边距 【EdgeInsetsGeometry】", // } class CustomListView extends StatelessWidget { final data = [ diff --git a/lib/views/widgets/StatelessWidget/NotificationListener/node1_base.dart b/lib/views/widgets/StatelessWidget/NotificationListener/node1_base.dart new file mode 100644 index 0000000..87e932b --- /dev/null +++ b/lib/views/widgets/StatelessWidget/NotificationListener/node1_base.dart @@ -0,0 +1,65 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/8/14 +/// contact me by email 1981462002@qq.com +/// 说明: NotificationListener 220 0 通知监听器 可指定Notification子泛型T,监听该类型的变化。Flutter内置很多滑动的Notification,当然你也可以自定义Notification进行监听。 +// { +// "widgetId": 220, +// "name": "监听OverscrollIndicatorNotification", +// "priority": 1, +// "subtitle": "该通知之后在滑动到最顶和最底是回调,通过leading属性判断是顶部还是底部。另外通过notification#disallowGlow(),可以去除顶底滑动蓝色阴影", +// } + +class NotificationListenerDemo extends StatefulWidget { + @override + _NotificationListenerDemoState createState() => _NotificationListenerDemoState(); +} + +class _NotificationListenerDemoState extends State { + final data = List.generate(30, (i) => '第${i + 1}条'); + + @override + Widget build(BuildContext context) { + return Container( + height: 250, + child: NotificationListener( + onNotification: _onNotification, + child: CupertinoScrollbar( + child: ListView.separated( + itemBuilder: _buildItem, + itemCount: data.length, + separatorBuilder: (_,__)=>Divider(height: 5,), + ), + )), + ); + } + + bool _onNotification(OverscrollIndicatorNotification notification) { + if (notification.leading) { + notification.disallowGlow(); + Scaffold.of(context).showSnackBar(SnackBar( + content: Text('已滑到顶部'), + backgroundColor: Colors.blue, + duration: Duration(milliseconds: 200), + )); + } else { + notification.disallowGlow(); + Scaffold.of(context).showSnackBar(SnackBar( + content: Text('已滑到底部'), + duration: Duration(milliseconds: 200), + backgroundColor: Colors.blue, + )); + } + + return true; + } + + Widget _buildItem(BuildContext context, int index) { + return Container( + height: 50, + alignment: Alignment.center, + child: Text(data[index],style: TextStyle(color: Theme.of(context).primaryColor,fontSize: 18),), + ); + } +} diff --git a/lib/views/widgets/StatelessWidget/NotificationListener/node2_update.dart b/lib/views/widgets/StatelessWidget/NotificationListener/node2_update.dart new file mode 100644 index 0000000..40e0fa8 --- /dev/null +++ b/lib/views/widgets/StatelessWidget/NotificationListener/node2_update.dart @@ -0,0 +1,87 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/8/14 +/// contact me by email 1981462002@qq.com +/// 说明: NotificationListener 210 0 通知监听器 可指定Notification子泛型T,监听该类型的变化。Flutter内置很多滑动的Notification,当然你也可以自定义Notification进行监听。 +// { +// "widgetId": 220, +// "name": "监听ScrollUpdateNotification", +// "priority": 2, +// "subtitle": "在滑动过程中对滑动数据进行回调,你可以获取大量数据来进行操作。", +// } + +class NotificationListenerUpdate extends StatefulWidget { + @override + _NotificationListenerUpdateState createState() => + _NotificationListenerUpdateState(); +} + +class _NotificationListenerUpdateState + extends State { + final data = List.generate(30, (i) => '第${i + 1}条'); + + var _info = ''; + + @override + Widget build(BuildContext context) { + return Container( + height: 300, + child: Stack( + children: [ + Positioned(child: Padding( + padding: const EdgeInsets.only(left:8.0), + child: Text(_info), + )), + NotificationListener( + onNotification: _onNotification, + child: CupertinoScrollbar( + child: ListView.separated( + itemBuilder: _buildItem, + itemCount: data.length, + separatorBuilder: (_, __) => Divider( + height: 5, + ), + ), + )), + + ], + ), + ); + } + + bool _onNotification(ScrollUpdateNotification notification) { + + setState(() { + _info = 'axis------【${notification.metrics.axis}】------\n' + 'pixels------【${notification.metrics.pixels}】------\n' + 'atEdge------【${notification.metrics.atEdge}】------\n' + 'axisDirection------【${notification.metrics.axisDirection}】------\n' + 'extentInside------【${notification.metrics.extentInside}】------\n' + 'outOfRange------【${notification.metrics.outOfRange}】------\n' + 'minScrollExtent------【${notification.metrics.minScrollExtent}】------\n' + 'maxScrollExtent------【${notification.metrics.maxScrollExtent}】------\n' + 'viewportDimension------【${notification.metrics.viewportDimension}】------\n' + 'delta------【${notification.dragDetails?.delta}】------\n' + 'globalPosition------【${notification.dragDetails?.globalPosition}】------\n' + 'localPosition------【${notification.dragDetails?.localPosition}】------\n' + 'scrollDelta------【${notification.scrollDelta}】------\n' + 'depth------【${notification.depth}】------'; + + }); + + return true; + } + + Widget _buildItem(BuildContext context, int index) { + return Container( + height: 50, + alignment: Alignment.centerRight, + padding: EdgeInsets.only(right: 8), + child: Text( + data[index], + style: TextStyle(color: Theme.of(context).primaryColor, fontSize: 18), + ), + ); + } +} diff --git a/lib/views/widgets/StatelessWidget/PageStorage/node1_base.dart b/lib/views/widgets/StatelessWidget/PageStorage/node1_base.dart new file mode 100644 index 0000000..09e4931 --- /dev/null +++ b/lib/views/widgets/StatelessWidget/PageStorage/node1_base.dart @@ -0,0 +1,115 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/8/14 +/// contact me by email 1981462002@qq.com +/// 说明: PageStorage 210 0 页面存储器 可以将页面状态进行存储,在切页时可以保持状态。源码中在ScrollView、PageView、ExpansionTile等皆有应用。 +// { +// "widgetId": 210, +// "name": "PageStorage基本使用", +// "priority": 1, +// "subtitle": "【bucket】 : 存储区 【PageStorageBucket】\n" +// "【child】: 子组件 【Widget】\n" +// "上面切换界面初始化组件时并不会将状态重置。如上CountWidget,子组件需要在初始化时从存储器中读取状态,在改变状态时将状态量写入存储器。另外,如果使用MaterialApp已经内置了PageStorage,不过你也可以创建PageStorage。", +// } + +class PageStorageDemo extends StatefulWidget { + @override + _PageStorageDemoState createState() => _PageStorageDemoState(); +} + +class _PageStorageDemoState extends State { + int _pageIndex = 0; + final PageStorageBucket _bucket = PageStorageBucket(); + + @override + Widget build(BuildContext context) { + return Container( + height: 200, + child: Scaffold( + body: PageStorage( + child: _buildContentByIndex(), + bucket: _bucket, + ), + bottomNavigationBar: BottomNavigationBar( + elevation: 0, + backgroundColor: Colors.blueAccent.withAlpha(55), + currentIndex: _pageIndex, + onTap: (int index) { + setState(() { + _pageIndex = index; + }); + }, + items: [ + BottomNavigationBarItem( + icon: Icon(Icons.home), + title: Text('Home'), + ), + BottomNavigationBarItem( + icon: Icon(Icons.settings), + title: Text('Setting'), + ), + ], + ), + ), + ); + } + + Widget _buildContentByIndex() { + if (_pageIndex == 0) { + return CountWidget(key: PageStorageKey('CountWidget1')); + } + + if (_pageIndex == 1) { + return CountWidget(key: PageStorageKey('CountWidget2')); + } + + return ListView(); + } +} + +class CountWidget extends StatefulWidget { + CountWidget({Key key}) : super(key: key); + + @override + _CountWidgetState createState() => _CountWidgetState(); +} + +class _CountWidgetState extends State { + int _count = 0; + + @override + void initState() { + super.initState(); + _count = PageStorage.of(context)?.readState(context) as int ?? 0; + } + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.center, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('点击了$_count次'), + MaterialButton( + onPressed: _addCount, + child: Icon( + Icons.add, + color: Colors.white, + ), + color: Colors.green, + shape: CircleBorder( + side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)), + )) + ], + ), + ); + } + + void _addCount() { + setState(() { + _count++; + PageStorage.of(context)?.writeState(context, _count); + }); + } +} diff --git a/lib/views/widgets/StatelessWidget/SingleChildScrollView/node1_base.dart b/lib/views/widgets/StatelessWidget/SingleChildScrollView/node1_base.dart index 501935f..d6bc4fd 100644 --- a/lib/views/widgets/StatelessWidget/SingleChildScrollView/node1_base.dart +++ b/lib/views/widgets/StatelessWidget/SingleChildScrollView/node1_base.dart @@ -10,7 +10,7 @@ import 'package:flutter/material.dart'; // "priority": 1, // "subtitle": // "【child】 : 子组件 【Widget】\n" -// "【padding】 : 点击事件 【EdgeInsetsGeometry】", +// "【padding】 : 内边距 【EdgeInsetsGeometry】", // } class CustomSingleChildScrollView extends StatelessWidget { final data = [ diff --git a/lib/views/widgets/StatelessWidget/Text/node5_textDirection.dart b/lib/views/widgets/StatelessWidget/Text/node5_textDirection.dart index e7c74f2..b461332 100644 --- a/lib/views/widgets/StatelessWidget/Text/node5_textDirection.dart +++ b/lib/views/widgets/StatelessWidget/Text/node5_textDirection.dart @@ -10,7 +10,7 @@ import 'package:flutter/material.dart'; // "priority": 5, // "name": "文字方向与最大行数", // "subtitle": "【maxLines】 : 最大行数 【int】\n" -// "【【textDirection】 : 文字方向 【TextDirection】\n" +// "【textDirection】 : 文字方向 【TextDirection】\n" // "下面依次是:rtl、ltr ", // } class TextDirectionText extends StatelessWidget { diff --git a/lib/views/widgets/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart b/lib/views/widgets/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart index 2016c58..43ec71b 100644 --- a/lib/views/widgets/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart +++ b/lib/views/widgets/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart @@ -53,7 +53,7 @@ class ProUAGHP extends StatelessWidget { ), ), otherAccountsPictures: [ - FlutterLogo(colors: Colors.green), + FlutterLogo(textColor: Colors.green), ], onDetailsPressed: () { diff --git a/lib/views/widgets/exp/stateful_unit.dart b/lib/views/widgets/exp/stateful_unit.dart index b0ae18e..e96641f 100644 --- a/lib/views/widgets/exp/stateful_unit.dart +++ b/lib/views/widgets/exp/stateful_unit.dart @@ -140,3 +140,6 @@ export '../StatefulWidget/Scaffold/node1_base.dart'; export '../StatefulWidget/TabBarView/node1_base.dart'; export '../StatefulWidget/InputDecorator/node1_base.dart'; export '../StatefulWidget/EditableText/node1_base.dart'; +export '../StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart'; +export '../StatefulWidget/WidgetsApp/node1_base.dart' hide HomePage; +export '../StatefulWidget/WidgetInspector/node1_base.dart' hide HomePage; diff --git a/lib/views/widgets/exp/stateless_unit.dart b/lib/views/widgets/exp/stateless_unit.dart index fe813a0..edb9a71 100644 --- a/lib/views/widgets/exp/stateless_unit.dart +++ b/lib/views/widgets/exp/stateless_unit.dart @@ -179,4 +179,8 @@ export '../StatelessWidget/SimpleDialogOption/node1_base.dart'; export '../StatelessWidget/SnackBar/node1_base.dart'; export '../StatelessWidget/SnackBarAction/node1_base.dart'; +export '../StatelessWidget/PageStorage/node1_base.dart'; +export '../StatelessWidget/NotificationListener/node1_base.dart'; +export '../StatelessWidget/NotificationListener/node2_update.dart'; + diff --git a/lib/views/widgets/widgets_map.dart b/lib/views/widgets/widgets_map.dart index f480d85..c6a3f98 100644 --- a/lib/views/widgets/widgets_map.dart +++ b/lib/views/widgets/widgets_map.dart @@ -59,10 +59,32 @@ class WidgetsMap { return [ InputDecoratorDemo(), ]; + case "WidgetInspector": + return [ + WidgetInspectorDemo(), + ]; + case "PageStorage": + return [ + PageStorageDemo(), + ]; case "NotificationListener": + return [ + NotificationListenerDemo(), + NotificationListenerUpdate() + ]; + case "Scrollable": return [ ScrollableDemo(), ]; + case "CupertinoSlidingSegmentedControl": + return [ + CupertinoSlidingSegmentedControlDemo(), + ]; + case "WidgetsApp": + return [ + WidgetsAppDemo(), + ]; + case "EditableText": return [ EditableTextDemo(), @@ -449,7 +471,7 @@ class WidgetsMap { ]; case "MaterialApp": return [ - CustomMaterialApp(), + MaterialAppDemo(), ]; case "ClipOval": return [