Флаттер - выкройка блока - PullRequest
0 голосов
/ 12 марта 2019

Если я установлю значение keyboardType: TextInputType.number в одном текстовом поле, я найду все остальные значения в null, прежде чем отправлять его, если я установлю его TextInputType.text, могу ли я найти правильные значения там, где я ошибаюсь?Я надеюсь, что кто-то может помочь мне.это мой код: bloc.dart

    import 'dart:async';
import 'package:gdgbloc/bloc_provider.dart';

import 'validator.dart';
import 'package:rxdart/rxdart.dart';

class Bloc extends Object with Validators implements BlocBase  {
  final _emailController = BehaviorSubject<String>();
  final _passwordController = BehaviorSubject<String>();
  final  _aliquotaIvaController = BehaviorSubject<String>();

  Function(String) get emailChanged => _emailController.sink.add;
  Function(String) get passwordChanged => _passwordController.sink.add;
  Function(String) get changeAliquotaIva => _aliquotaIvaController.sink.add;



 Stream<String> get email => _emailController.stream.transform(emailValidator);
  Stream<String> get password =>
      _passwordController.stream.transform(passwordValidator);
Stream<double> get aliquotaIva =>
      _aliquotaIvaController.stream.transform(validateCampoVuotoDouble);
  Stream<bool> get submitCheck =>
      Observable.combineLatest2(email, password, (e, p) => true);

  submit() {
    print("xyx");
    final validCodice = _emailController.value;
    final validDescrizione = _passwordController.value;
    final validAlquota= _aliquotaIvaController.value;

    print('Codice is $validCodice');
    print('Descrizione is $validDescrizione');
    print('aliquota iva is $validAlquota');
  }

  @override
  void dispose() {
    _emailController?.close();
    _passwordController?.close();
    _aliquotaIvaController?.close();
  }
}

blocprovider.dart

import 'package:flutter/material.dart';

Type _typeOf<T>() => T;

abstract class BlocBase {
  void dispose();
}

class BlocProvider<T extends BlocBase> extends StatefulWidget {
  BlocProvider({
    Key key,
    @required this.child,
    @required this.bloc,
  }): super(key: key);

  final Widget child;
  final T bloc;

  @override
  _BlocProviderState<T> createState() => _BlocProviderState<T>();

  static T of<T extends BlocBase>(BuildContext context){
    final type = _typeOf<_BlocProviderInherited<T>>();
    _BlocProviderInherited<T> provider = 
            context.ancestorInheritedElementForWidgetOfExactType(type)?.widget;
    return provider?.bloc;
  }
}

class _BlocProviderState<T extends BlocBase> extends State<BlocProvider<T>>{
  @override
  void dispose(){
    widget.bloc?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context){
    return new _BlocProviderInherited<T>(
      bloc: widget.bloc,
      child: widget.child,
    );
  }
}

class _BlocProviderInherited<T> extends InheritedWidget {
  _BlocProviderInherited({
    Key key,
    @required Widget child,
    @required this.bloc,
  }) : super(key: key, child: child);

  final T bloc;

  @override
  bool updateShouldNotify(_BlocProviderInherited oldWidget) => false;
}

main.dart

import 'package:flutter/material.dart';
import 'package:gdgbloc/bloc.dart';
import 'package:gdgbloc/bloc_provider.dart';
import 'package:gdgbloc/pagetwo.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home:HomePage(),
      theme: ThemeData(
        primarySwatch: Colors.teal,
      ),
      debugShowCheckedModeBanner: false,
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  HomePageState createState() => new HomePageState();
}

class HomePageState extends State<HomePage> {


  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        title: Text("Bloc Pattern"),
      ),
      body: SingleChildScrollView(
        child: Container(
          height: MediaQuery.of(context).size.height,
          padding: EdgeInsets.all(16)
      ),
    floatingActionButton: new FloatingActionButton(
        onPressed: () => {
              Navigator.push(context, MaterialPageRoute(builder: (context) {
                return BlocProvider<Bloc>(
                  bloc: Bloc(),
                  child: PageTwo(),
                );
              }))
            },
        mini: false,
        child: new Icon(Icons.add),
      ),
    );
  }
}

это страница, где я представляю три текстовых поля,pagetwo.dart

import 'package:flutter/material.dart';
import 'package:gdgbloc/bloc.dart';
import 'package:gdgbloc/bloc_provider.dart';

class PageTwo extends StatefulWidget {
  @override
  PageTwoState createState() => new PageTwoState();
}

class PageTwoState extends State<PageTwo> {
    final GlobalKey<ScaffoldState> _scaffoldKey =
        new GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    final bloc = BlocProvider.of<Bloc>(context);


    return Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        title: Text("Bloc Pattern"),
      ),
      body: SingleChildScrollView(
        child: Container(
          height: MediaQuery.of(context).size.height,
          padding: EdgeInsets.all(16),
          child: Column(
            mainAxisSize: MainAxisSize.max,
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              StreamBuilder<String>(
                stream: bloc.email,
                builder: (context, snapshot) => TextField(
                      onChanged: bloc.emailChanged,
                      keyboardType: TextInputType.emailAddress,
                      decoration: InputDecoration(
                          border: OutlineInputBorder(),
                          hintText: "Enter email",
                          labelText: "Email",
                          errorText: snapshot.error),
                    ),
              ),
              SizedBox(
                height: 20.0,
              ),
              StreamBuilder<String>(
                stream: bloc.password,
                builder: (context, snapshot) => TextField(
                      onChanged: bloc.passwordChanged,
                      keyboardType: TextInputType.text,
                      decoration: InputDecoration(
                          border: OutlineInputBorder(),
                          hintText: "Enter password",
                          labelText: "Password",
                          errorText: snapshot.error),
                    ),
              ),
              SizedBox(
                height: 20.0,
              ),
              StreamBuilder<double>(
                stream: bloc.aliquotaIva,
                builder: (context, snapshot) => TextField(
                      onChanged: bloc.changeAliquotaIva,
                      keyboardType: TextInputType.text,
                      decoration: InputDecoration(
                          border: OutlineInputBorder(),
                          hintText: "Ealiquoita",
                          labelText: "Password",
                          errorText: snapshot.error),
                    ),
              ),
              SizedBox(
                height: 20.0,
              ),
              StreamBuilder<bool>(
                //stream: bloc.submitCheck,
                builder: (context, snapshot) => RaisedButton(
                      color: Colors.tealAccent,
                      onPressed: () => bloc.submit() ,
                      child: Text("Submit"),
                    ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Я все еще в начале с флаттером и шаблоном блока.Помимо проблемы, связанной с тем, что я не могу получить значения текстового поля, я хотел знать, правильно ли я использую шаблон или какие изменения внести.Я надеюсь на некоторую помощь

Я также прикрепляю ссылку к полному примеру пример завершен

РЕДАКТИРОВАТЬ: я заметил, что если комментарий будет работать с KeyboardType, если вместо этого я его установлю,это больше не работает = (

...