Commit f5855635 authored by 窦文's avatar 窦文

Merge branch 'master' of git.naiterui.com:zouzhisheng/netrain_flutter_app

parents 9524e4c1 bbbf4e98
......@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objectVersion = 51;
objects = {
/* Begin PBXBuildFile section */
......@@ -355,7 +355,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = K5YZT8RS9U;
DEVELOPMENT_TEAM = 4TYNTWZC9Y;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
......@@ -493,7 +493,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = K5YZT8RS9U;
DEVELOPMENT_TEAM = 4TYNTWZC9Y;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
......@@ -525,7 +525,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = K5YZT8RS9U;
DEVELOPMENT_TEAM = 4TYNTWZC9Y;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
......
/// 项目颜色配置
class AppColors{
/// 标题背景颜色
static const titleBackgroundColor = 0xffffffff;
/// 主色
static const mainColor = 0xff2893FF;
/// hint颜色
static const hintText = 0xffb4b4b4;
/// 输入框字体颜色
static const EditTextColor = 0xff333333;
/// 页面背景颜色
static const scaffoldBackgroundColor = 0xffffffff;
/// 分割线颜色
static const dividerColor = 0xffeeeeee;
/// 控件禁用时的颜色
static const disabledColor = 0xffdddddd;
}
\ No newline at end of file
......@@ -18,4 +18,7 @@ class Images{
static const ic_privacy = "${imagesPath}ic_privacy.png";
static const ic_sign = "${imagesPath}ic_sign.png";
static const ic_back_black = "${imagesPath}ic_back_black.png";
static const ic_login_button = "${imagesPath}login_button.png";
static const ic_doctor_avatar = "${imagesPath}ic_doctor_avatar.png";
static const lake = "${imagesPath}lake.png";
}
\ No newline at end of file
......@@ -5,6 +5,7 @@ import 'package:netrain_flutter_app/douwen/custom/BaseView.dart';
import 'package:netrain_flutter_app/douwen/custom/BaseViewModel.dart';
class Demo2 extends BaseView {
Demo2() : super(BaseViewModel()) {
builder = (context, value, child) => Container(
child: Column(
......@@ -36,7 +37,8 @@ class Demo2 extends BaseView {
],
)),
],
));
)
);
}
_item(String title, VoidCallback onPressed) {
......
......@@ -2,7 +2,7 @@ import 'package:flutter/widgets.dart';
import 'ViewState.dart';
class BaseViewModel with ChangeNotifier {
class BaseViewModel extends ChangeNotifier {
var _viewState;
var num = ValueNotifier<int>(0);
......
......@@ -31,14 +31,12 @@ class MyApp extends StatelessWidget {
),
initialRoute: "key1",
routes: <String, WidgetBuilder>{
"key1": (context) =>
Scaffold(
body: Scaffold(
"key1": (context) => Scaffold(
appBar: AppBar(
title: Text("这个是标题"),
),
body:Demo2(),
)),
body: Demo2(),
),
"key2": (context) => Second()
},
),
......
import 'package:flutter/material.dart';
import 'package:netrain_flutter_app/common/Images.dart';
import 'secondVC.dart';
class jssPageDemo extends StatelessWidget {
// const ({Key? key}) : super(key: key)
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("jss测试页面"),
),
body:Column(
children:[
ElevatedButton(
onPressed:() {
Navigator.of(context).push(MaterialPageRoute(
builder: (context){
return twoVCdemo();
},
settings: RouteSettings(
name: "我是传过去的名字",
arguments :"参数,是对象类型",
)
),
);
},
child: Text("点击进入下一页,页面传值与返回。"),
),
textDemo(),
buttonDemo(),
imageiconDemo(),
]
)
);
return Container(
child: Column(
children: [
textDemo(),
buttonDemo(),
imageiconDemo(),
],
)
);
}
}
class textDemo extends StatelessWidget {
// const ({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
color: Colors.blue,
child:Text (
"文本,我是个文本 woeijaoijfioasjfajfaojfoiasjfidsjfajf危机哦娃儿哦i啊就哦发i家阿减肥哦i阿减肥里挖掘佛i挖掘安抚啊发生放假啊师傅就撒就啊说",
maxLines: 10,
overflow: TextOverflow.ellipsis,
textDirection: TextDirection.ltr,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.orange,
),
),
);
}
}
class buttonDemo extends StatelessWidget {
// const ({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
children: [
RaisedButton(
onPressed: (){},
child:Text("漂浮按钮")
),
FlatButton(
onPressed: (){},
child: Text("扁平按钮")
),
FlatButton.icon(
onPressed: (){},
icon: Icon(Icons.outbound),
label: Text("按钮"),
color: Colors.black,
textColor: Colors.white,
),
OutlineButton(onPressed: (){},
child: Text("边框按钮"),
),
IconButton(
onPressed: (){},
icon: Icon(Icons.access_alarm),
)
],
);
}
}
class imageiconDemo extends StatelessWidget {
// const ({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
children: [
Icon(Icons.add),
IconButton(onPressed: (){}, icon: Icon(Icons.home)),
// Image.network("http://www.baidu.com/baidu.php?url=a00000KEJeCxDFezEVpFL9_MH8XSqbHklw_maA_-0O-JAG-gv2I-uvEAQqh-teALqpO_NZN1EbyMj5iOpf3Z1ZREUPx5_1lniEkZj6mijxFoM8VqoaPcH0KOxWwCyPbmri5Hlwk-A8u4pBUbGLW2x882fEua1eOAEbBWTdTqxEMA631a3yr2qBWOz88FPpAVsair-sXakr4y6eguntj86fZCDab3.DR_aOQZsYpb2glyIiUr2s1f_uQr1Fv20.U1Yk0ZDqVSXS_0KY5IissIpS_QMU8pi110KGUHY1PWT0Iybq0ZKGujYk0APGujY1rjc0mhbqn10k0AuY5H00TA6qn0KET1Ys0AFL5H00UMfqn0K1XWY0ThIYmyTqn0K8IM0qna3snj0snj0sn0K-ThTqn0KYTh7buHYdrH0knHm0mhwGujdKnWT1rj0sPHnLPYm1fHndrRmdrH64rjDkwjT3PHcsPsKbmvPb5fK9TdqGuAnqujcVmhwbX0KzIjY3P1T0TgKGujYs0Z7Wpyfqn0K9mWYsg100TZ0qn0KVIZ0qn0KbuAqs5H00ThCqn0KYIgnqnHT1P1DYnWD3P1nYP1RznWDYnW60mynqnfKsUWYs0ZK9I7qhUA7M5H00ugwGujYVnfK9TLKWm1Ys0ZNspy4Wm1Ys0AuWIgfqn0K9uAu_myTqnfKLuMFEUHY0mMfqnfKzug7Y5HDvnWRLnW64rHTvrjm0Tv-b5Hbsn16Lm179n1F9nHRvrj60ULfqn0KETMKY5H0WnaPDw-fWnansc10Wna3sc10WwDuRc10WwDuR0AVG5H00UgfqnWfkn0KVm1Ys0AdWgvuzUvYqn0Kbmy4dmhNxTAk9Uh-bT1Ys0A7bTgbqVSXS_0K9uZ7Y5H00pgPWUjYs0Z7VIjYs0A7bgLPEIgFWuHYsczn0mLFW5HRkrjcL",
// fit: BoxFit.fitWidth
// ),
Image.asset(Images.ic_my_info),
],
);
return Container(
);
}
}
import 'package:flutter/material.dart';
import 'package:netrain_flutter_app/common/Images.dart';
import 'thirdVC.dart';
class twoVCdemo extends StatelessWidget {
// const ({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("jssDemo第二个页面的标题"),
),
body: Column(
children: [
ElevatedButton(
child: Text("第二页面的按钮,跳转带参数过去"),
onPressed:() {
Navigator.of(context).push(MaterialPageRoute(
builder: (context){
return nextViewDemo();
},
settings: RouteSettings(
name: "我是传过去的",
arguments:"参数,是对象类型",
),
//是否有返回
maintainState: false,
//类似iOS ture 弹窗式推送界面 false 是push
fullscreenDialog: false,
),
);
},
),
Flex(direction:Axis.horizontal,
children: [
Image.asset(Images.ic_home_normal,alignment: Alignment.center,),
],
)
],
),
);
}
}
\ No newline at end of file
import 'dart:ffi';
import 'dart:html';
import 'package:flutter/material.dart';
class textDemo extends StatelessWidget {
// const ({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
color: Colors.blue,
child:Text (
"文本,我是个文本 woeijaoijfioasjfajfaojfoiasjfidsjfajf危机哦娃儿哦i啊就哦发i家阿减肥哦i阿减肥里挖掘佛i挖掘安抚啊发生放假啊师傅就撒就啊说",
maxLines: 10,
overflow: TextOverflow.ellipsis,
textDirection: TextDirection.ltr,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.orange,
),
),
);
}
}
class buttonDemo extends StatelessWidget {
// const ({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
children: [
RaisedButton(
onPressed: (){},
child:Text("漂浮按钮")
),
FlatButton(
onPressed: (){},
child: Text("扁平按钮")
),
FlatButton.icon(
onPressed: (){},
icon: Icon(Icons.outbound),
label: Text("按钮"),
color: Colors.black,
textColor: Colors.white,
),
OutlineButton(onPressed: (){},
child: Text("边框按钮"),
),
IconButton(
onPressed: (){},
icon: Icon(Icons.access_alarm),
)
],
);
}
}
class imageiconDemo extends StatelessWidget {
// const ({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
children: [
Icon(Icons.add),
IconButton(onPressed: (){}, icon: Icon(Icons.home)),
Image.network("http://www.baidu.com/baidu.php?url=a00000KEJeCxDFezEVpFL9_MH8XSqbHklw_maA_-0O-JAG-gv2I-uvEAQqh-teALqpO_NZN1EbyMj5iOpf3Z1ZREUPx5_1lniEkZj6mijxFoM8VqoaPcH0KOxWwCyPbmri5Hlwk-A8u4pBUbGLW2x882fEua1eOAEbBWTdTqxEMA631a3yr2qBWOz88FPpAVsair-sXakr4y6eguntj86fZCDab3.DR_aOQZsYpb2glyIiUr2s1f_uQr1Fv20.U1Yk0ZDqVSXS_0KY5IissIpS_QMU8pi110KGUHY1PWT0Iybq0ZKGujYk0APGujY1rjc0mhbqn10k0AuY5H00TA6qn0KET1Ys0AFL5H00UMfqn0K1XWY0ThIYmyTqn0K8IM0qna3snj0snj0sn0K-ThTqn0KYTh7buHYdrH0knHm0mhwGujdKnWT1rj0sPHnLPYm1fHndrRmdrH64rjDkwjT3PHcsPsKbmvPb5fK9TdqGuAnqujcVmhwbX0KzIjY3P1T0TgKGujYs0Z7Wpyfqn0K9mWYsg100TZ0qn0KVIZ0qn0KbuAqs5H00ThCqn0KYIgnqnHT1P1DYnWD3P1nYP1RznWDYnW60mynqnfKsUWYs0ZK9I7qhUA7M5H00ugwGujYVnfK9TLKWm1Ys0ZNspy4Wm1Ys0AuWIgfqn0K9uAu_myTqnfKLuMFEUHY0mMfqnfKzug7Y5HDvnWRLnW64rHTvrjm0Tv-b5Hbsn16Lm179n1F9nHRvrj60ULfqn0KETMKY5H0WnaPDw-fWnansc10Wna3sc10WwDuRc10WwDuR0AVG5H00UgfqnWfkn0KVm1Ys0AdWgvuzUvYqn0Kbmy4dmhNxTAk9Uh-bT1Ys0A7bTgbqVSXS_0K9uZ7Y5H00pgPWUjYs0Z7VIjYs0A7bgLPEIgFWuHYsczn0mLFW5HRkrjcL",
fit: BoxFit.fitWidth
),
Image.asset("ic_home_normal.png")
],
);
return Container(
);
}
}
import 'package:flutter/material.dart';
class nextViewDemo extends StatelessWidget {
// const nextViewDemo({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("jss测试第三界面"),
),
body: Column(
children: [
ElevatedButton(
onPressed: () {
Navigator.of(context).pop(
"我传过来值了,这是一个对象类型"
);
},
child: Text("点击返回传值"),
),
],
),
);
}
}
\ No newline at end of file
......@@ -21,7 +21,7 @@ class _LayoutGroupState extends State<LayoutPage> {
onTap: () {
Navigator.pop(context);
},
child: Icon(Icons.arrow_back),
child: Container(child: Icon(Icons.arrow_back)),
),
title: Text("layout学习"),
),
......
import 'package:flutter/material.dart';
class DoctorHomePage extends StatefulWidget {
@override
_DoctorHomePageState createState() => _DoctorHomePageState();
}
class _DoctorHomePageState extends State<DoctorHomePage>{
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container();
}
}
......@@ -13,8 +13,7 @@ class _HomePageState extends State {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
return Scaffold(
bottomNavigationBar: BottomNavigationBar(
backgroundColor: Colors.white,
selectedFontSize: 10,
......@@ -37,7 +36,6 @@ class _HomePageState extends State {
],
),
body: showBody(),
),
);
}
......
......@@ -16,15 +16,33 @@ class _RegisterState extends State {
final phoneController = TextEditingController();
final codeController = TextEditingController();
final passwordController = TextEditingController();
var isShowPassword = false;
var isShowClean = false;
final GlobalKey<FormState> _formKey = GlobalKey();
@override
Widget build(BuildContext context) {
// 获取上一个页面的传值
List<String> args = ModalRoute.of(context).settings.arguments;
void initState() {
super.initState();
phoneController.text = args.first;
/*nameController.addListener(() {
setState(() {});
});
phoneController.addListener(() {
setState(() {});
});
codeController.addListener(() {
setState(() {});
});*/
passwordController.addListener(() {
print("密码 ${passwordController.text}");
setState(() {
isShowClean = passwordController.text.isNotEmpty;
});
});
}
@override
Widget build(BuildContext context) {
return registerWidget();
}
......@@ -38,11 +56,7 @@ class _RegisterState extends State {
}
Widget registerWidget() {
return MaterialApp(
theme: ThemeData(
primaryColor: Colors.white,
),
home: Scaffold(
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_back),
......@@ -56,31 +70,149 @@ class _RegisterState extends State {
elevation: 0,
),
body: Container(
margin: EdgeInsets.fromLTRB(16, 16, 16, 0),
margin: EdgeInsets.fromLTRB(16, 0, 16, 0),
child: Form(
key:_formKey,
child: ListView(
children: [
_getTextField("请输入姓名",nameController),
_getTextField("请输入手机号码",phoneController),
Stack(children: [
_getTextField("请输入验证码",codeController),
// Positioned(child: )
],),
_getTextField("请输入9-16位密码",passwordController),
_getTextField(
TextInputType.text, "请输入姓名", nameController, 10, false),
_getTextField(
TextInputType.number, "请输入手机号码", phoneController, 11,
false),
Stack(
children: [
_getTextField(
TextInputType.number, "请输入验证码", codeController, 8,
false),
Positioned(
child: Text("获取验证码"),
right: 16,
top: 20,
)
],
),
_getPassWordField(),
Text(
"密码由9-16位大小写字母、数字加特殊符号组成",
style:
TextStyle(color: Color(AppColors.mainColor), fontSize: 12),
),
Container(
margin: EdgeInsets.only(top: 20),
height: 40,
child: ElevatedButton(
style: ButtonStyle(
backgroundColor:
MaterialStateProperty.resolveWith((states) {
if (states.contains(MaterialState.disabled)) {
return Color(AppColors.disabledColor);
}
return Color(AppColors.mainColor);
}),
),
child: Text(
"注册",
style: TextStyle(color: Colors.white),
),
onPressed: onRegisterClick),
)
],
))),
);
}
onRegisterClick() {
if(_formKey.currentState.validate()){
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("请求注册")));
}
}
/// 校验是否全部为空
bool checkIsAllEmpty() {
if (phoneController.text.isNotEmpty &&
nameController.text.isNotEmpty &&
codeController.text.isNotEmpty &&
passwordController.text.isNotEmpty) {
return false;
}
return true;
}
Widget _getPassWordField() {
TextFormField password = _getTextField(TextInputType.number, "请输入9-16位密码",
passwordController, 16, isShowPassword);
return Stack(
children: [
password,
Positioned(
right: 32,
top: 10,
child: Visibility(
visible: isShowClean,
child: IconButton(
icon: Icon(Icons.close),
onPressed: () {
setState(() {
passwordController.text = "";
});
}),
)),
Positioned(
right: 0,
top: 10,
child: Visibility(
visible: isShowClean,
child: IconButton(
icon: isShowPassword
? Icon(Icons.visibility_off)
: Icon(Icons.visibility),
onPressed: () {
setState(() {
isShowPassword = !isShowPassword;
// isShowPassword = !password.obscureText;
});
},
))),
],
);
}
/// 输入框
Widget _getTextField(String hintText,TextEditingController controller){
return TextField(
style: TextStyle(color: Color(AppColors.EditTextColor),fontSize: 16),
Widget _getTextField(TextInputType keyboardType, String hintText,
TextEditingController controller, int maxLength, bool isPassword) {
return TextFormField(
validator: (value) {
if(value.isEmpty){
return "${hintText}不能为空";
}else{
return null;
}
},
keyboardType: keyboardType,
obscureText: isPassword,
buildCounter: (context, {currentLength, isFocused, maxLength}) => null,
maxLength: maxLength,
autofocus: false,
// 自动获取焦点
decoration: InputDecoration(
labelStyle: TextStyle(height: 0.5),
//装饰
alignLabelWithHint: true,
contentPadding: EdgeInsets.only(top: 20, bottom: 10),
enabledBorder: UnderlineInputBorder(
// 默认状态的下划线边框
borderSide:
BorderSide(color: Color(AppColors.dividerColor), width: 0.5)),
focusedBorder: UnderlineInputBorder(
// 输入框获取焦点后
borderSide:
BorderSide(color: Color(AppColors.mainColor), width: 0.5)),
errorBorder: UnderlineInputBorder(
// 错误的时候
borderSide: BorderSide(color: Colors.red, width: 0.5)),
hintText: hintText,
hintStyle: TextStyle(color: Color(AppColors.hintText)),
// labelText: hintText.substring(3)
),
controller: controller,
);
......
......@@ -5,7 +5,7 @@ import 'package:netrain_flutter_app/laishanqi/mqtt/MqttClient.dart';
import 'package:netrain_flutter_app/laishanqi/netrain/Http/HttpUtil.dart';
import 'package:netrain_flutter_app/laishanqi/netrain/user/RegisterPage.dart';
import '../HomePage.dart';
import '../PharmacistHomePage.dart';
import '../../../common/Images.dart';
/// 登录页
......@@ -21,22 +21,20 @@ class _LoginState extends State<LoginPage> {
final codeController = TextEditingController();
@override
Widget build(BuildContext context) {
print("loginPage.dart initState");
void initState() {
super.initState();
var mqtt = MqttClient();
mqtt.connect();
HttpUtil.get(HttpUtil.global_config).then((Response value) {
Fluttertoast.showToast(msg: "global_config 请求成功 ");
});
}
return MaterialApp(
title: '登陆页',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Container(
alignment: Alignment.topCenter,
......@@ -136,7 +134,6 @@ class _LoginState extends State<LoginPage> {
),
),
),
),
);
}
......
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:netrain_flutter_app/xuehao/car_details.dart';
import 'package:netrain_flutter_app/common/AppColors.dart';
import 'package:netrain_flutter_app/xuehao/grid_page.dart';
import 'package:netrain_flutter_app/xuehao/list_page.dart';
import 'laishanqi/Stateful_page.dart';
......@@ -8,15 +11,22 @@ import 'laishanqi/layout_page.dart';
import 'laishanqi/netrain/user/loginPage.dart';
import 'laishanqi/netrain/user/RegisterPage.dart';
import 'laishanqi/photo.dart';
import 'zhangfeng/UserData.dart';
import 'zhangfeng/UserModel.dart';
import 'zhangfeng/LoginPage.dart';
import 'zhangfeng/CustomTabPage.dart';
import 'zhangfeng/TestPage.dart';
import 'zhangfeng/TabBarPage.dart';
import 'zhangfeng/LayoutDemo.dart';
import 'jishuaishuai/firstVC.dart';
void main() {
runApp(MyApp());
// runApp(Login());
// runApp(TestPage());
UserData.instance;
UserModel.getModel();
print("启动");
}
......@@ -29,7 +39,11 @@ class MyApp extends StatelessWidget {
title: 'Flutter Demo',
initialRoute: "main",
theme: ThemeData(
primarySwatch: Colors.blue,
primaryColor: Color(AppColors.titleBackgroundColor),
hintColor: Color(AppColors.hintText),
accentColor: Color(AppColors.mainColor),
dividerColor: Color(AppColors.dividerColor),
scaffoldBackgroundColor: Color(AppColors.scaffoldBackgroundColor),
visualDensity: VisualDensity.adaptivePlatformDensity,
),
routes: <String, WidgetBuilder>{
......@@ -40,14 +54,23 @@ class MyApp extends StatelessWidget {
"register": (context) => RegisterPage(),
"login": (context) => LoginPage(),
"listPage":(context) => List_Page(),
"loginRequest":(context) => LoginRequestPage(),
"CustomTabPage":(context) => TabBarPage(),
"LoginRequestPage":(context) => LoginRequestPage(),
"PageView":(context) => SampleAppPage(),
"LayoutDemo":(context) => LayoutDemo(),
"main": (context) => mainPage(),
"firstVC":(context) => jssPageDemo(),
"car_details":(context) =>CarDetailsPage(),
"student":(context) => jssPageDemo(),
"car_details":(context) =>CarDetailsPage(),
"grid_page":(context) =>GridPage()
},
),
onWillPop: () async {
Fluttertoast.showToast(msg: "退出");
return true;
});
}
}
......@@ -89,8 +112,14 @@ class _RouterNavigatorState extends State<RouterNavigator> {
_item("layout页面", LayoutPage(), 'layout'),
_item("拍照页面", PhotoApp(), 'photo'),
_item("登陆", LoginPage(), 'login'),
_item("登录网络请求", LoginRequestPage(), 'loginRequest'),
_item("登录网络请求", LoginRequestPage(), 'LoginRequestPage'),
_item("CustomTabPage",TabBarPage(),'CustomTabPage'),
_item("PageView",SampleAppPage(),'PageView'),
_item("LayoutDemo", LayoutDemo(), 'LayoutDemo'),
_item("listview页面",List_Page(),'listPage'),
_item("jssDemo", jssPageDemo(), 'firstVC'),
_item("jssDemo", jssPageDemo(), 'student'),
_item("gridView",GridPage(),'grid_page')
],
),
);
......@@ -111,3 +140,4 @@ class _RouterNavigatorState extends State<RouterNavigator> {
);
}
}
import 'package:flutter/material.dart';
import 'package:netrain_flutter_app/xuehao/Car.dart';
/**
* @author xuehao
* on 2021/7/9
*/
class CarDetailsPage extends StatefulWidget {
String name, imageUrl;
CarDetailsPage({Key key, @required this.name, @required this.imageUrl})
: super(key: key);
@override
_CarDetailsState createState() => _CarDetailsState(name, imageUrl);
_CarDetailsState createState() => _CarDetailsState();
}
class _CarDetailsState extends State<CarDetailsPage> {
String name, imageUrl;
_CarDetailsState(this.name, this.imageUrl);
Car args;
@override
Widget build(BuildContext context) {
args = ModalRoute.of(context).settings.arguments;
return MaterialApp(
title: "car_details",
home: Scaffold(
......@@ -37,9 +32,8 @@ class _CarDetailsState extends State<CarDetailsPage> {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(name),
SizedBox(height: 40),
Image.network(imageUrl),
Text(args.name),
Image.network(args.imageUrl),
],
),
),
......
import 'dart:ffi';
import 'package:flutter/material.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart';
/**
* @author xuehao
* on 2021/7/13
*/
class GridPage extends StatefulWidget {
GridPage({Key key}) : super(key: key);
@override
_GridPageState createState() => _GridPageState();
}
class _GridPageState extends State<GridPage> {
EasyRefreshController _controller = EasyRefreshController();
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "grid_page",
home: Scaffold(
appBar: AppBar(
title: Text("grid_page"),
),
body: EasyRefresh(
controller: _controller,
header: MaterialHeader(),
footer: PhoenixFooter(),
onRefresh: () async {
_refresh();
},
onLoad: () async {
_loadData();
},
child: GridView.builder(
///GridView配置项
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
//设置每行最大显示数量
crossAxisCount: 3,
//横轴间距
crossAxisSpacing: 2.0,
//主轴间距
mainAxisSpacing: 2.0,
//宽高比
childAspectRatio: 0.7,
),
itemCount: _datas.length,
itemBuilder: (context, index) {
return _itemWidget(_datas[index]);
},
),
),
),
);
}
List<String> _datas = [
"https://img1.baidu.com/it/u=4241162085,3588743387&fm=26&fmt=auto&gp=0.jpg",
"https://img1.baidu.com/it/u=4241162085,3588743387&fm=26&fmt=auto&gp=0.jpg",
"https://img1.baidu.com/it/u=4241162085,3588743387&fm=26&fmt=auto&gp=0.jpg",
"https://img1.baidu.com/it/u=4241162085,3588743387&fm=26&fmt=auto&gp=0.jpg",
"https://img1.baidu.com/it/u=4241162085,3588743387&fm=26&fmt=auto&gp=0.jpg",
"https://img1.baidu.com/it/u=4241162085,3588743387&fm=26&fmt=auto&gp=0.jpg",
"https://img1.baidu.com/it/u=4241162085,3588743387&fm=26&fmt=auto&gp=0.jpg",
"https://img1.baidu.com/it/u=4241162085,3588743387&fm=26&fmt=auto&gp=0.jpg",
"https://img1.baidu.com/it/u=4241162085,3588743387&fm=26&fmt=auto&gp=0.jpg",
"https://img1.baidu.com/it/u=4241162085,3588743387&fm=26&fmt=auto&gp=0.jpg",
"https://img1.baidu.com/it/u=4241162085,3588743387&fm=26&fmt=auto&gp=0.jpg",
"https://img1.baidu.com/it/u=4241162085,3588743387&fm=26&fmt=auto&gp=0.jpg",
];
Future<void> _refresh() async {
Future.delayed(Duration(seconds: 2), () async {
setState(() {
for (int i = 0; i < _datas.length; i++) {
_datas[i] =
"https://img2.baidu.com/it/u=1852546487,3301595200&fm=11&fmt=auto&gp=0.jpg";
}
_controller.finishRefresh(success: true);
});
});
}
Future<void> _loadData() async {
Future.delayed(Duration(seconds: 2), () async {
setState(() {
for (int i = 0; i < 10; i++) {
_datas.add("https://img1.baidu.com/it/u=4241162085,3588743387&fm=26&fmt=auto&gp=0.jpg");
}
_controller.finishLoad(success: true);
});
});
}
Widget _itemWidget(String src) {
return new Image.network(src, fit: BoxFit.cover);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:netrain_flutter_app/xuehao/car_details.dart';
import 'Car.dart';
class List_Page extends StatefulWidget {
......@@ -11,15 +9,10 @@ class List_Page extends StatefulWidget {
EasyRefreshController _controller = EasyRefreshController();
class _ListPageState extends State<List_Page> {
class _ListPageState extends State<List_Page> with WidgetsBindingObserver {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "listPage",
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
return new Scaffold(
appBar: AppBar(
title: Text("ListView"),
centerTitle: true,
......@@ -47,7 +40,9 @@ class _ListPageState extends State<List_Page> {
//返回数据条数
itemCount: datas.length,
//itemBuilder 需要返回一个Widget
itemBuilder: _getDatas,
itemBuilder: (context,index){
return _getDatas(index);
},
),
//刷新动作被触发
onRefresh: () async {
......@@ -58,11 +53,66 @@ class _ListPageState extends State<List_Page> {
loadData();
},
),
));
);
}
//定义一个全局的变量:模型数组
List<Car> datas = [
Car(
name: '保时捷918 Spyder',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-7d8be6ebc4c7c95b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '兰博基尼Aventador',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-e3bfd824f30afaac?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '法拉利Enzo',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-a1d64cf5da2d9d99?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: 'Zenvo ST1',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-bf883b46690f93ce?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '迈凯伦F1',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-5a7b5550a19b8342?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '萨林S7',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-2e128d18144ad5b8?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '科尼赛克CCR',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-01ced8f6f95219ec?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '布加迪Chiron',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-7fc8359eb61adac0?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '轩尼诗Venom GT',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-d332bf510d61bbc2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '西贝尔Tuatara',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-3dd9a70b25ae6bc9?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
)
];
///获取item视图
Widget _getDatas(BuildContext context, int position) {
Widget _getDatas(int position) {
return Container(
child: GestureDetector(
child: Card(
......@@ -85,15 +135,14 @@ class _ListPageState extends State<List_Page> {
),
onTap: () {
var data = datas[position];
Fluttertoast.showToast(msg: "我点击了${data.name}");
Navigator.push(context, new MaterialPageRoute(builder: (context) => new CarDetailsPage(name: data.name,imageUrl: data.imageUrl,)));
Navigator.pushNamed(context, "car_details", arguments: data);
},
));
}
///刷新数据
Future<void> refreshData() async {
await Future.delayed(Duration(seconds: 3), () {
await Future.delayed(Duration(seconds: 2), () {
setState(() {
for (int i = 0; i < datas.length; i++) {
datas[i].name = "刷新后的数据$i";
......@@ -105,7 +154,7 @@ class _ListPageState extends State<List_Page> {
///加载数据
Future<void> loadData() async {
await Future.delayed(Duration(seconds: 3), () {
await Future.delayed(Duration(seconds: 2), () {
setState(() {
for (int i = 0; i < 10; i++) {
datas.add(Car(
......@@ -119,56 +168,4 @@ class _ListPageState extends State<List_Page> {
}
}
//定义一个全局的变量:模型数组
List<Car> datas = [
Car(
name: '保时捷918 Spyder',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-7d8be6ebc4c7c95b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '兰博基尼Aventador',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-e3bfd824f30afaac?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '法拉利Enzo',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-a1d64cf5da2d9d99?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: 'Zenvo ST1',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-bf883b46690f93ce?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '迈凯伦F1',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-5a7b5550a19b8342?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '萨林S7',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-2e128d18144ad5b8?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '科尼赛克CCR',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-01ced8f6f95219ec?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '布加迪Chiron',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-7fc8359eb61adac0?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '轩尼诗Venom GT',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-d332bf510d61bbc2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
),
Car(
name: '西贝尔Tuatara',
imageUrl:
'https://upload-images.jianshu.io/upload_images/2990730-3dd9a70b25ae6bc9?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
)
];
import 'package:flutter/material.dart';
import 'package:netrain_flutter_app/common/Images.dart';
import 'CustomUnderlineTabIndicator.dart';
class CustomTabPage extends StatefulWidget{
@override
_CustomTabPageState createState() => _CustomTabPageState();
}
class _CustomTabPageState extends State<CustomTabPage> with TickerProviderStateMixin{
TabController _tabController;
PageController _pageController;
List<String> _titleList = <String>['关注','推荐', '抗疫', '热榜', '精品课', '旅游'];
List widgets = [];
@override
void initState() {
super.initState();
_tabController = TabController(vsync: this, length: _titleList.length);
_pageController = PageController();
for (int i = 0; i < 10; i++) {
widgets.add(getRow(i));
}
}
void _changeTab(int index) {
_pageController.animateToPage(index, duration: Duration(milliseconds: 300), curve: Curves.ease);
}
void _onPageChanged(int index) {
_tabController.animateTo(index, duration: Duration(milliseconds: 300));
}
@override
void dispose() {
_pageController.dispose();
_tabController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('自定义PageController', style: TextStyle(color: Colors.black54),),
backgroundColor: Colors.white,
brightness: Brightness.light,
elevation: 0,
iconTheme: IconThemeData(
color: Colors.black54
),
),
body: Column(
children: <Widget>[
Container(
width: double.infinity,
color: Colors.white,
padding: EdgeInsets.symmetric(vertical: 10, horizontal: 5),
height: 45,
child: TabBar(
labelColor: Colors.blue,
//选中的颜色
labelStyle: TextStyle(color: Colors.white, fontSize: 14),
unselectedLabelColor: Colors.black54,
//未选中的颜色
unselectedLabelStyle: TextStyle(
color: Colors.black54, fontSize: 14),
isScrollable: true,
//自定义indicator样式
indicator: CustomUnderlineTabIndicator(
borderSide: BorderSide(color: Colors.blue,width: 3),
insets: EdgeInsets.only(left: 50,right: 50,top: 0,bottom: -5),
),
controller: _tabController,
onTap: _changeTab,
tabs: _titleList.map((e) => Tab(text: e)).toList(),
),
),
Expanded(
child: PageView.builder(
physics: BouncingScrollPhysics(),
controller: _pageController,
onPageChanged: _onPageChanged,
itemCount: _titleList.length,
itemBuilder: (context, index) {
return PageItemView(index);
}
)
)
],
),
);
}
PageItemView(int index) {
return ListView.builder(
itemCount: widgets.length,
itemBuilder: (BuildContext context, int position) {
return getRow(position);
},
);
}
Widget getRow(int i) {
return GestureDetector(
child: Container(
padding: EdgeInsets.all(16),
child: Row(
children: [
Container(
child: Image(image: AssetImage(Images.ic_doctor_avatar)),
padding: EdgeInsets.only(right: 10),
),
Text("患者 $i"),
],
),
),
onTap: () {
setState(() {
widgets.add(getRow(widgets.length + 1));
print('row $i');
});
},
);
}
}
\ No newline at end of file
import 'package:flutter/material.dart';
///下划线两端圆角的实现,参考UnderlineTabIndicator,修改StrokeCap.square 为 StrokeCap.round
class CustomUnderlineTabIndicator extends Decoration {
/// Create an underline style selected tab indicator.
///
/// The [borderSide] and [insets] arguments must not be null.
const CustomUnderlineTabIndicator({
this.borderSide = const BorderSide(width: 2.0, color: Colors.white),
this.insets = EdgeInsets.zero,
})
: assert(borderSide != null),
assert(insets != null);
/// The color and weight of the horizontal line drawn below the selected tab.
final BorderSide borderSide;
/// Locates the selected tab's underline relative to the tab's boundary.
///
/// The [TabBar.indicatorSize] property can be used to define the
/// tab indicator's bounds in terms of its (centered) tab widget with
/// [TabIndicatorSize.label], or the entire tab with [TabIndicatorSize.tab].
final EdgeInsetsGeometry insets;
@override
Decoration lerpFrom(Decoration a, double t) {
if (a is UnderlineTabIndicator) {
return CustomUnderlineTabIndicator(
borderSide: BorderSide.lerp(a.borderSide, borderSide, t),
insets: EdgeInsetsGeometry.lerp(a.insets, insets, t),
);
}
return super.lerpFrom(a, t);
}
@override
Decoration lerpTo(Decoration b, double t) {
if (b is UnderlineTabIndicator) {
return CustomUnderlineTabIndicator(
borderSide: BorderSide.lerp(borderSide, b.borderSide, t),
insets: EdgeInsetsGeometry.lerp(insets, b.insets, t),
);
}
return super.lerpTo(b, t);
}
@override
_UnderlinePainter createBoxPainter([VoidCallback onChanged]) {
return _UnderlinePainter(this, onChanged);
}
}
class _UnderlinePainter extends BoxPainter {
_UnderlinePainter(this.decoration, VoidCallback onChanged)
: assert(decoration != null),
super(onChanged);
final CustomUnderlineTabIndicator decoration;
BorderSide get borderSide => decoration.borderSide;
EdgeInsetsGeometry get insets => decoration.insets;
Rect _indicatorRectFor(Rect rect, TextDirection textDirection) {
assert(rect != null);
assert(textDirection != null);
final Rect indicator = insets.resolve(textDirection).deflateRect(rect);
return Rect.fromLTWH(
indicator.left,
indicator.bottom - borderSide.width,
indicator.width,
borderSide.width,
);
}
@override
void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {
assert(configuration != null);
assert(configuration.size != null);
final Rect rect = offset & configuration.size;
final TextDirection textDirection = configuration.textDirection;
final Rect indicator = _indicatorRectFor(rect, textDirection).deflate(decoration.borderSide.width / 2.0);
final Paint paint = decoration.borderSide.toPaint()..strokeCap = StrokeCap.square;
canvas.drawLine(indicator.bottomLeft, indicator.bottomRight, paint);
}
}
\ No newline at end of file
import 'package:flutter/material.dart';
import 'package:netrain_flutter_app/common/Images.dart';
class LayoutDemo extends StatelessWidget {
LayoutDemo({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
// TODO: implement build
return MaterialApp(
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text("Layout Demo"),
),
body: new ListView(
children: [
new Image.asset(
Images.lake,
height: 240,
fit: BoxFit.cover,
),
titleSection,
buttonSection(),
textSection,
],
),
),
);
}
Widget titleSection = new Container(
padding: const EdgeInsets.all(32),
child: Row(
children: [
new Expanded(
child: new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
new Container(
padding: const EdgeInsets.only(bottom: 8),
child: new Text(
'Oeschine Lake Campground',
style: new TextStyle(
fontWeight: FontWeight.bold,
),
),
),
new Text(
'Kandersteg, Switzerland',
style: new TextStyle(
color: Colors.grey[500],
),
),
],
),
),
new Icon(
Icons.star,
color: Colors.red[500],
),
new Text('41'),
],
),
);
Widget buttonSection(){
return new Container(
child: new Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
buildButtonColumn(Icons.call, 'CALL'),
buildButtonColumn(Icons.near_me, 'ROUTE'),
buildButtonColumn(Icons.share, 'SHARE'),
],
),
);
}
Column buildButtonColumn(IconData icon, String label) {
Color color = Colors.blue;
return new Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
new Icon(icon, color: color),
new Container(
margin: const EdgeInsets.only(top: 8.0),
child: new Text(
label,
style: new TextStyle(
fontSize: 12.0,
fontWeight: FontWeight.w400,
color: color,
),
),
),
],
);
}
Widget textSection = new Container(
padding: const EdgeInsets.all(32),
child: new Text(
'''
Lake Oeschinen lies at the foot of the Blüemlisalp in the Bernese Alps. Situated 1,578 meters above sea level, it is one of the larger Alpine Lakes. A gondola ride from Kandersteg, followed by a half-hour walk through pastures and pine forest, leads you to the lake, which warms to 20 degrees Celsius in the summer. Activities enjoyed here include rowing, and riding the summer toboggan run.
''',
softWrap: true,
),
);
}
import 'Network/HttpManager.dart';
import 'Network/BaseHttpModel.dart';
import 'UserModel.dart';
import 'UserData.dart';
/// 所有接口类
class LoginApi {
......@@ -10,7 +9,8 @@ class LoginApi {
return HttpManager.getInstance().request('auth/oauth/token', parameters: param, onResult: (data,errorMsg){
BaseHttpModel httpModel = data;
UserModel userModel = UserModel.fromJson(httpModel.data);
UserData.getInstance().saveUserModel(userModel);
UserModel.saveModel(userModel);
print(UserModel.getModel().token);
if(onResult != null){
onResult(data, errorMsg);
}
......
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:netrain_flutter_app/zhangfeng/Network/HttpManager.dart';
import 'package:netrain_flutter_app/zhangfeng/UserModel.dart';
import 'LoginApi.dart';
import 'UserData.dart';
import 'package:netrain_flutter_app/common/Images.dart';
class LoginRequestPage extends StatefulWidget {
final String title = "登录页";
......@@ -13,8 +14,19 @@ class LoginRequestPage extends StatefulWidget {
class _LoginState extends State<LoginRequestPage> {
// This widget is the root of your application.
final phoneTextField = TextEditingController();
final pwdTextField = TextEditingController();
@override
void dispose() {
// Clean up the controller when disposing of the Widget.
phoneTextField.dispose();
pwdTextField.dispose();
super.dispose();
}
void _loginAction() {
if(UserData.instance.userModel != null && UserData.instance.userModel.token != null){
if(UserModel.getModel() != null){
Fluttertoast.showToast(msg:'已经登录');
return;
}
......@@ -35,7 +47,7 @@ class _LoginState extends State<LoginRequestPage> {
});
}
void _logoutAction() {
UserData.instance.removeUserModel();
UserModel.removeModel();
Fluttertoast.showToast(msg:'退出成功');
}
......@@ -47,15 +59,57 @@ class _LoginState extends State<LoginRequestPage> {
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FloatingActionButton(
Container(
child:Image(image: AssetImage(Images.logo_01)),
padding: EdgeInsets.only(top: 50,left: 50,right: 50),
),
Container(
padding: EdgeInsets.only(top: 100,left: 16,right: 16),
child: TextField(
controller: phoneTextField,
decoration: InputDecoration(hintText: "请输入手机号码",border: OutlineInputBorder(
borderRadius: BorderRadius.circular(30.0),
borderSide: BorderSide()),),
),
),
Container(
padding: EdgeInsets.only(top: 20,left: 16,right: 16),
child: TextField(
controller: pwdTextField,
decoration: InputDecoration(hintText: "请输入密码",border: OutlineInputBorder(
borderRadius: BorderRadius.circular(30.0),
borderSide: BorderSide()),
suffixIcon: IconButton(
icon: Icon(
Icons.clear,
color: Colors.black45,
),
onPressed: (){
pwdTextField.clear();
},
)
),
obscureText: true, //是否是密码
),
),
Container(
padding: EdgeInsets.only(top: 50,left: 0,right: 0),
child: TextButton(
child: Stack(
alignment: const Alignment(0.0, 0.0),
children: [
Image.asset(Images.ic_login_button),
Text("登录",style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.white,
)),
],
),
onPressed: _loginAction,
child:Icon(Icons.add),
),
FloatingActionButton(
onPressed: _logoutAction,
child:Icon(Icons.add),
),
],
),
......
import 'package:json_annotation/json_annotation.dart';
part 'NestModel.g.dart';
@JsonSerializable()
class NestModel{
final name;
final email;
final List<NestModel> childrens;
final NestModel nest;
NestModel(this.name, this.email, this.childrens,this.nest);
factory NestModel.fromJson(Map<String, dynamic> json) => _$NestModelFromJson(json);
Map<String, dynamic> toJson() => _$NestModelToJson(this);
}
\ No newline at end of file
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'NestModel.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
NestModel _$NestModelFromJson(Map<String, dynamic> json) {
return NestModel(
json['name'],
json['email'],
(json['childrens'] as List)
?.map((e) =>
e == null ? null : NestModel.fromJson(e as Map<String, dynamic>))
?.toList(),
json['nest'] == null
? null
: NestModel.fromJson(json['nest'] as Map<String, dynamic>),
);
}
Map<String, dynamic> _$NestModelToJson(NestModel instance) => <String, dynamic>{
'name': instance.name,
'email': instance.email,
'childrens': instance.childrens,
'nest': instance.nest,
};
......@@ -6,6 +6,7 @@ part 'BaseHttpModel.g.dart';
class BaseHttpModel{
final data;
final code;
@JsonKey(name:'message')
final msg;
BaseHttpModel(this.data, this.code, this.msg);
......
import 'dart:convert';
import 'package:flustars/flustars.dart';
class SaveModel {
// factory UserData() => getInstance();
// static UserData get instance => getInstance();
// static UserData _instance;
//
// static UserData getInstance() {
// if (_instance == null) {
// _instance = new UserData._internal();
// }
// return _instance;
// }
//
// UserData._internal() {
//
// }
static saveModel(dynamic model,String modelName) {
//将data转换成json字符串
var jsonStr = json.encode(model);
SpUtil.putString(modelName, jsonStr);
}
// 读取 SharedPreferences
static getModel(String modelName) {
final jsonStr = SpUtil.getString(modelName);
if(jsonStr != null && jsonStr.length > 0){
//先将json字符串转json
Map json = jsonDecode(jsonStr);
return json;
}
return null;
}
static removeModel(String modelName){
SpUtil.putString(modelName,"");
}
}
\ No newline at end of file
import 'dart:math';
import 'package:flutter/material.dart';
class ACETabBarIndicator extends Decoration {
// 指示器类型
final ACETabBarIndicatorType type;
// 指示器高度
final double height;
// 定长下划线类型时 指示器宽度
final double lineWidth;
// 指示器颜色
final Color color;
ACETabBarIndicator({this.type, this.height, this.lineWidth, this.color});
@override
BoxPainter createBoxPainter([onChanged]) => _ACETabBarIndicatorPainter(
this, type, height, lineWidth, color, onChanged);
}
class _ACETabBarIndicatorPainter extends BoxPainter {
final ACETabBarIndicator decoration;
ACETabBarIndicatorType type;
double height, lineWidth;
Color color;
_ACETabBarIndicatorPainter(this.decoration, this.type, this.height,
this.lineWidth, this.color, VoidCallback onChanged);
@override
void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {
Paint _paint = Paint()
..color = color ?? _kIndicatorColor
..style = PaintingStyle.fill
..strokeCap = StrokeCap.round;
double _height = height ?? _kIndicatorHeight;
double _width = lineWidth ?? _kIndicatorWidth;
// final Rect rect = offset & configuration.size;
switch (type) {
case ACETabBarIndicatorType.circle:
canvas.drawCircle(
Offset(offset.dx + (configuration.size.width) / 2,
configuration.size.height - _height),
_height,
_paint);
break;
case ACETabBarIndicatorType.triangle:
if (_height > configuration.size.height) _height = _kIndicatorHeight;
Path _path = Path()
..moveTo(offset.dx + (configuration.size.width) / 2 - _height,
configuration.size.height)
..lineTo(
_height * tan(pi / 6) +
offset.dx +
(configuration.size.width - _height) / 2,
configuration.size.height - _height)
..lineTo(
_height * tan(pi / 6) +
offset.dx +
(configuration.size.width + _height) / 2,
configuration.size.height);
canvas.drawPath(_path, _paint);
break;
case ACETabBarIndicatorType.rrect:
canvas.drawRRect(
RRect.fromRectAndRadius(
Rect.fromLTWH(offset.dx, offset.dy, configuration.size.width,
configuration.size.height),
Radius.circular(_kIndicatorAngle)),
_paint);
break;
case ACETabBarIndicatorType.rrect_inner:
canvas.drawRRect(
RRect.fromRectAndRadius(
Rect.fromLTWH(
offset.dx + height,
height - 1,
configuration.size.width - height * 2,
configuration.size.height - height * 2 - 2),
Radius.circular(_kIndicatorAngle)),
_paint);
break;
case ACETabBarIndicatorType.runderline:
canvas.drawLine(
Offset(offset.dx, configuration.size.height - height / 2),
Offset(offset.dx + configuration.size.width,
configuration.size.height - height / 2),
_paint..strokeWidth = height / 2);
break;
case ACETabBarIndicatorType.runderline_fixed:
if (_width > configuration.size.width)
_width = configuration.size.width / 3;
canvas.drawLine(
Offset(offset.dx + (configuration.size.width - _width) / 2,
configuration.size.height - height / 2),
Offset(offset.dx + (configuration.size.width + _width) / 2,
configuration.size.height - height / 2),
_paint..strokeWidth = height / 2);
break;
}
}
}
enum ACETabBarIndicatorType {
circle, // 实心圆点
triangle, // 上三角
rrect, // 圆角矩形(整个 Tab)
rrect_inner, // 圆角矩形(有内边距)
runderline, // 圆角下划线
runderline_fixed // 定长圆角下划线
}
// 指示器高度
const double _kIndicatorHeight = 6.0;
// 指示器宽度度
const double _kIndicatorWidth = 12.0;
// 指示器圆角
const double _kIndicatorAngle = 10.0;
// 指示器颜色
const Color _kIndicatorColor = Colors.redAccent;
\ No newline at end of file
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'TabBarIndicator.dart';
import 'package:netrain_flutter_app/common/Images.dart';
class TabBarPage extends StatefulWidget {
@override
_TabBarPageState createState() => new _TabBarPageState();
}
class _TabBarPageState extends State<TabBarPage>
with SingleTickerProviderStateMixin {
TabController _tabController;
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
void initState() {
super.initState();
_tabController = new TabController(vsync: this, length: 8);
}
@override
Widget build(BuildContext context) => DefaultTabController(
length: 4,
child: Scaffold(
appBar: AppBar(
title: Text('TabBar Page'),
bottom: TabBar(
tabs: <Widget>[
Tab(text: '今日爆款'),
Tab(text: '土货生鲜'),
Tab(text: '会员中心'),
Tab(text: '分类')
],
indicatorColor: Colors.black54,
indicatorSize: TabBarIndicatorSize.label,
isScrollable: true,
)),
body: TabBarView(children: <Widget>[
Center(child: PageItemView(0)),
Center(child: PageItemView(1)),
Center(child: PageItemView(2)),
Center(child: PageItemView(3))
])));
PageItemView(int index) {
return ListView.builder(
itemCount: 10,
itemBuilder: (BuildContext context, int position) {
return getRow(position);
},
);
}
Widget getRow(int i) {
return GestureDetector(
child: Container(
padding: EdgeInsets.all(16),
child: Row(
children: [
Container(
child: Image(image: AssetImage(Images.ic_doctor_avatar)),
padding: EdgeInsets.only(right: 10),
),
Text("患者 $i"),
],
),
),
onTap: () {
setState(() {
print('row $i');
});
},
);
}
// _tabBarView() => TabBarView(
// controller: _tabController,
// physics: NeverScrollableScrollPhysics(),
// // dragStartBehavior: DragStartBehavior.down,
// children: <Widget>[
// Center(child: Text('今日爆款')),
// Center(child: Text('土货生鲜')),
// Center(child: Text('会员中心')),
// Center(child: Text('分类')),
// Center(child: Text('今日爆款')),
// Center(child: Text('土货生鲜')),
// Center(child: Text('会员中心')),
// Center(child: Text('分类'))
// ]);
//
// _tabBarTop() => TabBar(tabs: <Widget>[
// Tab(text: '今日爆款'),
// Tab(text: '土货生鲜'),
// Tab(text: '会员中心'),
// Tab(text: '分类'),
// Tab(text: '今日爆款'),
// Tab(text: '土货生鲜'),
// Tab(text: '会员中心'),
// Tab(text: '分类')
// ], controller: _tabController);
//
// _tabBarBottom() => TabBar(
// indicatorColor: Colors.redAccent,
// indicatorWeight: 4,
// indicatorSize: TabBarIndicatorSize.label,
// indicatorPadding: EdgeInsets.all(5),
// labelColor: Colors.redAccent,
// labelStyle: TextStyle(color: Colors.green, fontSize: 16),
// labelPadding: EdgeInsets.all(4),
// unselectedLabelColor: Colors.white,
// unselectedLabelStyle: TextStyle(color: Colors.purpleAccent, fontSize: 14),
// dragStartBehavior: DragStartBehavior.down,
// indicator: ACETabBarIndicator(),
// isScrollable: true,
// tabs: <Widget>[
// Tab(text: '今日爆款'),
// Tab(text: '土货生鲜'),
// Tab(text: '会员中心'),
// Tab(
// child: Text('分类',
// style: TextStyle(color: Colors.black, fontSize: 18))),
// Tab(text: '今日爆款'),
// Tab(text: '土货生鲜'),
// Tab(text: '会员中心'),
// Tab(text: '分类')
// ],
// controller: _tabController);
}
\ No newline at end of file
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'dart:convert';
class SampleAppPage extends StatefulWidget{
SampleAppPage({Key key}) : super(key: key);
@override
_SampleAppPageState createState() => _SampleAppPageState();
}
class _SampleAppPageState extends State<SampleAppPage>{
final PageController _pageController = PageController();
@override
void dispose() {
_pageController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: PageView(
controller: _pageController,
children: <Widget>[
Container(
color: Colors.red,
child: Center(
child: ElevatedButton(
onPressed: () {
if (_pageController.hasClients) {
_pageController.animateToPage(
1,
duration: const Duration(milliseconds: 400),
curve: Curves.easeInOut,
);
}
},
child: const Text('Next'),
),
),
),
Container(
color: Colors.blue,
child: Center(
child: ElevatedButton(
onPressed: () {
if (_pageController.hasClients) {
_pageController.animateToPage(
0,
duration: const Duration(milliseconds: 400),
curve: Curves.easeInOut,
);
}
},
child: const Text('Previous'),
),
),
),
],
),
),
);
}
}
\ No newline at end of file
import 'dart:convert';
import 'UserModel.dart';
import 'package:shared_preferences/shared_preferences.dart';
class UserData {
UserModel userModel;
factory UserData() => getInstance();
static UserData get instance => getInstance();
static UserData _instance;
static UserData getInstance() {
if (_instance == null) {
_instance = new UserData._internal();
}
return _instance;
}
UserData._internal() {
// 初始化
getUserModel();
}
saveUserModel(UserModel userModel) async {
SharedPreferences pref= await SharedPreferences.getInstance();
//将data转换成json字符串
var jsonStr = json.encode(userModel);
pref.setString('UserModel',jsonStr);
this.userModel = userModel;
}
// 读取 SharedPreferences
getUserModel() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
final jsonStr = prefs.getString('UserModel');
if(jsonStr != null && jsonStr.length > 0){
//先将json字符串转json
Map json = jsonDecode(jsonStr);
//将json转model
final model = new UserModel.fromJson(json);
this.userModel = model;
}
}
removeUserModel() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('UserModel',"");
this.userModel = null;
}
}
\ No newline at end of file
import 'package:json_annotation/json_annotation.dart';
import 'package:netrain_flutter_app/zhangfeng/Network/SaveModel.dart';
part 'UserModel.g.dart';
@JsonSerializable()
class UserModel{
static UserModel sharedModelInstance_;
final token;
final header;
final tokenHead;
......@@ -13,4 +16,24 @@ class UserModel{
factory UserModel.fromJson(Map<String, dynamic> json) => _$UserModelFromJson(json);
Map<String, dynamic> toJson() => _$UserModelToJson(this);
static UserModel getModel(){
if(sharedModelInstance_ == null){
Map json = SaveModel.getModel('UserModel');
if(json != null){
sharedModelInstance_ = new UserModel.fromJson(json);
}
}
return sharedModelInstance_;
}
static removeModel() {
SaveModel.removeModel('UserModel');
sharedModelInstance_ = null;
}
static saveModel(UserModel userModel){
sharedModelInstance_ = userModel;
SaveModel.saveModel(userModel,'UserModel');
}
}
......@@ -42,6 +42,7 @@ dependencies:
dio: ^4.0.0 #网络库
convert: ^3.0.1 #转码器
pull_to_refresh: ^2.0.0
flustars: ^2.0.1 #强大的工具类库
shared_preferences: ^2.0.6
provider: ^4.1.0
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment