新贵 Flutter InheritedWidget(9)上

作者 : 开心源码 本文共6156个字,预计阅读时间需要16分钟 发布时间: 2022-05-12 共186人阅读

在多层级的 StatefulWidget 进行传递数据是比较麻烦的事情,不过今天详情的
无论是前台还是 Android 开发,在组件化的今天我们都需要给出一个套数据在组件间传递的方案。
不过公告一下今天分享的数据传递方式并不是最理想数据传递方式随后还会详情其余。不过随着业务不多复杂我们传递数据

屏幕快照 2019-06-26 上午5.47.19.png

import 'package:flutter/material.dart';import 'pages/home_screen.dart';void main() {  runApp(    new HomeApp(),  );}class HomeApp extends StatelessWidget {  @override  Widget build(BuildContext context) {    // TODO: implement build    return new MaterialApp(title: 'Demo', home: new HomeScreen());  }}

上面的代码在普通不过,而后创立 HomeApp 页面来启动 HomeScreen 页面。下面是 HomeScreen 的主页面。HomeScreen 是一个 StatefulWidget 组件。

import 'package:flutter/material.dart';class HomeScreen extends StatefulWidget {  @override  State<StatefulWidget> createState() {    // TODO: implement createState    return _HomeScreenState();  }}class _HomeScreenState extends State<HomeScreen> {  @override  Widget build(BuildContext context) {    // TODO: implement build    return Scaffold(      appBar: AppBar(        title: Text("Flutter Inherited Widget Demo"),      ),      body: Container(        alignment: Alignment.center,        child: Column(          mainAxisAlignment: MainAxisAlignment.center,          crossAxisAlignment: CrossAxisAlignment.center,          children: <Widget>[                      ],        ),      ),    );  }}

随着详情 InheritedWidget 同时也给大家解释少量常用组件 Container 是容器组件,假如想让组件按列排列即可以用 Colum。mainAxisAlignment 表示按横向而 crossAxisAlignment 表示纵向上组件对齐的方式,他们会根据 Row 和 Colum 排列方式不同而不同?。?

children: <Widget>[            Text("Name: "),            SizedBox(              height: 20.0,            ),            RaisedButton(              child: Text("Add Name"),              onPressed: (){              },            )          ],

  openForm(BuildContext context) {    //Open form  }

点击按钮后调用 openForm 来打开一个表单页。继续创立一个 FormScreen 页面,这个页面相对复杂,需要花时间说明一下?。?

import 'package:flutter/material.dart';class FormScreen extends StatefulWidget {  @override  State<StatefulWidget> createState() {    // TODO: implement createState    return _FormScreenState();  }}class _FormScreenState extends State<FormScreen> {  String name;  final formKey = new GlobalKey<FormState>();  validateAndSave() {    if (formKey.currentState.validate()) {      formKey.currentState.save();      Navigator.pop(context);    } else {      print("validation Enter");    }  }  @override  Widget build(BuildContext context) {    // TODO: implement build    return Scaffold(      appBar: AppBar(        title: Text("Flutter Inherited Widget Demo"),      ),      body: Container(          alignment: Alignment.center,          child: Form(            key: formKey,            child: Padding(              padding: EdgeInsets.all(20.0),              child: Column(                mainAxisAlignment: MainAxisAlignment.center,                crossAxisAlignment: CrossAxisAlignment.center,                children: <Widget>[                  TextFormField(                    keyboardType: TextInputType.text,                    decoration: InputDecoration(labelText: "name"),                    validator: (val) => val.length == 0 ? "Enter Name" : null,                    onSaved: (val) => name = val,                  ),                  RaisedButton(                    child: Text("save"),                    onPressed: validateAndSave,                  )                ],              ),            ),          )),    );  }}

创立一个表单给 FormKey,给 key 是便于 element 可以通过 key 找到表单而不是仅仅根据类型来找到 element 对应 widge,这个随后给大家详情。
TextFormField 作为一个相对复杂常用表单组件通过 keyboardType 定义他的类型,validator 可以写其校验函数,也就是我们定义校验的规则,noSave 也就是当提交表单时候的函数?。
formKey.currentState.validate() 来判断能否校验通过,校验通过后会返回到 Screen 页面?

class User {  String name;  User({this.name});}

我们定义一个 User 类,作为数据模型。

import 'package:flutter/material.dart';import '../model/user.dart';class StateContainer extends StatefulWidget {  final Widget child;  final User user;  StateContainer(@required this.child, this.user);  static _StateContainerState of(BuildContext context) {    return (context.inheritFromWidgetOfExactType(InheritedStateContainer)            as InheritedStateContainer)        .data;  }  @override  State<StatefulWidget> createState() {    // TODO: implement createState    return _StateContainerState();  }}class _StateContainerState extends State<StateContainer> {  User user;  void updateUser({name}) {    if (user == null) {      user = User(name: name);      setState(() {        user = user;      });    } else {      setState(() {        user.name = name ?? user.name;      });    }  }  @override  Widget build(BuildContext context) {    // TODO: implement build    return InheritedStateContainer(      data: this,      child: widget.child,    );  }}class InheritedStateContainer extends InheritedWidget {  final _StateContainerState data;  InheritedStateContainer({    Key key,    @required this.data,    @required Widget child,  }) : super(key: key, child: child);  @override  bool updateShouldNotify(InheritedWidget oldWidget) {    // TODO: implement updateShouldNotify    return true;  }}
import 'package:flutter/material.dart';import 'pages/home_screen.dart';import 'pages/state_container.dart';void main() {  runApp(StateContainer(HomeApp(), null));}class HomeApp extends StatelessWidget {  @override  Widget build(BuildContext context) {    // TODO: implement build    return new MaterialApp(title: 'Demo', home: HomeScreen());  }}
import 'package:flutter/material.dart';import '../model/user.dart';import 'state_container.dart';class FormScreen extends StatefulWidget {  @override  State<StatefulWidget> createState() {    // TODO: implement createState    return _FormScreenState();  }}class _FormScreenState extends State<FormScreen> {  String name;  final formKey = new GlobalKey<FormState>();  validateAndSave() {    final container = StateContainer.of(context);    if (formKey.currentState.validate()) {      formKey.currentState.save();      container.updateUser(name: name);      Navigator.pop(context);    } else {      print("validation Enter");    }  }  @override  Widget build(BuildContext context) {    // TODO: implement build    return Scaffold(      appBar: AppBar(        title: Text("Flutter Inherited Widget Demo"),      ),      body: Container(          alignment: Alignment.center,          child: Form(            key: formKey,            child: Padding(              padding: EdgeInsets.all(20.0),              child: Column(                mainAxisAlignment: MainAxisAlignment.center,                crossAxisAlignment: CrossAxisAlignment.center,                children: <Widget>[                  TextFormField(                    keyboardType: TextInputType.text,                    decoration: InputDecoration(labelText: "name"),                    validator: (val) => val.length == 0 ? "Enter Name" : null,                    onSaved: (val) => name = val,                  ),                  RaisedButton(                    child: Text("save"),                    onPressed: validateAndSave,                  )                ],              ),            ),          )),    );  }}
import 'package:flutter/material.dart';import 'my_form.dart';import '../model/user.dart';import 'state_container.dart';class HomeScreen extends StatefulWidget {  @override  State<StatefulWidget> createState() {    // TODO: implement createState    return _HomeScreenState();  }}class _HomeScreenState extends State<HomeScreen> {  User user;  openForm(BuildContext context) {    //Open form    Navigator.push(        context,        MaterialPageRoute(            fullscreenDialog: true,            builder: (context) {              return FormScreen();            }));  }  @override  Widget build(BuildContext context) {    final container = StateContainer.of(context);    user = container.user;    // TODO: implement build    return Scaffold(      appBar: AppBar(        title: Text("Flutter Inherited Widget Demo"),      ),      body: Container(        alignment: Alignment.center,        child: Column(          mainAxisAlignment: MainAxisAlignment.center,          crossAxisAlignment: CrossAxisAlignment.center,          children: <Widget>[            user != null ? Text("Name: ${user.name}") : Text("No name"),            SizedBox(              height: 20.0,            ),            RaisedButton(              child: Text("Add Name"),              onPressed: () {                openForm(context);              },            )          ],        ),      ),    );  }}

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 新贵 Flutter InheritedWidget(9)上

发表回复