如何通过其他小部件 Flutter 设置状态小部件,简单代码如下

如何解决如何通过其他小部件 Flutter 设置状态小部件,简单代码如下

右侧小部件具有 gesterdetector,可将字符串(“ZzZ”)添加到列表; 左侧小部件通过列表视图构建器显示字符串列表中的所有字符串,

按下按钮后,右侧小部件将“ZzZ”添加到列表中成功它不设置用户界面状态... 在热重载后的 android studio 中,它显示所有添加的“ZzZ”

import 'package:Flutter/material.dart';

List<String> listofZzZ=[];

class homescreen extends StatefulWidget {
  @override
  _homescreenState createState() => _homescreenState();
}

class _homescreenState extends State<homescreen> {
  @override
  Widget build(BuildContext context) {
    return Material(
      child: Scaffold(
        body: Row(children: [
          Expanded(child:RightSidewidget()),Expanded(child:LeftSidewidget())
        ],)),);
  }
}

class RightSidewidget extends StatefulWidget {
  @override
  _RightSidewidgetState createState() => _RightSidewidgetState();
}
class _RightSidewidgetState extends State<RightSidewidget> {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
        child: Container(child:Text("add new ZzZ"),),**onTap: (){
          setState(() {
            listofZzZ.add("ZzZ");
          });},);**
  }
}

class LeftSidewidget extends StatefulWidget {
  @override
  _LeftSidewidgetState createState() => _LeftSidewidgetState();
}
class _LeftSidewidgetState extends State<LeftSidewidget> {
  @override
  Widget build(BuildContext context) {
    return Container(child:
      ListView.builder(
          itemCount: listofZzZ.length,itemBuilder: (context,index)=>Text(listofZzZ[index])),);
  }
}

解决方法

检查 Provider package 它可以帮助你实现你想要的,有一个 really good tutorial 由 Flutter 开发者展示如何使用管理你的应用程序的状态并通知小部件其他小部件的变化.

,

setState 以非常特殊的方式重建。你可以在这里阅读: https://api.flutter.dev/flutter/widgets/State/setState.html

在简单的世界 setState 中调用最近的构建(我认为这不完全正确,但这种直觉对我有用) 在您的代码中,当您点击右侧小部件并调用 setState 时,只会重建右侧小部件。

所以这是简单的解决方案: 使左右小部件无状态。 在行中的主屏幕中添加手势检测器(或像我的示例中的 textButton),并在此处调用 setState。当您这样做时,所有 homeSreen 也将重建左右小部件。你的清单将是实际的。示例如下:

List<String> ListOfZzZ = [];

class homescreen extends StatefulWidget {
  @override
  _homescreenState createState() => _homescreenState();
}

class _homescreenState extends State<homescreen> {
  @override
  Widget build(BuildContext context) {
    return Material(
      child: Scaffold(
          body: Row(
        children: [
          Expanded(
              child: TextButton(
                  onPressed: () => setState(() {
                        ListOfZzZ.add("ZzZ");
                      }),child: RightSidewidget())),Expanded(child: LeftSideWidget())
        ],)),);
  }
}

class RightSidewidget extends StatelessWidget {
  const RightSidewidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.amber[50],child: Text("add new ZzZ"),);
  }
}

class LeftSideWidget extends StatelessWidget {
  const LeftSideWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: ListView.builder(
          itemCount: ListOfZzZ.length,itemBuilder: (context,index) => Text(ListOfZzZ[index])),);
  }
}

较难但更优雅更好的方法是使用一些状态管理器,如 bloc。这是官方网站:https://bloclibrary.dev/#/gettingstarted 有很多教程和解释。但这不是5分钟的解决方案。

编辑:我用 BLoC 做了一些解决方案。我希望这会有所帮助。我在 7.0.1 版本中使用 flutter_bloc 和 equatable 包

void main() {
  EquatableConfig.stringify = kDebugMode;
  Bloc.observer = SimpleBlocObserver();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',theme: ThemeData(
        primarySwatch: Colors.blue,),home: Scaffold(
        appBar: AppBar(
          title: Text('myList'),body: BlocProvider(
          create: (context) => MylistBloc()..add(AddToList('Start')),child: Row(
            children: [
              Expanded(flex: 1,child: buttonsPanel()),Expanded(flex: 1,child: ListOfZzZ()),],);
  }
}

class ListOfZzZ extends StatefulWidget {
  const ListOfZzZ({Key? key}) : super(key: key);

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

class _ListOfZzZState extends State<ListOfZzZ> {
  late MylistBloc _mylistBloc;

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<MylistBloc,MylistState>(
      //builder: (context,state) {return ListView.builder(itemBuilder: (BuildContext context,int index){return  ListTile(title: state.positions[index];)},);},builder: (context,state) {
        if (state.positions.isEmpty) {
          return const Center(child: Text('no posts'));
        } else {
          return ListView.builder(
            itemBuilder: (BuildContext context,int index) {
              return ListTile(title: Text(state.positions[index]));
            },itemCount: state.positions.length,);
        }
      },);
  }
}

class buttonsPanel extends StatefulWidget {
  const buttonsPanel({Key? key}) : super(key: key);

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

class _buttonsPanelState extends State<buttonsPanel> {
  late MylistBloc _mylistBloc;

  @override
  void initState() {
    super.initState();
    _mylistBloc = context.read<MylistBloc>();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [
        TextButton(
            onPressed: () => {_mylistBloc.add(AddToList('Spam'))},child: Text('Spam')),TextButton(
            onPressed: () => {_mylistBloc.add(AddToList('Ham'))},child: Text('Ham')),);
  }
class SimpleBlocObserver extends BlocObserver {
  @override
  void onTransition(Bloc bloc,Transition transition) {
    super.onTransition(bloc,transition);
    print(transition);
  }

  @override
  void onError(BlocBase bloc,Object error,StackTrace stackTrace) {
    print(error);
    super.onError(bloc,error,stackTrace);
  }
}

class MylistState extends Equatable {
  final List<String> positions;
  final int lenght;
  const MylistState({this.positions = const <String>[],this.lenght = 0});

  @override
  List<Object> get props => [positions];

  @override
  String toString() => 'Lenght: {$lenght} Positions: {$positions}';

  @override
  MylistState copyWith(List<String>? positions) {
    return MylistState(positions: positions ?? this.positions);
  }
}


abstract class MylistEvent extends Equatable {
  const MylistEvent();

  @override
  List<Object> get props => [];
}

class AddToList extends MylistEvent {
  final String posToAdd;

  @override
  AddToList(this.posToAdd);
}


class MylistBloc extends Bloc<MylistEvent,MylistState> {
  MylistBloc() : super(MylistState(positions: const <String>[]));

  @override
  Stream<MylistState> mapEventToState(
    MylistEvent event,) async* {
    if (event is AddToList) {
      yield await _mapListToState(state,event.posToAdd);
    }
  }

  Future<MylistState> _mapListToState(
      MylistState state,String posToAdd) async {
    List<String> positions = [];
    positions.addAll(state.positions);
    positions.add(posToAdd);

    return MylistState(positions: positions,lenght: positions.length);
  }
}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?