Как избавиться от блока при использовании Inherited Widget?

function htmlEscape(str) {
    var stringval="";
    $.each(str, function (i, element) {
        alert(element);
        stringval += element
            .replace(/&/g, '&')
            .replace(/"/g, '"')
            .replace(/'/g, ''')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(' ', '-')
            .replace('?', '-')
            .replace(':', '-')
            .replace('|', '-')
            .replace('.', '-');
    });
    alert(stringval);
    return String(stringval);
}
1
задан Nudge 18 January 2019 в 03:36
поделиться

2 ответа

Это невозможно при использовании Inheritedwidget. Виджет создан не для обработки данных, а для обмена ими.

Вы должны заключить ваш унаследованный виджет в виджет Stateful и использовать его для удаления

0
ответ дан Rémi Rousselet 18 January 2019 в 03:36
поделиться

Чтобы добавить к ответу Реми, код будет выглядеть примерно так

import 'package:flutter/material.dart';

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 T bloc;
  final Widget child;

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

  static T of<T extends BlocBase>(BuildContext context){
    final type = _typeOf<BlocProvider<T>>();
    BlocProvider<T> provider = context.ancestorWidgetOfExactType(type);
    return provider.bloc;
  }

  static Type _typeOf<T>() => T;
}

class _BlocProviderState<T> extends State<BlocProvider<BlocBase>>{

  @override
  void dispose(){
    widget.bloc.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context){
    return widget.child;
  }
}

class Bloc implements BlocBase {

  final StreamController<bool> _changeColor = PublishSubject<bool>();

  Function(bool) get changeColour => _changeColor.sink.add;

  Stream<bool> get colour => _changeColor.stream;

  @override
  void dispose() {
    _changeColor.close();
  }

}


class _HomePageState extends State<HomePage> {
  Bloc bloc;
  var colour = false;

  @override
  void initState() {
    super.initState();
    bloc = BlocProvider.of<Bloc>(context);
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        RaisedButton(
          onPressed: () {
            if (colour) {
              bloc.changeColour(false);
              colour = false;
            } else {
              bloc.changeColour(true);
              colour = true;
            }
          },
          child: Text("Change colour"),
        ),
        StreamBuilder(
          builder: (context, snapshot) {
            var bool = snapshot?.data ?? false;
            return Text(
              "First text",
              style: TextStyle(color: bool ? Colors.red : Colors.green),
            );
          },
          stream: bloc?.colour,
        ),
      ],
    );
  }

  @override
  void dispose() {
    print("Bloc is disposed");
    bloc.dispose();
    super.dispose();
  }
}
0
ответ дан Nudge 18 January 2019 в 03:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: