widget.something 在有状态的小部件中

Posted

技术标签:

【中文标题】widget.something 在有状态的小部件中【英文标题】:widget.something in stateful widget 【发布时间】:2021-01-26 01:19:53 【问题描述】:
import 'package:duck/MoreAboutProduct.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class CategoryComponents extends StatelessWidget 
  final String NAME;
 CategoryComponents(
  this.NAME);

    @override
  Widget build(BuildContext context) 
    return Column(
     children:[
       Text($NAME),
       RaisedButton( 
child : Text(More Info),

onPressed:()

Navigator.of(context).push(MaterialPageRoute(builder: (context) 
    return MoreAboutProduct(
    NAMEp: NAME,


    ),
    ],);

我有一个名为 CategoryComponents 的类,在这个例子中它只有 1 个变量 'NAME',其他的类名为 Samsung 和 MoreAboutProduct,我将在下面的行中添加其他的代码,我想在 Samsung 中调用 CategoryComponents 类并传递 NAME 的值和其他值(为简单起见,在此示例中未显示其他值),我想在 Samsung 类中显示 NAME 的值,它们将是 CategoryComponents 类中的底部,它将我转移到 MoreAboutProduct 类并显示更多有关产品的信息,但某些数据必须仅用于第一个产品,这就是为什么我需要在三星和 MoreAboutProduct 之间建立连接,我找到了一种方法,但我确实在理解代码时遇到了一些问题,特别是 Navigator 部分以及变量如何在在Samsung 类的构造函数参数中传递的CategoryComponents 可以在MoreAboutProduct 类中访问吗?和 widget.NAME 部分,我知道这是一个很长的问题,但如果你想投反对票,请先给我一个答案。

import 'package:duck/MoreAboutProduct.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'CategoryComponents.dart';

class Samsung extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      key: _x,
      appBar: myAppbar("Samsung"),
      body: FutureBuilder(
        future: getData(),
        builder: (context, snapshot) 
          if (snapshot.hasData) 
            return ListView.builder(
                itemCount: snapshot.data.length,
                itemBuilder: (context, index) 
                  return CategoryComponents(
                    snapshot.data[index]['NAME']
);

这是三星类,它们是我传递的其他参数,但在这个例子中只有一个参数只是为了让你理解我的问题,这也是我使用 ListView.builder 的原因。

import 'package:duck/myAppbar.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'myCarousel.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

class MoreAboutProduct extends StatefulWidget 
  final String NAMEp;
MoreAboutProduct(
  this.NAMEp);

 @override
  _MoreAboutProductState createState() => _MoreAboutProductState();


class _MoreAboutProductState extends State<MoreAboutProduct> 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: ...,
      body: Column(
        children: [
         ...
          ),
          Expanded(
            child: Container(
              child: ListView.builder(
                itemCount: widget.snapshotLengthp,
                itemBuilder: (context, index) 
                  return Container(
                    child: Column(
                      children: [
                        SpecificationsDetails(context, 'NAME', widget.NAMEp),
....
],
),);,),),),),);

SpecificationsDetails 是负责样式的Function,不需要显示。

这里有一些示例运行:

This image is in Samsung class but Categorycomponents class is responsible for passing data to it and the styling

And this is in MoreAboutProduct class

【问题讨论】:

【参考方案1】:

您可以在应用中创建命名路由。

MaterialApp(
  // Start the app with the "/" named route. In this case, the app starts
  initialRoute: '/',
  routes: 
    '/': (context) => HomePage(),
    '/more_about_products': (context) => MoreAboutProduct(),
    
    '/samsung': (context) => Samsung(),
  ,
);

来自 Flutter 文档的代码。

在类别组件类中你可以有这样的东西:

 Navigator.of(context).pushNamed("/more_about_products", arguments = name: this.NAME);

之后,您可以使用 ModalRoute 在 MoreAboutProducts 中获取此参数,如下所示:

class _MoreAboutProductState extends State<MoreAboutProduct> 
  @override
  Widget build(BuildContext context) 

    final args = ModalRoute.of(context).settings.arguments;
    // to grab the **name** argument use ***args.name*** like in print function below.
    print(args.name)
    return Scaffold(
      appBar: ...,
      body: Column(
        children: [
         ...
          ),
          Expanded(
            child: Container(...etc code....

请阅读打印功能和 ModalRoute 之间的评论。

更多信息查看flutter named routes和passing the arguments to named routes

【讨论】:

以上是关于widget.something 在有状态的小部件中的主要内容,如果未能解决你的问题,请参考以下文章

Flutter ListView 与 List 中的小部件不会在应该更新时更新

从无状态小部件调用有状态小部件的 setState

在 Flutter 中使用 BLoC - 在有状态小部件与无状态小部件中的使用

如何在有状态或无状态小部件之外访问 BuildContext?

如何在有状态小部件之间传递随机数据?

在有状态小部件外部调用方法以使用颤振 Bloc 更新 UI