在初始化程序错误中只能访问静态成员

Posted

技术标签:

【中文标题】在初始化程序错误中只能访问静态成员【英文标题】:Only static members can be accessed in initializers error 【发布时间】:2020-08-31 13:01:19 【问题描述】:

您好,我正在尝试将信息从它所在的构造函数传递给小部件..

但它返回错误:

'在初始化器中只能访问静态成员'。

在这一行返回错误:

Upload(currentUsers: widget.currentUsers,),

我需要帮助

这是我的代码..

import 'package:curved_navigation_bar/curved_navigation_bar.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:junk_stores/Curved4/Notifications.dart';
import 'package:junk_stores/Curved4/Payments.dart';
import 'package:junk_stores/Curved4/profilePage.dart';
import 'dart:ui' as ui;
import 'package:junk_stores/Curved4/homeScreen.dart';
import 'package:junk_stores/Curved4/uploadPage.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:junk_stores/models/user.dart';
import 'package:junk_stores/pages/home.dart';
import 'package:junk_stores/pages/search.dart';
import 'package:junk_stores/pages/upload.dart';



class BottomNavbar extends StatefulWidget 
 final User currentUsers;
  BottomNavbar(@required this.currentUsers)
    print(currentUsers);
  
  @override
  _BottomNavbarState createState() => _BottomNavbarState();




class _BottomNavbarState extends State<BottomNavbar> 
  int _currentIndex = 0;

  final List<Widget> _children = [
      HomeS(),
      Search(),
      Upload(currentUsers: widget.currentUsers,), // the error is here
      Notifications(),//trending and notifications page
      Profile(),
     ];

  void onTappedBar (int index) 
         setState(() 
            _currentIndex = index;
         );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: _children[_currentIndex],
      bottomNavigationBar: CurvedNavigationBar(
        color: Colors.white,
        onTap : onTappedBar,
        buttonBackgroundColor: Colors.white,
        backgroundColor: Colors.purple[400],
        animationCurve: Curves.ease,
        animationDuration: Duration(milliseconds: 700),
        index: 0,
        height: MediaQuery.of(context).size.height * 0.07407407,//52 pixels
        items: <Widget>[

           ShaderMask(
            blendMode: BlendMode.srcIn,
            shaderCallback: (Rect bounds) 
              return ui.Gradient.linear(
                Offset(4.0, 24.0),
                Offset(24.0, 4.0),
                [
                Colors.red[600],
                Colors.purple,
                ],
              );
            ,
            child: Icon(
              FontAwesomeIcons.home,
              size: 24,

                 ),
           ),
           ShaderMask(
            blendMode: BlendMode.srcIn,
            shaderCallback: (Rect bounds) 
              return ui.Gradient.linear(
                Offset(4.0, 24.0),
                Offset(24.0, 4.0),
                [
                Colors.red[600],
                Colors.purple,
               ],
              );
            ,
            child: Icon(
               FontAwesomeIcons.search,
              size: 24,
                 ),
          ),
          ShaderMask(
            blendMode: BlendMode.srcIn,
            shaderCallback: (Rect bounds) 
              return ui.Gradient.linear(
                Offset(4.0, 24.0),
                Offset(24.0, 4.0),
                [
                 Colors.red[600],
                Colors.purple,
               ],
              );
            ,
            child: Icon(
              FontAwesomeIcons.plus,
              size: 24,
                 ),

         ),

         ShaderMask(
            blendMode: BlendMode.srcIn,
            shaderCallback: (Rect bounds) 
              return ui.Gradient.linear(
                Offset(4.0, 24.0),
                Offset(24.0, 4.0),
                [
                Colors.red[600],
                Colors.purple,
               ],
              );
            ,
            child: Icon(
              Icons.trending_up,
              size: 29,
                 ),

         ),

         ShaderMask(
            blendMode: BlendMode.srcIn,
            shaderCallback: (Rect bounds) 
              return ui.Gradient.linear(
                Offset(4.0, 24.0),
                Offset(24.0, 4.0),
                [
               Colors.red[600],
                Colors.purple,
               ],
              );
            ,
            child: Icon(
              FontAwesomeIcons.user,
              size: 24,
                 )

         )
        ],

      ),
    );
  

我曾尝试阅读其他解决方案,但我似乎不理解。我只是想将构造函数中的信息传递给 Upload Widget....................... ..................................................... ....................

这是我上传代码的顶部..

class Upload extends StatefulWidget 
  final User currentUsers;
  Upload(@required this.currentUsers)
    print(currentUsers);
  
@override
  _UploadState createState() => _UploadState();

class _UploadState extends State<Upload> 


 buildSplashSreen()
   return Scaffold(
     appBar: AppBar(

【问题讨论】:

你能发布你的“上传”代码吗? 好的... .......... 【参考方案1】:

在initstate之前你不能访问“widget”(widget.currentUsers)。

类似的东西:

class _BottomNavbarState extends State<BottomNavbar> 
  int _currentIndex = 0;

  List<Widget> _children;

  @override
  initState() 
   _children = [
      HomeS(),
      Search(),
      Upload(currentUsers: widget.currentUsers,),
      Notifications(),
      Profile(),
     ]
  

 ...

或者作为getter来做

List<Widget> get _children => [
      HomeS(),
      Search(),
      Upload(currentUsers: widget.currentUsers,),
      Notifications(),
      Profile(),
     ];

【讨论】:

嘿 axot.. 我尝试了这两种方法,但都没有成功......当我将列表置于初始化状态时,我无法在需要它的其余代码中访问 _children 我在变量声明前用“final”字弄错了。我编辑了它。你离开变量“List _children;”的声明了吗?在初始化状态之前?【参考方案2】:

试试这样:

MyWidget(currentUsers: someuser);

class MyWidget extends StatefulWidget 
  final User currentUsers;
  const MyWidget(Key key, this.currentUsers) : super(key: key);

  @override
  _MyWidgetState createState() => _MyWidgetState(this.currentUsers);


class _MyWidgetState extends State<MyWidget> 
  final User currentUsers;
  _MyWidgetState(this.currentUsers);

  @override
  Widget build(BuildContext context) 
    return Container(

    );
  

【讨论】:

嘿MB,我真的不知道如何在我的代码中实现这一点。请你使用我的例子

以上是关于在初始化程序错误中只能访问静态成员的主要内容,如果未能解决你的问题,请参考以下文章

C++面向对象-static、const

为啥会出现此错误:无法在初始化程序中访问实例成员'*'。”?

错误:实例成员 ... 无法在初始化程序中访问

错误分析:非静态成员引用必须与特定对象相对

为啥静态初始化程序中的 lambda 无法访问 VC++2013 中类的私有成员?

错误:无法在字段初始化程序中访问“this”以读取“_endeks”[重复]