Android 步进机内的数据采集器

Android 步进机内的数据采集器,android,ios,flutter,dart,static,Android,Ios,Flutter,Dart,Static,所以我对颤振还很陌生,这是我的第一个项目。一切都很顺利,直到这个问题出现。 最近,我在我的页面中添加了一个StepperBook,其中一个步骤应该集成了一个datePicker。不幸的是,我无法真正解决即将出现的问题。 我经常得到一个“只有静态成员才能在初始化器中访问”错误。 谢谢你的帮助 我正在使用flatter\u datetime\u picker插件 这是我的密码: class StepperBody extends StatefulWidget { @override _Ste

所以我对颤振还很陌生,这是我的第一个项目。一切都很顺利,直到这个问题出现。 最近,我在我的页面中添加了一个StepperBook,其中一个步骤应该集成了一个datePicker。不幸的是,我无法真正解决即将出现的问题。 我经常得到一个“只有静态成员才能在初始化器中访问”错误。 谢谢你的帮助

我正在使用flatter\u datetime\u picker插件

这是我的密码:

class StepperBody extends StatefulWidget {
  @override
  _StepperBodyState createState() =>  _StepperBodyState();
}

class _StepperBodyState extends State<StepperBody> {
  String _date = "Not set";
  int currStep = 0;
  static var _focusNode =  FocusNode();
  GlobalKey<FormState> _formKey =  GlobalKey<FormState>();
  static MyData data =  MyData();

  @override
  void initState() {
    super.initState();
    _focusNode.addListener(() {
      setState(() {});
      print('Has focus: $_focusNode.hasFocus');
    });
  }





  List<Step> steps = [
    Step(
        title: const Text('Name',
          style: TextStyle(
            fontFamily: 'Maax',
            fontSize: 20,
          ),),
        //subtitle: const Text('Enter your name'),
        isActive: true,
        //state: StepState.error,
        state: StepState.indexed,
        content: Form(
          key: formKeys[0],
          child: Column(
            children: <Widget>[
              TextFormField(
                style: TextStyle(
                  fontFamily: 'Maax',
                  fontWeight: FontWeight.w500,
                ),
                focusNode: _focusNode,
                keyboardType: TextInputType.text,
                autocorrect: false,
                onSaved: (String value) {
                  data.title = value;
                },
                maxLines: 1,
                //initialValue: 'Aseem Wangoo',
                validator: (value) {
                  if (value.isEmpty || value.length < 1) {
                    return 'Please enter title';
                  }
                },
                decoration:  InputDecoration(
                    labelText: 'What is the name of the test?',
                    hintText: 'Enter a name',
                    //filled: true,
                    icon: const FaIcon(FontAwesomeIcons.signature),
                    labelStyle:
                    TextStyle(decorationStyle: TextDecorationStyle.solid, fontFamily: 'Maax', fontWeight: FontWeight.w500)),
              ),
            ],
          ),
        )),
    Step(
        title: const Text('Date'),
        //subtitle: const Text('Subtitle'),
        isActive: true,
        //state: StepState.editing,
        state: StepState.indexed,
        content: Form(
          key: formKeys[1],
          child: Column(
            children: <Widget>[
              RaisedButton(
                shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(5.0)),
                elevation: 4.0,
                onPressed: () {
                  DatePicker.showDatePicker(context,
                      theme: DatePickerTheme(
                        containerHeight: 210.0,
                      ),
                      showTitleActions: true,
                      minTime: DateTime(2000, 1, 1),
                      maxTime: DateTime(2022, 12, 31), onConfirm: (date) {
                        print('confirm $date');
                        _date = '${date.year} - ${date.month} - ${date.day}';
                        setState(() {});
                      }, currentTime: DateTime.now(), locale: LocaleType.en);
                },
                child: Container(
                  alignment: Alignment.center,
                  height: 50.0,
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: <Widget>[
                      Row(
                        children: <Widget>[
                          Container(
                            child: Row(
                              children: <Widget>[
                                Icon(
                                  Icons.date_range,
                                  size: 18.0,
                                  color: Colors.teal,
                                ),
                                Text(
                                  " $_date",
                                  style: TextStyle(
                                      color: Colors.teal,
                                      fontWeight: FontWeight.bold,
                                      fontSize: 18.0),
                                ),
                              ],
                            ),
                          )
                        ],
                      ),
                      Text(
                        "  Change",
                        style: TextStyle(
                            color: Colors.teal,
                            fontWeight: FontWeight.bold,
                            fontSize: 18.0),
                      ),
                    ],
                  ),
                ),
                color: Colors.white,
              ),
              TextFormField(
                keyboardType: TextInputType.phone,
                autocorrect: false,
                validator: (value) {
                  if (value.isEmpty || value.length < 10) {
                    return 'Please enter valid number';
                  }
                },
                onSaved: (String value) {
                  data.days = value;
                },
                maxLines: 1,
                decoration:  InputDecoration(
                    labelText: 'Enter your number',
                    hintText: 'Enter a number',
                    icon: const Icon(Icons.phone),
                    labelStyle:
                    TextStyle(decorationStyle: TextDecorationStyle.solid)),
              ),
            ],
          ),
        )),
    Step(
        title: const Text('Email'),
        // subtitle: const Text('Subtitle'),
        isActive: true,
        state: StepState.indexed,
        // state: StepState.disabled,
        content:  Form(
          key: formKeys[2],
          child: Column(
            children: <Widget>[
              TextFormField(
                keyboardType: TextInputType.emailAddress,
                autocorrect: false,
                validator: (value) {
                  if (value.isEmpty || !value.contains('@')) {
                    return 'Please enter valid email';
                  }
                },
                onSaved: (String value) {
                  data.words = value;
                },
                maxLines: 1,
                decoration:  InputDecoration(
                    labelText: 'Enter your email',
                    hintText: 'Enter a email address',
                    icon: const Icon(Icons.email),
                    labelStyle:
                    TextStyle(decorationStyle: TextDecorationStyle.solid)),
              ),
            ],
          ),
        )),
    Step(
        title: const Text('Age'),
        // subtitle: const Text('Subtitle'),
        isActive: true,
        state: StepState.indexed,
        content:  Form(
          key: formKeys[3],
          child: Column(
            children: <Widget>[
              TextFormField(
                keyboardType: TextInputType.number,
                autocorrect: false,
                validator: (value) {
                  if (value.isEmpty || value.length > 2) {
                    return 'Please enter valid age';
                  }
                },
                maxLines: 1,
                onSaved: (String value) {
                  data.rep = value;
                },
                decoration:  InputDecoration(
                    labelText: 'Enter your age',
                    hintText: 'Enter age',
                    icon: const Icon(Icons.explicit),
                    labelStyle:
                    TextStyle(decorationStyle: TextDecorationStyle.solid)),
              ),
            ],
          ),
        )),
    //  Step(
    //     title: const Text('Fifth Step'),
    //     subtitle: const Text('Subtitle'),
    //     isActive: true,
    //     state: StepState.complete,
    //     content: const Text('Enjoy Step Fifth'))
  ];

  @override
  Widget build(BuildContext context) {
    void showSnackBarMessage(String message,
        [MaterialColor color = Colors.red]) {
      Scaffold
          .of(context)
          .showSnackBar( SnackBar(content:  Text(message)));
    }

    void _submitDetails() {
      final FormState formState = _formKey.currentState;

      if (!formState.validate()) {
        showSnackBarMessage('Please enter correct data');
      } else {
        formState.save();
        print("Name: ${data.title}");
        print("Phone: ${data.days}");
        print("Email: ${data.words}");
        print("Age: ${data.rep}");

        showDialog(
            context: context,
            child:  AlertDialog(
              title:  Text("Details"),
              //content:  Text("Hello World"),
              content:  SingleChildScrollView(
                child:  ListBody(
                  children: <Widget>[
                    Text("Name : " + data.title),
                    Text("Phone : " + data.days),
                    Text("Email : " + data.words),
                    Text("Age : " + data.rep),
                  ],
                ),
              ),
              actions: <Widget>[
                FlatButton(
                  child:  Text('OK'),
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                ),
              ],
            ));
      }
    }

    return  Container(
        child:  Form(
          key: _formKey,
          child:  ListView(children: <Widget>[
            Stepper(
              steps: steps,
              type: StepperType.vertical,
              currentStep: this.currStep,
              onStepContinue: () {
                setState(() {
                  if(formKeys[currStep].currentState.validate()) {
                    if (currStep < steps.length - 1) {
                      currStep = currStep + 1;
                    } else {
                      currStep = 0;
                    }
                  }
                  // else {
                  // Scaffold
                  //     .of(context)
                  //     .showSnackBar( SnackBar(content:  Text('$currStep')));

                  // if (currStep == 1) {
                  //   print('First Step');
                  //   print('object' + FocusScope.of(context).toStringDeep());
                  // }

                  // }
                });
              },
              onStepCancel: () {
                setState(() {
                  if (currStep > 0) {
                    currStep = currStep - 1;
                  } else {
                    currStep = 0;
                  }
                });
              },
              onStepTapped: (step) {
                setState(() {
                  currStep = step;
                });
              },
            ),
            RaisedButton(
              child:  Text(
                'Save details',
                style:  TextStyle(color: Colors.white),
              ),
              onPressed: _submitDetails,
              color: Colors.blue,
            ),

          ]),
        ));
  }
}
类StepperBody扩展StatefulWidget{
@凌驾
_StepherBodyState createState()=>U StepherBodyState();
}
类_StepperBodyState扩展状态{
字符串_date=“未设置”;
int currStep=0;
静态变量_focusNode=focusNode();
GlobalKey _formKey=GlobalKey();
静态MyData数据=MyData();
@凌驾
void initState(){
super.initState();
_focusNode.addListener(){
setState((){});
打印('Has focus:$\u focusNode.hasFocus');
});
}
列出步骤=[
台阶(
标题:常量文本('名称',
样式:TextStyle(
fontFamily:“Maax”,
尺寸:20,
),),
//字幕:常量文本(“输入您的姓名”),
是的,
//state:StepState.error,
状态:StepState.index,
内容:表格(
关键字:formKeys[0],
子:列(
儿童:[
TextFormField(
样式:TextStyle(
fontFamily:“Maax”,
fontWeight:fontWeight.w500,
),
focusNode:_focusNode,
键盘类型:TextInputType.text,
自动更正:错误,
onSaved:(字符串值){
data.title=值;
},
maxLines:1,
//初始值:“Aseem Wangoo”,
验证器:(值){
if(value.isEmpty | value.length<1){
返回“请输入标题”;
}
},
装饰:输入装饰(
labelText:“测试的名称是什么?”,
hintText:'输入名称',
//是的,
图标:const FaIcon(FontAwesomeIcons.signature),
标签样式:
TextStyle(decorationStyle:TextDecorationStyle.solid,fontFamily:'Maax',fontWeight:fontWeight.w500)),
),
],
),
)),
台阶(
标题:常量文本(“日期”),
//副标题:常量文本(“副标题”),
是的,
//状态:StepState.editing,
状态:StepState.index,
内容:表格(
key:formkey[1],
子:列(
儿童:[
升起的按钮(
形状:圆形矩形边框(
边界半径:边界半径。圆形(5.0)),
标高:4.0,
已按下:(){
DatePicker.showDatePicker(上下文,
主题:日期选取主题(
集装箱重量:210.0,
),
showttitleactions:对,
minTime:DateTime(2000,1,1),
maxTime:DateTime(2022,12,31),onConfirm:(日期){
打印(“确认$date”);
_日期=“${date.year}-${date.month}-${date.day}”;
setState((){});
},currentTime:DateTime.now(),locale:LocaleType.en);
},
子:容器(
对齐:对齐.center,
身高:50.0,
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
划船(
儿童:[
容器(
孩子:排(
儿童:[
图标(
Icons.date\u范围,
尺寸:18.0,
颜色:Colors.teal,
),
正文(
“$\u日期”,
样式:TextStyle(
颜色:Colors.teal,
fontWeight:fontWeight.bold,
字体大小:18.0),
),
],
),
)
],
),
正文(
“改变”,
样式:TextStyle(
颜色:Colors.teal,
fontWeight:fontWeight.bold,
字体大小:18.0),
),
],
),
),
颜色:颜色,白色,
),
TextFormField(
键盘类型:TextInputType.phone,
自动更正:错误,
验证器:(值){
if(value.isEmpty | | value.length<10){
返回“请输入有效数字”;
}
},
onSaved:(字符串值){
data.days=数值;
},
maxLines:1,
装饰:输入装饰(
labelText:“输入您的号码”,
hintText:'输入一个数字',
图标:常量图标(Icons.phone),
标签样式:
TextStyle(decorationStyle:TextDecorationStyle.solid)),
),
],
),
)),
台阶(
提尔
flutter_datetime_picker:
    git:
      url: https://github.com/derohimat/flutter_datetime_picker.git
@override
  Widget build(BuildContext context) {
    steps = [
      Step(
import 'package:flutter/material.dart';
import 'package:flutter_datetime_picker/flutter_datetime_picker.dart';

class MyData {
  String title;
  String days;
  String words;
  String rep;

  MyData({this.title, this.days, this.words, this.rep});
}

class StepperBody extends StatefulWidget {
  @override
  _StepperBodyState createState() => _StepperBodyState();
}

class _StepperBodyState extends State<StepperBody> {
  String _date = "Not set";
  int currStep = 0;
  static var _focusNode = FocusNode();
  GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  static MyData data = MyData();

  List<GlobalKey<FormState>> formKeys = [
    GlobalKey<FormState>(),
    GlobalKey<FormState>(),
    GlobalKey<FormState>(),
    GlobalKey<FormState>()
  ];
  List<Step> steps = [];

  @override
  void initState() {
    super.initState();
    _focusNode.addListener(() {
      setState(() {});
      print('Has focus: $_focusNode.hasFocus');
    });


  }

  @override
  Widget build(BuildContext context) {
    steps = [
      Step(
          title: const Text(
            'Name',
            style: TextStyle(
              fontFamily: 'Maax',
              fontSize: 20,
            ),
          ),
          //subtitle: const Text('Enter your name'),
          isActive: true,
          //state: StepState.error,
          state: StepState.indexed,
          content: Form(
            key: formKeys[0],
            child: Column(
              children: <Widget>[
                TextFormField(
                  style: TextStyle(
                    fontFamily: 'Maax',
                    fontWeight: FontWeight.w500,
                  ),
                  focusNode: _focusNode,
                  keyboardType: TextInputType.text,
                  autocorrect: false,
                  onSaved: (String value) {
                    data.title = value;
                  },
                  maxLines: 1,
                  //initialValue: 'Aseem Wangoo',
                  validator: (value) {
                    if (value.isEmpty || value.length < 1) {
                      return 'Please enter title';
                    }
                  },
                  decoration: InputDecoration(
                      labelText: 'What is the name of the test?',
                      hintText: 'Enter a name',
                      //filled: true,
                      icon: Icon(Icons.add),
                      labelStyle: TextStyle(
                          decorationStyle: TextDecorationStyle.solid,
                          fontFamily: 'Maax',
                          fontWeight: FontWeight.w500)),
                ),
              ],
            ),
          )),
      Step(
          title: const Text('Date'),
          //subtitle: const Text('Subtitle'),
          isActive: true,
          //state: StepState.editing,
          state: StepState.indexed,
          content: Form(
            key: formKeys[1],
            child: Column(
              children: <Widget>[
                RaisedButton(
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(5.0)),
                  elevation: 4.0,
                  onPressed: () {
                    DatePicker.showDatePicker(context,
                        theme: DatePickerTheme(
                          containerHeight: 210.0,
                        ),
                        showTitleActions: true,
                        minTime: DateTime(2000, 1, 1),
                        maxTime: DateTime(2022, 12, 31), onConfirm: (date) {
                          print('confirm $date');
                          _date = '${date.year} - ${date.month} - ${date.day}';
                          print('date ${_date}');
                          setState(() {});
                        }, currentTime: DateTime.now(), locale: LocaleType.en);
                  },
                  child: Container(
                    alignment: Alignment.center,
                    height: 50.0,
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: <Widget>[
                        Row(
                          children: <Widget>[
                            Container(
                              child: Row(
                                children: <Widget>[
                                  Icon(
                                    Icons.date_range,
                                    size: 18.0,
                                    color: Colors.teal,
                                  ),
                                  Text(
                                    " $_date",
                                    style: TextStyle(
                                        color: Colors.teal,
                                        fontWeight: FontWeight.bold,
                                        fontSize: 18.0),
                                  ),
                                ],
                              ),
                            )
                          ],
                        ),
                        Text(
                          "  Change",
                          style: TextStyle(
                              color: Colors.teal,
                              fontWeight: FontWeight.bold,
                              fontSize: 18.0),
                        ),
                      ],
                    ),
                  ),
                  color: Colors.white,
                ),
                TextFormField(
                  keyboardType: TextInputType.phone,
                  autocorrect: false,
                  validator: (value) {
                    if (value.isEmpty || value.length < 10) {
                      return 'Please enter valid number';
                    }
                  },
                  onSaved: (String value) {
                    data.days = value;
                  },
                  maxLines: 1,
                  decoration: InputDecoration(
                      labelText: 'Enter your number',
                      hintText: 'Enter a number',
                      icon: const Icon(Icons.phone),
                      labelStyle: TextStyle(
                          decorationStyle: TextDecorationStyle.solid)),
                ),
              ],
            ),
          )),
      Step(
          title: const Text('Email'),
          // subtitle: const Text('Subtitle'),
          isActive: true,
          state: StepState.indexed,
          // state: StepState.disabled,
          content: Form(
            key: formKeys[2],
            child: Column(
              children: <Widget>[
                TextFormField(
                  keyboardType: TextInputType.emailAddress,
                  autocorrect: false,
                  validator: (value) {
                    if (value.isEmpty || !value.contains('@')) {
                      return 'Please enter valid email';
                    }
                  },
                  onSaved: (String value) {
                    data.words = value;
                  },
                  maxLines: 1,
                  decoration: InputDecoration(
                      labelText: 'Enter your email',
                      hintText: 'Enter a email address',
                      icon: const Icon(Icons.email),
                      labelStyle: TextStyle(
                          decorationStyle: TextDecorationStyle.solid)),
                ),
              ],
            ),
          )),
      Step(
          title: const Text('Age'),
          // subtitle: const Text('Subtitle'),
          isActive: true,
          state: StepState.indexed,
          content: Form(
            key: formKeys[3],
            child: Column(
              children: <Widget>[
                TextFormField(
                  keyboardType: TextInputType.number,
                  autocorrect: false,
                  validator: (value) {
                    if (value.isEmpty || value.length > 2) {
                      return 'Please enter valid age';
                    }
                  },
                  maxLines: 1,
                  onSaved: (String value) {
                    data.rep = value;
                  },
                  decoration: InputDecoration(
                      labelText: 'Enter your age',
                      hintText: 'Enter age',
                      icon: const Icon(Icons.explicit),
                      labelStyle: TextStyle(
                          decorationStyle: TextDecorationStyle.solid)),
                ),
              ],
            ),
          )),
      //  Step(
      //     title: const Text('Fifth Step'),
      //     subtitle: const Text('Subtitle'),
      //     isActive: true,
      //     state: StepState.complete,
      //     content: const Text('Enjoy Step Fifth'))
    ];

    void showSnackBarMessage(String message,
        [MaterialColor color = Colors.red]) {
      Scaffold.of(context).showSnackBar(SnackBar(content: Text(message)));
    }

    void _submitDetails() {
      final FormState formState = _formKey.currentState;

      if (!formState.validate()) {
        showSnackBarMessage('Please enter correct data');
      } else {
        formState.save();
        print("Name: ${data.title}");
        print("Phone: ${data.days}");
        print("Email: ${data.words}");
        print("Age: ${data.rep}");

        showDialog(
            context: context,
            child: AlertDialog(
              title: Text("Details"),
              //content:  Text("Hello World"),
              content: SingleChildScrollView(
                child: ListBody(
                  children: <Widget>[
                    Text("Name : " + data.title),
                    Text("Phone : " + data.days),
                    Text("Email : " + data.words),
                    Text("Age : " + data.rep),
                  ],
                ),
              ),
              actions: <Widget>[
                FlatButton(
                  child: Text('OK'),
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                ),
              ],
            ));
      }
    }

    return Container(
        child: Form(
      key: _formKey,
      child: ListView(children: <Widget>[
        Stepper(
          steps: steps,
          type: StepperType.vertical,
          currentStep: this.currStep,
          onStepContinue: () {
            setState(() {
              if (formKeys[currStep].currentState.validate()) {
                if (currStep < steps.length - 1) {
                  currStep = currStep + 1;
                } else {
                  currStep = 0;
                }
              }
              // else {
              // Scaffold
              //     .of(context)
              //     .showSnackBar( SnackBar(content:  Text('$currStep')));

              // if (currStep == 1) {
              //   print('First Step');
              //   print('object' + FocusScope.of(context).toStringDeep());
              // }

              // }
            });
          },
          onStepCancel: () {
            setState(() {
              if (currStep > 0) {
                currStep = currStep - 1;
              } else {
                currStep = 0;
              }
            });
          },
          onStepTapped: (step) {
            setState(() {
              currStep = step;
            });
          },
        ),
        RaisedButton(
          child: Text(
            'Save details',
            style: TextStyle(color: Colors.white),
          ),
          onPressed: _submitDetails,
          color: Colors.blue,
        ),
      ]),
    ));
  }
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: "test",),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Expanded(child: StepperBody()),
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}